Script PHP pour envoyer un ping avec XML-RPC

Après l’ajout des fils Atom, Atom 1.0 et RSS 2.0 je me suis dit qu’il était temps de faire connaître ce journal auprès de services tels que Weblogs.com, blo.gs, Technorati ou encore Ping-o-Matic! en leur envoyant un ping à chaque fois qu’un article est publié ou modifié, ce qui correspond aux modifications des fils.

Pour cela je me suis penché sur l’interface XML-RPC (Remote Procedure Calling). Cet article n’est pas un tutoriel sur XML-RPC mais en décrit une utilisation en PHP pour envoyer des pings avec la méthode weblogUpdates.ping.

Exemple de requête XML-RPC

POST / HTTP/1.0
User-Agent: sebastienguillon.com
Host: rpc.pingomatic.com
Content-Type: text/xml
Content-length: 277
 
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
  <methodName>weblogUpdates.ping</methodName>
  <params>
    <param>
      <value>Sébastien Guillon</value>
    </param>
    <param>
      <value>http://sebastienguillon.com/journal</value>
    </param>
  </params>
</methodCall>

Référez-vous à la spécification pour comprendre les détails de la construction XML.

Sur la partie HTTP de la requête, la spécification est plutôt stricte :

  • Les champs User-Agent et Host doivent être renseignés.
  • Le type de contenu (Content-Type) est text/xml.
  • Le champ Content-Length doit être renseigné et la valeur doit être correcte.

Je ne connais pas de service qui renvoie une erreur si vous oubliez de renseigner le champ User-Agent. Mais par précaution j’ai mis sebastienguillon.com. Changez-le à votre fantaisie.

Le script PHP

Afficher / Masquer le script
  1. <?php
  2. function weblogUpdates_ping($blog_title, $blog_url, $rpc_host, $rpc_page='/', $rpc_port='80')
  3. {
  4. $xml_rpc = '<?xml version="1.0" encoding="utf-8"?>'."\r\n";
  5. $xml_rpc .= '<methodCall>'."\r\n";
  6. $xml_rpc .= ' <methodName>weblogUpdates.ping</methodName>'.
    "\r\n";
  7. $xml_rpc .= ' <params>'."\r\n";
  8. $xml_rpc .= ' <param>'."\r\n";
  9. $xml_rpc .= ' <value>'.$blog_title.'</value>'."\r\n";
  10. $xml_rpc .= ' </param>'."\r\n";
  11. $xml_rpc .= ' <param>'."\r\n";
  12. $xml_rpc .= ' <value>'.$blog_url.'</value>'."\r\n";
  13. $xml_rpc .= ' </param>'."\r\n";
  14. $xml_rpc .= ' </params>'."\r\n";
  15. $xml_rpc .= '</methodCall>'."\r\n";
  16.  
  17. $xml_rpc_length = strlen($xml_rpc);
  18.  
  19. $http_request = 'POST '.$rpc_page.' HTTP/1.0'."\r\n";
  20. $http_request .= 'User-Agent: sebastienguillon.com'."\r\n";
  21. $http_request .= 'Host: '.$rpc_host."\r\n";
  22. $http_request .= 'Content-Type: text/xml'."\r\n";
  23. $http_request .= 'Content-length: '.$xml_rpc_length."\r\n\r\n";
  24. $http_request .= $xml_rpc."\r\n";
  25.  
  26. /* Décommentez la ligne suivante pour afficher la requête XML-RPC */
  27. //echo '<p>Requête XML-RPC :</p><pre>'.htmlentities($http_request).'</pre>';
  28.  
  29. $theSock = fsockopen($rpc_host, $rpc_port);
  30. if($theSock)
  31. {
  32. fwrite($theSock,$http_request);
  33. stream_set_blocking($theSock,1);
  34.  
  35. while(!feof($theSock))
  36. {
  37. $buf .= fgets($theSock,128);
  38. }
  39. fclose($theSock);
  40. /* Décommentez la ligne suivante pour afficher la réponse du serveur */
  41. //echo '<p>Réponse XML-RPC :</p>'."\r\n\r\n".'<pre>'.htmlentities($buf).'</pre>';
  42. }
  43. }
  44. ?>

Le script PHP a trois volets : la construction du corps de la requête en XML et la construction puis l’envoi de la requête HTTP.

La structure XML doit être construite en premier pour qu'on puisse indiquer la longueur de la chaîne dans le champ Content-length

Les paramètres de la fonction weblogUpdates_ping

blog_title
Le titre du blog qui envoie le ping.
blog_url
L’URI du blog qui envoie le ping.
rpc_host
le nom de domaine du service à contacter (ex : rpc.pingomatic.com).
rpc_page
Optionnel. Par défaut la racine ('/') sera utilisée. Weblogs.com utilise /RPC2.
rpc_port
Optionnel. La valeur par défaut est le port 80, utilisé communément par les serveurs web pour recevoir les requêtes HTTP. Mais j’ai déjà vu un service qui utilisait un autre port, ce qui est tout à fait acceptable.

Exemples d’utilisation de la fonction weblogUpdates_ping()

  • weblogUpdates_ping('Sébastien Guillon', 'http://sebastienguillon.com/journal', 'rpc.pingomatic.com');
  • weblogUpdates_Ping('Sébastien Guillon', 'http://sebastienguillon.com/journal', 'rpc.weblogs.com', '/RPC2');

Télécharger le script PHP :

Mise à jour : MonsieurN vous explique comment simplifier le script à l'aide du module expérimental XML-RPC de PHP.

← article précédentarticle suivant →

Les commentaires pour cet article sont fermés.