API

L’API de Seenthis est en plein développement.

La méthode retenue est l’Atom Publishing Protocol. Pour une présentation : http://www.bortzmeyer.org/5023.html.

Voici un code PHP qui, en utilisant CURL, provoque la publication d’un message sur le flux de l’auteur identifié par $login et $pass.

La connexion se fait en POST sur l’adresse https://seenthis.net/api/messages. Le protocole est obligatoirement https, pour éviter de faire circuler les mots de passe en clair sur le réseau (si vous n’envoyez pas les infos sur le port sécurisé, la connexion sera refusée).

Attention : le texte qu’on envoie n’est jamais du HTML, mais du texte brut (comme dans l’interface de Seenthis). Par convention, on préférera expédier ce texte via le summary d’ATOM. Si on n’utilise pas le summary, c’est le content qui est utilisé.

En réponse, si l’insertion a réussi, on récupère une entrée ATOM. Noter la subtilité :
- summary contient le message en mode texte (nettoyé), c’est le texte qu’on voudra éventuellement modifier et réexpédier via l’API ;
- content contient le message formaté, en HTML. On l’utilisera certainement, localement, pour l’affichage, mais en aucun cas on ne l’utilisera pour le réexpédier via l’API.

  1. $login = "monlogin";
  2.         $pass = "monpass";
  3.        
  4.         $message = "C'est top!\nhttp://www.seenthis.net\n\n";
  5.        
  6.         // Si on modifie un message existant, mettre son identifiant
  7.         // CURLOPT_CUSTOMREQUEST à PUT
  8.         // $id_me = "message:35";
  9.  
  10.         // Si le message est une réponse
  11.         // $inreplyto = "message:34";
  12.  
  13.         $xml = "
  14.                 <?xml version='1.0' encoding='UTF-8'?>
  15.                 <entry xmlns='http://www.w3.org/2005/Atom'
  16.                         xmlns:thr='http://purl.org/syndication/thread/1.0'
  17.                         xmlns:docs='http://schemas.google.com/docs/2007'>
  18.                   <id>$id_me</id>
  19.                   <summary><![CDATA[$message]]></summary>
  20.                   <thr:in-reply-to ref='$inreplyto'/>
  21.                 </entry>
  22.         ";
  23.  
  24.         $post_url = "https://seenthis.net/api/messages";
  25.  
  26.         $request = curl_init(); // initiate curl object
  27.         curl_setopt($request, CURLOPT_URL, $post_url);
  28.         curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
  29.         curl_setopt($request, CURLOPT_HEADER, 0); // set to 0 to eliminate header info from response
  30.         curl_setopt($request, CURLOPT_HTTPHEADER, array("Content-Type: application/atom+xml;type=entry"));
  31.         curl_setopt($request, CURLOPT_CUSTOMREQUEST, 'POST' )
  32.         curl_setopt($request, CURLOPT_USERPWD, "$login:$pass");
  33.         curl_setopt($request, CURLOPT_POSTFIELDS, "$xml");
  34.        
  35.         $post_response = curl_exec($request); // execute curl post and store results in $post_response
  36.         curl_close ($request); // close curl object

On doit (sauf erreur) pouvoir indiquer qu’un (nouveau) message est une réponse à un autre message, en utilisant thr:in-reply-to.

Pour modifier un message existant, indiquer son id, et passer le message HTTP en méthode PUT.

Pour l’instant, il n’y a pas la possibilité de consulter un message par l’API (qui sera en méthode GET). Ni de le supprimer (méthode DELETE). De ce fait, pour l’instant, l’API permet essentiellement d’alimenter automatiquement un compte depuis l’extérieur, mais pas réellement d’interagir avec le système.

Fonctions PHP pour exploiter directement l’API

J’ai également commencé un fichier de fonctions directement utilisables pour exploiter l’API.

  1. function seenthis_create_message($titre, $link, $quote, $comment, $tags) {
  2.         $ret = "";
  3.         if (strlen($titre) > 0) $ret .= "$titre\n";
  4.         if (strlen($link) > 0) $ret .= "$link\n";
  5.         $ret .= "\n";
  6.  
  7.         if (strlen($quote) > 0) $ret .= "❝".$quote."❞\n\n";
  8.         if (strlen($comment) > 0) $ret .= "$comment\n";
  9.  
  10.         if (!is_array($tags)) {
  11.                 $tags = explode(" ", $tags);
  12.         }
  13.         foreach($tags as $tag) {
  14.                 $tag = trim($tag);
  15.                 $tag = preg_replace(",^#,", "", $tag);
  16.                 if (strlen($tag) > 0) {
  17.                         $l .= "#$tag ";
  18.                 }
  19.         }
  20.         if (strlen($l) > 0) $ret .= "\n$l\n";
  21.        
  22.         return $ret;
  23. }
  24.  
  25.  
  26. function seenthis_create_xml($message, $id_me=0, $inreplyto=0) {
  27.         $xml = "<?xml version='1.0' encoding='UTF-8'?>\n"
  28.                         ."<entry xmlns='http://www.w3.org/2005/Atom' xmlns:thr='http://purl.org/syndication/thread/1.0'>\n";
  29.         if ($id_me > 0) $xml .= "<id>$id_me</id>\n";
  30.         $xml .= "<summary><![CDATA[".trim($message)."]]></summary>\n";
  31.         if ($inreplyto > 0) $xml .= "<thr:in-reply-to ref='message:$inreplyto'/>\n";
  32.         $xml .= "</entry>\n";
  33.  
  34.         return $xml;
  35. }
  36.  
  37. function seenthis_curl($xml, $login, $pass, $method) {
  38.         $post_url = "https://seenthis.net/api/messages";
  39.         $request = curl_init(); // initiate curl object
  40.         curl_setopt($request, CURLOPT_URL, $post_url);
  41.         curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false);
  42.         curl_setopt($request, CURLOPT_HEADER, 0); // set to 0 to eliminate header info from response
  43.         curl_setopt($request, CURLOPT_HTTPHEADER, array("Content-Type: application/atom+xml;type=entry"));
  44.         curl_setopt($request, CURLOPT_CUSTOMREQUEST, $method )
  45.         curl_setopt($request, CURLOPT_RETURNTRANSFER, true );   
  46.         curl_setopt($request, CURLOPT_USERPWD, "$login:$pass");
  47.         curl_setopt($request, CURLOPT_POSTFIELDS, "$xml");
  48.        
  49.         $post_response = curl_exec($request); // execute curl post and store results in $post_response
  50.         curl_close ($request); // close curl object
  51.  
  52.         return $post_response;
  53. }
  54.  
  55.  
  56. function seenthis_post($message, $login, $pass, $inreplyto=0) {
  57.         $xml = seenthis_create_xml($message, 0, $inreplyto) ;
  58.  
  59.         return seenthis_curl($xml, $login, $pass, "POST");
  60. }

Et pour l’utiliser :

— une fonction (totalement optionnelle, mais qui peut s’avérer pratique) seenthis_create_message, qui retourne une chaîne correspond aux habitudes de Seenthis ;

— surtout, la fonction seenthis_post pour poster ce message sur Seenthis. Particulièrement simple. Pour l’instant, ça retourne le contenu de la réponse (si ça a fonctionné, une entrée ATOM).

  1. $login = "monlogin";
  2. $pass = "monpass";
  3.  
  4. $message = seenthis_create_message(
  5.         "La jeunesse : sacrifiée ou enfermée ? - LeMonde.fr",
  6.         "http://www.lemonde.fr/idees/article/2011/03/17/la-jeunesse-sacrifiee-ou-enfermee_1494846_3232.html",
  7.         "Les comparaisons internationales indiquent que plus les diplômes jouent un rôle décisif dans l’accès à l’emploi, plus les élèves et leur famille pensent que l’école est le seul recours, plus les inégalités scolaires sont fortes. Ceci se comprend aisément : si l’on pense que tout se joue à l’école, il faut choisir les stratégies les plus sélectives conduisant vers les profils et les formations les plus rentables. Dès lors, au-delà des idéologies égalitaires, tout ce qui crée un écart scolaire est bon. Dans ce jeu, les familles déjà privilégiées sont gagnantes et la reproduction sociale entre les générations a toutes les chances de se renforcer. Quand je suis persuadé qu’il est juste et bon que l’école définisse ma valeur et mon mérite me donnant accès à l’emploi, il est normal que je cherche à creuser les écarts avec mes concurrents et, au bout du compte, l’école en rajoute aux inégalités.",
  8.         "Et ceci est mon commentaire...",
  9.         "#éducation #école #jeunesse #diplômes");
  10.        
  11. echo seenthis_post($message, $login, $pass);