Derniers tweets avec système de cache PHP

Derniers tweets avec système de cache PHP

23 novembre 2011 Vincent Développement web

Mettre les derniers Tweets sur son site internet

Nous proposons un script PHP stockant les tweets en cache dans un fichier, puis de mettre à jour ce fichier à intervalle de temps régulier, par exemple toute les heures. Cela limite les appels à l’API maximise les appels au fichier, beaucoup plus rapides. En modifiant quelques paramètres, choisissez facilement le nombre de tweets à afficher, ainsi que la fréquence d’interrogation de l’API du service pour la mise à jour du fichier. De plus, il faut traiter les données retournées par Twitter, pour afficher la date correctement, récupérer les éventuels liens et références (# et @) des tweets.

Changer le format de la date

Pour afficher la date des tweets, nous vous proposons une fonction simple provenant de Stackoverflow et transformant la date en : « Il y a 1 heure, Il y a 2 jours … ».

<?php
 
require_once(dirname(__FILE__)."/twitteroauth.php");
define("CONSUMER_KEY", "xxxxxx");
define("CONSUMER_SECRET", "xxxxxxxxxxxxxxxxxx");
define("TOKEN", "xxxxx-xxxxxxxxxxxxxx");
define("TOKEN_SECRET", "xxxxxxxxxxx");
 
//définition des constantes pour le relative time
define("SECOND", 1);
define("MINUTE", 60 * SECOND);
define("HOUR", 60 * MINUTE);
define("DAY", 24 * HOUR);
define("MONTH", 30 * DAY);
 
function relative_time($time){
    $delta = strtotime('+1 minute') - $time;
    if ($delta < 2 * MINUTE) {
        return "Il y a moins d'une minute";
    }
    if ($delta < 45 * MINUTE) {
        return "Il y a ".floor($delta / MINUTE) . " minutes";
    }
    if ($delta < 90 * MINUTE) {
        return "Il y a une heure";
    }
    if ($delta < 24 * HOUR) {
        return "Il y a ".floor($delta / HOUR) . " heures";
    }
    if ($delta < 48 * HOUR) {
        return "hier";
    }
    if ($delta < 30 * DAY) {
        return "Il y a ".floor($delta / DAY) . " jours";
    }
    if ($delta < 12 * MONTH) {
        $months = floor($delta / DAY / 30);
        return $months <= 1 ? "Il y a un mois" : "Il y a ".$months . " mois";
    } else {
        $years = floor($delta / DAY / 365);
        return $years <= 1 ? "Il y a un an" : "Il y a ".$years . " ans";
    }
}

Pour utiliser l’API de Twitter, il vous faudra 2 fichiers pour l’utilisation de OAuth. Vous trouverez les fichier sur GitHub. Seuls OAuth.php et twitteroauth.php sont nécessaires. Le second inclus le premier. C’est pour cela qu’en haut du script ci-dessus un seul fichier est inclus.

Vous avez besoin de vos identifiants API pour pouvoir utiliser ce service :

  • CONSUMER_KEY
  • CONSUMER_SECRET
  • TOKEN
  • TOKEN_SECRET

Vous trouverez ces informations sur la plateforme pour développeur de Twitter en accédant à votre compte.

Récupérer ses derniers tweets

La fonction pour la gestion des données en cache ou en interrogeant l’API est inspirée de cet article de blog : How to Get Your Most Recent Twitter Posts Using PHP with Caching. En plus de s’occuper de la gestion du fichier, le script utilise la fonction relative_time() décrite plus haut (indispensable donc à son fonctionnement). Elle stocke correctement la date pour traiter ensuite le contenu des tweets pour récupérer les données importantes.

<?php
/**
* @desc getTimeline return the last tweets and manage a file cache system.
* @param int $count number of tweets to display
* @param string $username tweeter username
* @param string $cache_file name of cache file
* @param int $interval expire time of cache
* @return array
*/
function getTimeline($count, $username,$cache_file,$interval) {
    //dans ce cas le fichier doit être dans le même répertoire que le script.
    $path = realpath(dirname(__FILE__))."/".$cache_file;
    $last = filemtime($path);
    $now = time();
    if ( !$last || (( $now - $last ) > $interval) ) {
        $connectionToken = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, TOKEN, TOKEN_SECRET);
        $params = array("count"=>5);
        $tweets = $connectionToken->get('statuses/user_timeline',$params);
        $newTweets = array();
        $i=0;
        foreach($tweets as $tweet){
            $time = strtotime($tweet["created_at"]);
            //récupération du temps relatif
            $create = relative_time($time);
            //on traite le contenu pour récupérer liens et tags
            $content = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@','<a href="$1" target="_blank">$1</a>',$tweet["text"]);
            $content = preg_replace('#(@[_\-a-z0-9]+)#','<a href="http://twitter.com/$1" target="_blank">$1</a>',$content);
            $content = preg_replace('#href="http://twitter.com/@([_\-a-z0-9]+)#','href="http://twitter.com/$1',$content);
            $content = preg_replace('/(\B#\w*[a-zA-Z]+\w*)/','<a href="http://twitter.com/search?q=$1" target="_blank">$1</a>',$content);
            $content = str_replace('href="http://twitter.com/search?q=#','href="http://twitter.com/search?q=%23',$content);
            $newTweets[$i]["create"] = $create;
            $newTweets[$i]["content"] = $content;
            $i++;
        }
        $cache_static = fopen($path, 'wb');
        fwrite($cache_static, serialize($newTweets));
        fclose($cache_static);
        $tweets = $newTweets;
    }else{
        $tweetsSr = file_get_contents($path);
        $tweets = unserialize($tweetsSr);
    }
    return $tweets;
}

Voici un exemple d’utilisation de la méthode. Cela implique la création du fichier content.txt situé dans le même répertoire que le script ci-dessus avec les bons droits.

<?php
$tweets = getTimeline(3,"moncomptetwitter","content.txt",3600);
Vincent
Vincent

Gérant / Développeur / Administrateur système

Diplômé du 3ème cycle de l'enseignement supérieur en Informatique et Systèmes Coopératifs, je mets toutes mes compétences à disposition de Web74 et de ses clients.