PROJET AUTOBLOG


Tcit

Archivé

source: Tcit

⇐ retour index

Partager ses liens de Shaarli sur Twitter

mercredi 26 mars 2014 à 22:27

J’en avais marre (ok, MrKooky en avait marre) de poster mon flux RSS de tweets par le service dlvr.it. Même avec pubsubhubbub, ce n’est pas instantané et en plus, la redirection ne se fait pas directement. Ces deux problèmes sont désormais réglés.

Je vous explique donc ce que j’ai fait pour exporter mes liens partagés sur Shaarli vers Twitter. J’utilise YOURLS pour réduire la taille des URLs des liens pour Twitter. Donc l’URL est passée à la moulinette de l’API de mon instance YOURLS, puis envoyée à l’API twitter pour être postée.

On a un shaarli dans liens/, des scripts dans twitter/ et un YOURLS dans to/.

La librairie que nous utiliserons est twitteroauth. Il vous suffit de télécharger les fichiers du dossier twitteroauth, c’est-à-dire uniquement OAuth.php et twitteroauth.php et de les mettre dans notre dossier twitter/

Dans index.php du shaarli :

Dans le bloc :

if (isset($_POST['save_edit']))

On doit ajouter à la fin de ce bloc :

if (isset($_POST['lf_yourls']))
 {
 // create a new cURL resource
 $ch = curl_init();
 // set URL and other appropriate options
 $titleyourls = str_replace(' ', '%20',$link['title']);
 $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(\/\S*)?/";
 if (preg_match($reg_exUrl, $link['url'], $url)){
   $linkyourls=$url[0];
   $original = "&shaarlink=VOTREURL/liens/?".smallHash($link['linkdate']);
 }
 else{
   $linkyourls = "VOTREURL/liens/".$link['url'];
   $original = "";
   }
 curl_setopt($ch, CURLOPT_URL, "VOTREURL/twitter/tweet.php?url=".$linkyourls."&title=".$titleyourls.$original);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 // grab URL and pass it to the browser
 curl_exec($ch);
 // close cURL resource, and free up system resources
 curl_close($ch);

Maintenant, on ajoute l’option pour partager dans shaarli : éditons le fichier liens/tpl/editlink.html de cette manière :

<!DOCTYPE html>
<html>
<head>{include="includes"}</head>
<body
{if condition="$link.title==''"}onload="document.linkform.lf_title.focus();"
{elseif condition="$link.description==''"}onload="document.linkform.lf_description.focus();"
{else}onload="document.linkform.lf_tags.focus();"{/if} >
<div id="pageheader">
        {include="page.header"}
        <div id="editlinkform">
            <form method="post" name="linkform">
                <input type="hidden" name="lf_linkdate" value="{$link.linkdate}">
                <i>URL</i><br><input type="text" name="lf_url" value="{$link.url|htmlspecialchars}" style="width:100%"><br>
                <i>Title</i><br><input type="text" name="lf_title" value="{$link.title|htmlspecialchars}" style="width:100%"><br>
                <i>Description</i><br><textarea name="lf_description" rows="4" cols="25" style="width:100%">{$link.description|htmlspecialchars}</textarea>
                <i>Tags</i><br><input type="text" id="lf_tags" name="lf_tags" value="{$link.tags|htmlspecialchars}" style="width:100%"><br>
                {if condition="($link_is_new && $GLOBALS['privateLinkByDefault']==true) || $link.private == true"}
            <input type="checkbox" checked="checked" name="lf_private" id="lf_private">
            &nbsp;<label for="lf_private"><i>Private</i></label><br>
            {else}
            <input type="checkbox"  name="lf_private" id="lf_private">
            &nbsp;<label for="lf_private"><i>Private</i></label><br>
            {/if}
                <input type="checkbox" checked name="lf_yourls" id="lf_yourls">
                &nbsp;<label for="lf_yourls"><i>Share with Yourls</i></label><br>
                <input type="submit" value="Save" name="save_edit" class="bigbutton" style="margin-left:40px;">
                <input type="submit" value="Cancel" name="cancel_edit" class="ass="bigbutton" style="margin-left:40px;">
                {if condition="!$link_is_new"}<input type="submit" value="Delete" name="delete_link" class="bigbutton" style="margin-left:180px;" onClick="return confirmDeleteLink();">{/if}
                <input type="hidden" name="token" value="{$token}">
                {if condition="$http_referer"}<input type="hidden" name="returnurl" value="{$http_referer|htmlspecialchars}">{/if}
              </form>
        </div>
</div>
{include="page.footer"}
</body>
</html>

Notez que j’ai choisi de cocher la case « Share with YOURLS » par défaut (attribut checked).

A présent créons le fichier tweet.php dans twitter/ :

<?php

//Insérez ici une licence GNU avec copyright au nom de Doug Vanderweide

//YOURLS API signature
define('YOURLS_API_SIGNATURE', '');

//twitter API keys
define('TWITTER_API_CONSUMER_KEY', '');
define('TWITTER_API_CONSUMER_SECRET', '');
define('TWITTER_API_ACCESS_TOKEN', '');
define('TWITTER_API_ACCESS_TOKEN_SECRET', '');

require_once('twitteroauth.php');

//sanitize inputs
if(!isset($_GET['url'])) {
     echo('Could not find URL of item');
}
elseif(trim($_GET['url']) == '') {
     echo('URL is empty string');
}
elseif(!isset($_GET['title'])) {
     echo('Could not find title of item');
}
elseif(trim($_GET['title']) == '') {
     echo('Title is empty string');
}
else {
     //build GET link to YOURLS API
     $link = 'VOTREURL/to/yourls-api.php?signature=' . YOURLS_API_SIGNAT$

     //use curl to send API request
     //reads XML response into string
     $ch = curl_init($link);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     //if curl fails, report that fact
     if(!$reply = curl_exec($ch)) {
          echo('Curl request to URL shortening service failed.');
     }
     curl_close($ch);

     //create DOMDocument to parse response string
     $xml = new DOMDocument();
     $xml->loadXML($reply);

     //get short URL
     $node = $xml->getElementsByTagName('shorturl')->item(0);
     $shorturl = $node->textContent;

     //get status message
     $node = $xml->getElementsByTagName('statusCode')->item(0);
     $status = $node->textContent;

     //get verbose API response
     $node = $xml->getElementsByTagName('message')->item(0);
     $message = $node->textContent;

     //if the short URL is an empty string, or the status code isn't 200,
     //kill the script and report error
     if(trim($shorturl) == '' || $status != '200') {
     echo("Shortening of url failed. Error code: $status Error message: $message");
     }

     //set twitter status
     $shaarlipart = "";
     if (isset($_GET['shaarlink'])){
     $shaarlipart = " Shaarli : " . $_GET['shaarlink'];
     }

     $status = strip_tags($_GET['title'] . " " . $shorturl . $shaarlipart);

     //create TwitterOAuth object
     $to = new TwitterOAuth(TWITTER_API_CONSUMER_KEY, TWITTER_API_CONSUMER_SECRET, TWITTER_API_ACCESS_TOKEN, TWITTER_API_ACCESS_TOKEN_SECRET);
     //send status update request
     //if curl fails, report that
     if(!$content = $to->post('https://api.twitter.com/1.1/statuses/update.json', array('status' => $status))) {
          $content = 'Failure posting status to Twitter. This is probably due to a network error, downtime in the Twitter API, etc.';
          echo($content);
 }
     //if the Twitter API has a fit, report that
     elseif($to->lastStatusCode() != '200') {
          $content = 'Error returned by Twitter API. Code: ' . $to->lastStatusCode() . ' // XML response: // ' . print_r($content, true);
          echo($content);
     }
     //redirect to Twitter on success (not relevant here)
     header('Location: http://www.twitter.com/home');
}
?>

On aura pris le soin d’aller sur son instance YOURLS, de récupérer le token et le mettre au bon endroit. Pareil, rendez-vous sur https://apps.twitter.com, créez une nouvelle application, et récupérez l’API key, l’API secret d’une part et générez un token, puis récupérez l’Access token et l’Access token secret. Mettez tout cela au bon endroit dans le fichier (indice, c’est au début).

N’oubliez pas de changer VOTREURL par… OK, je vous laisse deviner. Et faut que vous ayez php-curl, aussi, oubliez pas. Je suis certain qu’il y a plus léger que curl, c’est juste que c’est rapide.

Bon, j’attends des retours, vu qu’il y a peu de chances que ça soit correct (ça marche chez moi en tout cas) mais ceci était une version de travail, j’ai juste trop la flemme de vérifier si c’est bien ça qui est en ligne.

Et sinon, y a plus qu’à espérer que l’API de Twitter ne change pas dans 2 mois. Mais sinon, vu que ça se base sur OAuth, ça devrait tenir.

Source : Avant tout ce billet même s’il est loin d’être à jour et valable dans notre cas. https://www.dougv.com/2011/01/03/update-to-the-yourls-twitter-google-reader-script/

flattr this!