Dans le premier article, j'indiquais comment configurer son compte Google pour
pouvoir recevoir des notifications par SMS.
Maintenant que cette partie est faite, nous allons pouvoir
entrer dans le vif du sujet et commencer à coder ce qui
déclenchera l'envoi du rappel par SMS pour vous tenir au
courant des mises à jour de votre site.
Je suppose donc que vous avez configuré tout ce qui est décrit dans le premier article "Côté Google", à savoir : un compte Google d'aide, le partage des agendas, et l'ajout des notifications par défaut.
Ok ? Allons-y !
Avant de rentrer dans le vif du sujet, mettons les choses à
plat : nous souhaitons juste ajouter des événements dans
l'agenda Google. Les événements seront mis avec une date dans
le futur de une minute, ce qui déclenchera l'envoi immédiat du
SMS de rappel.
Le bon côté des choses, c'est que Google fournit une API toute
faite pour manipuler ses données. Le mauvais côté, c'est qu'il
s'agit d'une bonne grosse usine à gaz...
Ce qui m'amène à rappeler les conditions :
- Un serveur web hébergeant PHP 5.2.4 ou supérieur ;
- Les extensions PHP suivantes : ctype, dom, libxml, spl, standard, openssl (normalement inclues par défaut dans la plupart des configurations, même gratuites).
Et comme on aime bien savoir où on va, voici le plan que je vais suivre :
- Télécharger l'API Google ;
- Configurer une page du serveur pour utiliser l'API ;
- Tester ;
- Insertion d'un événement ;
- Tester le final.
Rien de bien compliqué, on est parti !
1. Télécharger l'API Google
Rendez-vous sur
http://framework.zend.com/download/gdata
et téléchargez la dernière version de la librairie.
Décompressez le tout, et envoyez l'intégralité du dossier
library sur votre FTP (de façon à avoir un chemin du
type chemin/vers/library/Zend/, j'insiste sur la
présence du library dans l'arborescence.
Et voilà pour la première étape, on a connu pire.
2. Configurer une page du serveur pour utiliser l'API
Comme je le disais (et comme vous avez pu le constater en uploadant les fichiers), l'API est relativement lourde et il ne parait pas utile de l'inclure à chaque fois. Je vous conseille donc de créer une page notifier.php que vous inclurez quand vous souhaiterez communiquer avec Google.
Dans cette page, il va falloir inclure l'ensemble de l'API Google. Pour cela, il faut indiquer au serveur où se trouve la librairie : un peu comme la variable $PATH sous Linux en fait.
//1 : régler le chemin vers la librairie Google $clientLibraryPath = substr(__FILE__,0,strrpos(__FILE__,'/')) . '/library'; set_include_path(get_include_path() . PATH_SEPARATOR . $clientLibraryPath); //2 : charger les librairies require_once 'Zend/Loader.php';//Adresse connue grâce à l'ajout de la ligne précédente Zend_Loader::loadClass('Zend_Gdata'); Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); Zend_Loader::loadClass('Zend_Gdata_Calendar');
ATTENTION, ce code suppose que votre page notifier.php est au même niveau que votre dossier library/. Ajustez le code si nécessaire, mais pensez à utiliser un chemin absolu.
3. Tester
À ce point,
Google recommande de tester
pour vérifier si votre serveur est vraiment compatible.
Collez-donc à la suite de votre code le code suivant (sans le
<?php, évidemment)
le contenu de cette page.
Vous devriez obtenir le résultat suivant :
Si ce n'est pas le cas, effectuez les modifications demandées.
4. Insertion d'un événement
Parfait, ne reste plus qu'à insérer un élément. À l'aide de la documentation de Google Calendar, on arrive assez rapidement à créer le code correct que je détaille ici.
4.1. Connexion au compte Google
On touche ici à l'intérêt d'avoir crée un compte helper : il va falloir entrer en clair le mot de passe dans la page. Et pour ce genre de situations, mieux vaut n'offrir au hacker potentiel que votre compte inutile !
//3 : connexion
$user='This email address is being protected from spambots. You need JavaScript enabled to view it.';
$pass='mdp';
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user,$pass,$service);
4.2. Insertion de l'élément
Une fois connecté, reste à insérer un élément. On va se servir
de la fonction time() qui renvoie le
timestamp actuel
et de la fonction date() qui permet de formater ce
nombre à la manière voulue.
Il faut aussi préciser le fuseau horaire sur lequel on se
situe, "+01" en France.
//4 : Insertion de l'élément $start=time()+130; $startDate = date('Y-m-d',$start);//2009-11-23'; $startTime = date('H:i',$start); $tzOffset = '+01'; $gdataCal = new Zend_Gdata_Calendar($client); $newEvent = $gdataCal->newEventEntry(); $newEvent->title = $gdataCal->newTitle($notifTitre); $newEvent->content = $gdataCal->newContent($notifDesc); $when = $gdataCal->newWhen(); $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00"; $newEvent->when = array($when); $event = $gdataCal->insertEvent($newEvent);
(Bien évidemment, à vous de régler correctement les
variables $notifTitre et $notifDesc qui
contiennent respectivement le titre et la description de
l'évènement à ajouter.
Précisons que le titre ne doit pas dépasser 60 caractères
pour recevoir le SMS valide, et que la description ne sera
pas visible dans la notification.)
Normalement, vous devriez vous demander : pourquoi ce +130
dans le code ?
En fait, il faut ajouter au moins 60 secondes puisque la
notification sera déclenchée une minute avant l'évènement : si
on mettait la date exacte, le rappel ne serait pas envoyé.
À ces 60 secondes viennent s'ajouter 10 secondes "de latence",
qui prennent en compte la possibilité d'un lag du serveur
google / de votre serveur / des échanges réseaux : déjà 70
secondes.
Enfin, vous aurez remarqué que la définition de la date se
fait sans les secondes : en conséquence, si on en est à 59
secondes de la minute actuelle, on a 59 secondes de retard
pour l'évènement... et une nouvelle fois, la notification ne
sera pas envoyée car l'évènement n'est pas enregistré assez
loin dans le futur. Au final, 60 + 10 + 60 = 130.
J'ajoute que le deuxième 60 n'est pas utile dans tous les cas
(en théorie, on pourrait donc faire 130 - date('s'))
; c'est son utilisation qui fait que vous ne recevrez pas
instantanément le SMS (latence d'une minute).
5. Tester le final
Je vous conseille d'ajouter tout en haut de votre script la ligne suivante, qui vous permettra de réaliser des tests et aussi de vérifier la cohérence de vos appels :
//0 : Avant d'appeler le script, penser à préciser les variables //$notifTitre = 'Ttitre'; //$notifDesc='Description'; if(!isset($notifTitre) || !isset($notifDesc)) { if(!isset($_GET['test'])) exit('Paramétres mal spécifiés'); $notifTitre="(defaut)"; $notifDesc=''; }
Il ne vous reste plus qu'à appeler la page notifier.php?test pour tester votre réalisation... sous 90 secondes, vous devriez recevoir votre SMS. Alors, on dit merci qui ?
Code complet
Pour les fainéants, voici l'intégralité du code :
newEventEntry(); $newEvent->title = $gdataCal->newTitle($notifTitre); //$newEvent->where = array($gdataCal->newWhere($where)); $newEvent->content = $gdataCal->newContent($notifDesc); $when = $gdataCal->newWhen(); $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00"; $newEvent->when = array($when); $event = $gdataCal->insertEvent($newEvent);
Je vous laisse connecter cette page avec votre fonction d'ajout d'article / de commentaire : il suffit de régler les deux $notif et d'inclure la page.