Thématiques :

Créez un widget Twitter Ajax avec Php et jQuery

Posé ici le mercredi 05 novembre 2008 à 13:30 par Jay Salvat

Twitter

Si vous faites partie des dizaines de milliers d'habitués de ce blog, vous avez récemment pu voir apparaitre un petit oiseau bleu en haut de page. J'ai en effet succombé à Twitter et ouvert un compte pour que le monde entier puisse profiter des choses méchamment intéressantes que je fais/dis/pense.

Si vous ne connaissez pas encore, Twitter est un service très sympathique qui... ne sert strictement à rien. Pourtant il s'avère rapidement addictif. Sa première fonction est de simplement dire ce qu'on est en train de faire pour que ses amis puissent suivre notre vie trépidante. A priori rien de très intéressant, mais couplé à une très bonne API ce service devient rapidement un outils de communication multi-support exceptionnel.

Je partage ici comment réaliser un widget grâce à l'API Twitter, Php et un peu de jQuery.

Je vais aller à l'essentiel car il n'y a rien de bien compliqué dans l'opération : Un bout de Javascript appelle en Ajax un script Php qui interroge Twitter et retourne les données HTML afin qu'elles soient affichées.

Côté Client

Après avoir inclus votre librairie jQuery, collez le morceau de code suivant dans votre page. La partie Javascript peut être placée dans le head de la page.

Javascript
$(function() {
    /**
     * Widget Twitter
     * par Jay Salvat - http://blog.jaysalvat.com/
     */
    function twitter(url) {
        $('#twitter').fadeOut("slow", function() {
            $('#twitter').load(url, function() {
                $('#twitter .next, #twitter .prev').click(function() {
                    twitter($(this).attr('href'));
                    return false;
                });
                $('#twitter').fadeIn("slow");
            });
        });
    }
    twitter('twitter.php');
});
Html
<div id="twitter" style="diplay:none">Chargement...</div>

Une fois le DOM chargé, la fonction twitter se lancera et appellera en Ajax (Ajah pour les puristes) le script twitter.php (ci-après) pour en afficher le contenu dans le div dont l'id est #twitter. Une fois l'affichage terminé, on applique une écoute du comportement click à nos futurs liens "suivant" et "précédent" qui porteront les classes .prev et .next.

Côté Serveur

Créez maintenant un fichier twitter.php. Selon son emplacement, modifiez twitter('twitter.php') dans le script précédent pour que le lien soit correct. Collez-y les deux parties de code suivantes et modifiez les paramètres username et password pour qu'ils correspondent à votre compte.

Première partie de twitter.php : Le Php
<?php
    /**
     * Widget Twitter
     * par Jay Salvat - http://blog.jaysalvat.com/
     */
    $username = "jaysalvat";
    $password = "leDiraisPas";

    // Si les infos sont déjà en Session on les récupère
    session_start();
    if (isset($_SESSION['twitter'])) {
        $twitter = $_SESSION['twitter'];
    // Sinon on lance la récupération
    } else {
        $counter = 0;
        $twitter = array();
        // On se connecte à l'API pour prendre nos dernières bafouilles
        $xml = simplexml_load_file("http://".$username.":".$password." ¬
        @twitter.com/statuses/user_timeline.xml");
        // On fait le ménage des informations inutiles, on ne garde
        // que la date et le message... puis le total de message;
        foreach($xml->status as $status) {
            $counter++;
            $twitter[] = array(
                'date'    => (string)$status->created_at,
                'message' => (string)$status->text
            );
        }
        $twitter['total'] = $counter;
        // On stocke tout en session
        $_SESSION['twitter'] = $twitter;
    }
    session_write_close();

    // Quel Twit est demandé ?
    if (isset($_GET['t'])) {
        $t = $_GET['t'];
    } else {
        $t = 0;
    }

    // Juste pour y voir plus clair
    $total   = $twitter['total'];
    $message = $twitter[$t]['message'];
    $date    = date("d/m/Y", strtotime($twitter[$t]['date']));
?>

Prenons une pause pour quelques explications. Pour éviter de consulter Twitter à chaque affichage et de ralentir considérablement le chargement du site, on va stocker le résultat du premier appel en session. La connexion à Twitter ne s'effectuera ainsi qu'une fois par visiteur.

Si la variable de session $_SESSION['twitter'] n'existe pas, on lance l'appel à Twitter, on parse le XML pour n'en garder que l'essentiel dans un tableau auquel s'ajoute le total des messages. Le tableau ressemblera à quelque chose comme ça :

Array
(
    [0] => Array
        (
            [date] => Wed Nov 05 12:14:19 +0000 2008
            [message] => Le texte de mon message 1
        )

    [1] => Array
        (
            [date] => Tue Nov 04 17:53:26 +0000 2008
            [message] => Le texte de mon message 2
        )

    [2] => Array
        (
            [date] => Mon Nov 03 12:34:04 +0000 2008
            [message] => Le texte de mon message 3
        )

    [3] => Array
        (
            [date] => Sat Nov 01 16:39:21 +0000 2008
            [message] => Le texte de mon message 4
        )

    [4] => Array
        (
            [date] => Sat Nov 01 00:09:17 +0000 2008
            [message] => Le texte de mon message 5
        )

    [total] => 4
)

Puis on stocke ce tableau en session pour les prochaines interrogations.

La variable $t comporte le numéro de message à afficher. Par défaut 0 (soit le premier) ou celui passé dans l'Url par le script Client.

Passons maintenant à la suite de ce même fichier. C'est du simple HTML qui présente les données fraichement acquises pour qu'elles soient affichées par le Javascript.

Deuxième partie de twitter.php : Le Html
<div class="wrapper">
    <p><?= $message ?></p>
    <p>
    <? if ($t > 0) : ?>
        <a class="next" href="twitter.php?t=<?= ($t-1) ?>">&laquo; Suivant</a> | 
    <? endif ?>
    Twitté le <?= $date ?>
    <? if ($t < $total-1) : ?>
        | <a class="prev" href="twitter.php?t=<?= ($t+1) ?>">Précédent &raquo;</a>
    <? endif ?>
    </p>
</div>

Ce n'est qu'une proposition de mise-en-page. Il faut juste que les liens portent les classes prev et next car c'est sur eux que seront placées les écoutes des clics pour passer d'un twit à l'autre.

Améliorations possibles

Pour un meilleur résultat, je vous invite à consulter deux autres articles de ce blog :

Puis d'éventuellement modifier deux des lignes par :

$message = tinyUrlizeText($twitter[$t]['message']);
$date    = getRelativeDate($twitter[$t]['date']);

MISE A JOUR le Jeudi 18 Décembre 2008 : Grâce à la ligne ci-dessous vous pouvez remplacer les @jaysalvat par un lien vers le profil utilisateur.

$message = preg_replace("(@(\w+))", 
           '<a href="http://twitter.com/$1">$0</a>', 
           $twitter[$t]['message']);

Conclusion

Vous voilà prêt à agrémenter votre site d'un widget Twitter sur mesure. Le résultat est brut de décoffrage, pas de considération cosmétique ici, ce sera selon vos goûts. Adaptez la présentation à vos besoins.

Télécharger le script

Les liens

Twitter

http://twitter.com/

Mon compte Twitter

http://twitter.com/jaysalvat

Trackbacks

0 trackback

Commentaires

35 commentaires

Bonjours, merci beaucoup pour ce tutorial très simple. Cependent j'ai un petit soucis après avoir installé le widget, le chargement n'aboutit pas, et "Chargement..." reste affiché indéfiniment.
Auriez-vous une idée du pb?
Merci bcp.

1. Par Benjamin le jeudi 22 janvier 2009 à 17:37

Bonsoir Benjamin,
Difficile à dire d'ici.

Première des choses à vérifier, est-ce que l'URL de la requête Ajax est bonne et pointes bien sur le fichier PHP.

Firebug (www.getfirebug.com) dans l'onglet 'Réseau' pourrait t'aider à voir ce qu'il se passe.

2. Par Jay Salvat le jeudi 22 janvier 2009 à 18:11

En effet il y avait une erreur dans l'adresse Ajax. En la rectifiant, je me retrouve avec une erreur parse en ligne 18... Voila qu'il se met à me parler chinois... :D

3. Par Benjamin le jeudi 22 janvier 2009 à 18:56

En effet il y avait une erreur dans l'adresse Ajax. En la rectifiant, je me retrouve avec une erreur parse en ligne 18... Voila qu'il se met à me parler chinois... :D

4. Par Benjamin le jeudi 22 janvier 2009 à 19:05

Si tu as fait un copié/collé du code de l'article ça ne marchera pas car il y a les retours à la ligne. Il faut enlever les ¬ et remettre tout sur la même ligne.

Le plus simple est de télécharger le code à la fin de l'article. Tu l'as fait ?

5. Par Jay Salvat le jeudi 22 janvier 2009 à 22:45

Oui c'est bon j'ai réglé le problème merci beaucoup pour l'aide et l'article

6. Par Benjamin le jeudi 22 janvier 2009 à 23:57

argh... pas moyen de supprimer cette erreur de mon côté : Fatal error: Call to undefined function: simplexml_load_file() in /homez.149/cmonstyl/www/twitter.php on line 18

J'ai pourtant téléchargé le script, et chargé correctement la librairie jquery

7. Par Mathieu le mercredi 20 mai 2009 à 00:02

Bonjour Mathieu,

Tout simplement parce que tu ne dois pas avoir l'extension SimpleXml dans to PHP.

Es-tu sûr d'avoir PHP 5 ?

8. Par Jay Salvat le mercredi 20 mai 2009 à 09:27

oui oui, j'ai bien PHP5

Quand tu dis SimpleXml, que faut-il installer en plus ?

N'est-ce pas un pb de profil public/privé ?

9. Par Mathieu le mercredi 20 mai 2009 à 13:04

Théoriquement SimpleXml est inclus à PHP5, donc rien a installer.

Je ne pense pas que le problème vienne d'un twitter privé car Call to undefined function précise que la fonction n'existe pas.

Regarde ton php info pour voir si Simplexml est présent sur ton PHP.

10. Par Jay Salvat le mercredi 20 mai 2009 à 14:56

Argh, désolé, mais je suis un numb. comment peut-on avoir visu sur php info ?

11. Par Mathieu le mercredi 20 mai 2009 à 18:33

ok, j'ai trouvé...

SimpleXml est bien présent : Start.ovh.net/infos/test.beta

12. Par Mathieu le mercredi 20 mai 2009 à 18:54

Je ne vois pas bien pourquoi alors.
On dirait qu'il ne reconnait pas SimpleXml.

13. Par Jay Salvat le mercredi 20 mai 2009 à 19:34

Bon, je vais chercher de mon côté.

Merci pour ton aide, et bravo pour ton site très réussi !

14. Par Mathieu le mercredi 20 mai 2009 à 23:37

Merci et désolé de ne pas avoir pu t'aider.
Si tu trouves une réponse, tiens moi au courant STP.

15. Par Jay Salvat le jeudi 21 mai 2009 à 20:19

Salut, j'ai trouvé une autre solution à défaut d'un fichier PHP sur le site Soulvisual.com/…er-sur-son-blog

- Un script dans le head
- Un fichier .js

ça marche pas mal, avec options également. Je suis en train de faire la mise en forme sur mon site. J'ai visualisé le script js, la technique est via json et non xml.

Voilà pour toi !

16. Par Mathieu le vendredi 22 mai 2009 à 12:39

Merci Mathieu.

17. Par Jay Salvat le vendredi 22 mai 2009 à 15:03

bonjour

j'ai essayé d'installer ton programme mais hélas ca ne marche pas chez moi

il n'y a rien qui se charge malgré avoir changer l'url du twitter.php
qd je teste le lien du simpleXml ca marche dans le navigateur mais qd je teste le fichier en local rien ne s'affiche

j'utilise php 5.2.8

je suis perdue , merci de m'aider

18. Par Safae le jeudi 10 septembre 2009 à 11:48

Bonjour Safae,
Comme ça, de loin, difficile à dire.

Peut-être que tu n'as pas l'extension simpleXml. Pourtant avec Php 5.2.8 ça devrait être le cas.

Pas de message d'erreur ? Bien mis ton password ?

19. Par Jay Salvat le jeudi 10 septembre 2009 à 13:36

bonjour

j'ai essayé d'installer ton programme mais hélas ca ne marche pas chez moi

il n'y a rien qui se charge malgré avoir changer l'url du twitter.php
qd je teste le lien du simpleXml ca marche dans le navigateur mais qd je teste le fichier en local rien ne s'affiche

j'utilise php 5.2.8

je suis perdue , merci de m'aider

20. Par Safae le jeudi 10 septembre 2009 à 14:04

oui j'ai bien mis le password
le simpleXml est bien la ( j'ai vériefié dans le phpinfo)
comme je ne me connais pas en langage informatique , est ce kele fait de le tester en local change qqch ( j'utilise easyphp)
la seul chose que j'ai aussi changer c'est le chemin de jquery comme j'avais déjà cette librairie dans un répertoire j'ai mis le chemin pour
j'ai mis les fichiers twitter.php et index.php à la racine comme ca je n'ai pas eu a changer d'url
mais le pb c'est que rien ne s'affiche, et au bout d'un moment j'ai des warning
Warning: simplexml_load_file(Twitter.com/sta…er_timeline.xml) [function.simplexml-load-file]: failed to open stream: Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hote de connexion n'a pas répondu. in C:\Program Files\EasyPHP 3.0\www\twitter.php on line 17

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "Twitter.com/sta…line.xml" in C:\Program Files\EasyPHP 3.0\www\twitter.php on line 17

Fatal error: Maximum execution time of 30 seconds exceeded in C:\Program Files\EasyPHP 3.0\www\twitter.php on line 17

donc voila si tu as une idée qui pourrai m'eclairer je t'en serai reconnaissante

21. Par Safae le jeudi 10 septembre 2009 à 14:07

Bonjour,
J'ai effectué les consignes pour intégrer l'API Twitter à mon site...
Tout marche "bien".. Je n'ai pas d'erreurs qui s'affichent..

Cependant, AUCUN Twitt ne s'affiche.... Le vide..

J'ai téléchargé le fichier ZIP, et installé les fichiers et tout....
Il m'affiche par exemple, "Twitté le 01/01/1970 " ....

Il y'a un problème ...
Aidez moi s'il vous plait..

PS: J'ai la rage, surtout quand je vois le widget Twitter en haut du site JaySalvat.... Qui marche bien......

22. Par Titoums le vendredi 20 novembre 2009 à 03:41

Bonjour Titoums,

Je viens de télécharger le script et de refaire l'essai sur mon serveur pour voir. Tout fonctionne correctement.

Deux points à vérifier :
- Bien saisi les identitiants et mot de passe ?
- Es-tu sûr que ton serveur (Free manifestement) est bien en PHP5 avec simpleXml.

Certainement un soucis de ton hébergement.
Bonne chance :)

23. Par Jay Salvat le vendredi 20 novembre 2009 à 11:04

J'ai bien saisi mon identifiant et mot de passe, pour cela, il n'y a aucun problème .

Apparemment, je lis sur différents forums que SimpleXml est dispo chez Free, et que PHP5 aussi. En fait, ma page index.php charge la page twitter.php5 (que j'ai du en effet, renommer)..
Dois-je changer index.php en index.php5 ?

24. Par Titoums le vendredi 20 novembre 2009 à 19:32

changer index.php en index.php5 ne fait rien ;) ;)

25. Par Titoums le vendredi 20 novembre 2009 à 20:18

Désolé, pas la moindre idée, il faut essayer.

26. Par Jay Salvat le vendredi 20 novembre 2009 à 22:19

J'ai essayé, vraiment... Je n'y comprends rien :'(
Je ne sais même pas comment vérifier si Free accepte le SimpleXML...

Je suis vraiment désolé de vous importuner par mes petits problèmes :'(

27. Par Titoums le vendredi 20 novembre 2009 à 23:34

Tu ne me déranges pas, c'est juste que je ne sais pas trop comment t'aider si c'est un soucis d'hébergeur.
Essaye de faire un phpinfo() et voir si SimpleXml est inscrit.

Sinon je viens de trouver ça sur les Sessions chez Free.
Free.fr/assista…ssions-php.html
C'est peut être ça qui pose problème.

28. Par Jay Salvat le vendredi 20 novembre 2009 à 23:40

Le répertoire sessions est déjà créé, car je l'utilise déjà ;)
J'ai un truc sur le Xslt apparemment.. dans phpinfo
En revanche, aucune trace de SimpleXML dans phpinfo...

cela me désespère ..

29. Par Titoums le vendredi 20 novembre 2009 à 23:48

"En revanche, aucune trace de SimpleXML dans phpinfo..."

Je crois que tu as malheureusement ta réponse :) Dommage.

30. Par Jay Salvat le vendredi 20 novembre 2009 à 23:58

Lol, je vous remercie en tout cas ..
Mais pas moyen de contourner ce fâcheux problème ?

31. Par Titoums le samedi 21 novembre 2009 à 00:03

Si, parser le XML "à la main" sans passer par SimpleXML.
Ou trouver un autre widget Twitter qui marche différemment. Le net doit en être plein.

32. Par Jay Salvat le samedi 21 novembre 2009 à 00:20

Je vais voir pour Parser le XML à la main, maintenant que c'est fait :P

Merci, et bonne soirée ;)

33. Par Titoums le samedi 21 novembre 2009 à 00:27

Bonjour,

Merci, pour ce script.
J'ai encore une petite question :
Je souhaite ouvrir les liens qui s'affichent dans les twitts dans un cadre déterminé de ma page web.
Autrement dit je souhaite appliquer une cible par défaut à l'ensemble des liens qui s'afficheront dans le widget.

Après avoir pris connaissance de vos 2 scripts (widget + Remplacer de longues URL par des TinyURL), je me suis dit que cela devait être possible...

Qu'en pensez-vous ?

34. Par Louis le lundi 23 novembre 2009 à 08:22

Bonjour Louis,

Oui c'est possible change le target des ahref, ce sont des liens normaux.

35. Par Jay Salvat le lundi 23 novembre 2009 à 10:16

Obligatoire. Vrai nom apprécié.

Il ne sera ni affiché, ni spammé.

Votre blog ou votre site web.

Constructif, courtois et correctement écrit. SMS proscrit. Merci.