Derniers tweets avec système de cache PHP

  • Développement
  • Ecrit par Vincent
Maison du Net vous propose un script PHP simple pour mettre sur votre site internet les derniers tweets laissés sur Twitter.

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);

Rédigé avec amour par Vincent

Ce n'est pas tout

Vous aimerez peut-être aussi ces publications

À propos du stockage des mots de passe

Maison du Net vous propose différentes solutions pour stocker vos mots de passe et vous recommande certaines d'entre elles pour plus de sécurité.

Présence de Maison du Net au MIFA 2016 à Annecy

Pour le MIFA 2016, Maison du Net sera présente à ce salon afin de faire des rencontres et de partager son expérience sur le monde du numérique.