Fantomas’side

Weblog open-source

Intégrer Twitter dans Django

Twitter, c'est le nouveau média à la mode pour lancer le buzz.
Créer en 2006, son but est simple, pouvoir résumer à tout instant, ce que l'on fait, ce que l'on pense, par des messages courts, que l'on envois par SMS. En effet les messages ne doivent pas dépasser 140 caractères.

De plus votre réseau peut suivre instantanément vos status, enfin bref voilà le Micro-Blogging d'inventé.

Twitter fournis une API pour pouvoir communiquer avec son service. Je me suis alors demandé ce que je pouvais en faire, et ait décidé d'interfacer celle ci avec Django.

A travers un exemple nous allons voir comment récupérer des informations de Twitter avec les Templatetags Django.

Première étape, installer l'excellente API python pour Twitter disponible sur GoogleCode.

Ensuite nous allons créer un module python disponible dans le PYTHON_PATH, que nous appellerons django-twitter, et y créer un templatetag qui récupèrera nos derniers status postés.

$ mkdir -p django-twitter/templatetags
$ cd django-twitter
$ touch __init__.py
$ cd templatetags
$ touch __init__.py
$ touch get_tweets.py

Ceci va nous créer la structure pour y intégrer notre code. Nous allons maintenant éditer le fichier get_tweets.py et y insérer le code suivant :

"""Templates tags for accessing to Twitter"""
from django.conf import settings
from django.core.cache import cache
from django.template import Library, Node
from twitter import Api

register = Library()

class TweetStatusNode(Node):
    def __init__(self, num, varname):
        self.num = int(num)
        self.varname = varname
        self.key = '%s-%s' % (self.num, self.varname)

    def render(self, context):   
        tweets = cache.get(self.key)
        if not tweets:
            tweets = Api().GetUserTimeline(settings.TWITTER_USER, self.num)
            cache.set(self.key, tweets, settings.TWITTER_TIMEOUT)

        if self.num == 1:
            context[self.varname] = tweets[0]
        else:
            context[self.varname] = tweets
        return ''

@register.tag
def get_twitter_status(parser, token):
    """usage : {% get_twitter_status n as tweets %}"""
    bits = token.split_contents()
    if len(bits) != 4:
        raise TemplateSyntaxError, "get_twitter_status tag takes exactly three arguments"
    if bits[2] != 'as':
        raise TemplateSyntaxError, "second argument to get_twitter_status tag must be 'as'"
    return TweetStatusNode(bits[1], bits[3] )

Explications

La fonction get_twitter_status sert de tag et va conditionner les paramètres passés à l'objet Node qui va effectuer la manipulation au sein du template et du context. Si ce code vous semble obscur, je vous conseille d'aller faire un tour sur la documentation Django pour les templatetags.

Comme nous le voyons cette fonction retourne un objet hérité de Node, TweetStatusNode. C'est cette objet qui va contenir le code appelant l'API de Twitter.

De là j'assigne le résultat dans le context du template, et le tour est joué.

Désormais au sein de mes templates, je peux récupérer mes X derniers status sur Twitter, grâce à ces quelques lignes.

{% load get_tweets %}
{% get_twitter_status 5 as tweets %}

Simple non ?
Une dernière remarque, le système de cache de Django est utilisé, pour limiter les requêtes et le temps d'attente quand on interroge les serveurs de Twitter.

A partir de là, je pense qu'il est envisageable de faire une application Django complète, qui fournit les mêmes fonctionnalités que le site original, mais l'intérêt reste limité.