Twitter client terminal

Publié le 06/11/2009

Je cherchais un outil pour twitter à utiliser depuis la console, simple, clair, rapide à utiliser mais rien de probant n’est tombé sous mes yeux. J’ai donc décidé de créer un outil à ma sauce… Le résultat que je vais vous montrer est assez sympa. Avant tout, si vous voulez utiliser mon “outil” il vous faudra quelques paquets (rien de bien méchant, quelques kilo-octets à ajouter). Normalement tous ces paquets sont sur les distributions modernes (Fedora, Ubuntu, OpenSuse etc…). Utilisez votre gestionnaire de paquets pour les installer (voir plus bas).

En premier lieu, j’ai découvert l’implémentation de l’API twitter sur python. Très clair, bien documenté dans “pydoc”, j’ai décidé de commencer simplement.

L’utilisation est la suivante: ` import twitter api = twitter.Api(username=“VotreUser”, password=“XXXXX”) statues = api.GetFriendsTimeline() for i in statues: print “De: “+s.user_name print “Message: “.s.text

`

L’envoi est tout aussi simple: api.PostUpdate("Salut les copain, je twitt depuis Python !")

Hop, un message envoyé… Donc si vous comprenez bien, l’api est simple à utiliser. Je me décide donc à créer une petite classe “cliente” qui va me permettre soit de lire en continue, soit d’envoyer un twitt.

Regardez la classe: ` #python twitter simple tool (command line) import sys, twitter, time USERNAME=“metal3d” PASSWORD=“XXX”

class cmdlineTwitt: def init(self,username,password): self.sleeptime=60 self.api = twitter.Api(username=username, password=password, input_encoding=‘utf-8’) “”” Little interface to command twitter from command line “”” def GetTwitts(self): “”” Get Twitts “”” last_id=None #statuses = api.GetPublicTimeline() while True: statues = self.__api.GetFriendsTimeline(since_id=last_id) statues.reverse() for s in statues: print s.user.screen_name+’:: ‘+repr(s.id)+’ :: ‘+s.created_at if s.in_reply_to_screen_name: print “In reply to:” + s.in_reply_to_screen_name

            print s.text
            print ""
            #id have to be string...
            last_id=str(s.id)
        time.sleep(self.__sleeptime)

def SendTwitts(self,text):
    print "Sending: "+ text
    self.__api.PostUpdate (text)
    print "Sended !"

if name == “main“: app = cmdlineTwitt(USERNAME, PASSWORD)

# text given, send text !    
if len(sys.argv) > 1:
    text = "";
    loop=0
    for i in sys.argv:
        if loop > 1:
            text+= ' '
        if loop > 0:
            text += i
        loop = loop + 1
    app.SendTwitts(text);
#else, just get twitts
else:
    app.GetTwitts();

`

A partir de là, je peux faire ceci dans la console:

#envoyer un message
python screentwitt.py "Et un nouveau message à envoyer"

#lire en continue
python screentwitt.py 

Bon, le souci c’est que j’ai envie de pouvoir lire en continue **et** pouvoir envoyer un message… alors que là, je dois couper le script le lecture, appeler mon script pour envoyer un message, puis relancer le script pour qu’il lise… bref, pas pratique.

Me voilà en train de tenter d’utiliser python-snack pour faire une interface “curses”, mais rien à faire, c’est compliqué et surtout ça n’a pas du tout l’apparence que je cherchais…

C’est là que m’ait venu l’idée toute bête: utiliser “screen”. Effectivement, screen sait lancer des process en continue, mais surtout il sait “spliter” un écran. Donc je peux mettre le “lecteur” en haut et une entrée de texte en bas… ha oui mais une entrée de texte… ça exite pas… Comment ça ? mais si, un petit scrip bash qui va lire en continue ce que j’entre au clavier et le tour et joué.

Dernier point, faire en sorte de pouvoir lancer screen avec la fenêtre splitté. Je vais utiliser /dev/shm qui, lorsque le screen sera terminé, virera purement et simplement le screenrc.

Voilà donc le script bash à utiliser: ` #!/bin/bash

#write screenrc in shared memory cat 1> /dev/shm/twittscreenrc <<RC split screen -t “Twitts Recieved” python /home/votre_user/repertoire/screentwitt.py focus down resize 3 screen -t “Send Twitts” bash /home/votre_user/repertoire/screentwitt.sh RC

#if “-s” option, just run screen if [[ “$1” == “-s” ]]; then screen -c /dev/shm/twittscreenrc else #if no option, begin to read user entries, then send them to twitter while read a do python $(dirname $0)/screentwitt.py “$a” done fi `

(Changez bien les répertoires pour pointer sur le votre dans le script ci dessus)

Reste donc à placer le script python “sreentwitt.py” et le script bash “screentwitt.sh” **dans le même répertoire**… puis d’exécuter:

#pour le rendre exécutable:
#chmod +x/repertoire/vers/screentwitt.sh 
#une seule fois...

#puis
/repertoire/vers/screentwitt.sh -s

Hop, screen se lance, coupe la fenêtre en deux, place la lecture en haut, puis redimensionne la fenêtre du bas à 3 lignes (resize 3) et se met en lecture d’entrée clavier.

Attention, pour quitter cette application, il faut s’y prendre proprement. Pressez “CTRL+C” dans la fenêtre d’entrée pour couper l’entrée de texte, puis: CTRL+A puis la touche Tabulation pour monter dans la fenêtre de lecture. Pressez CTRL+C une nouvelle fois.

Si vous ne faite pas cela, screen restera en fonction en arrière plan. Dans ce cas:

screen -ls

vous donnera le numéro de screen à réattacher, et/ou à “killer”.

Évidemment, tout ça mérite d’être amélioré, retouché… et surtout de pouvoir gérer les “reply to” etc… je n’y manquerai pas pour la suite. Mais dans l’absolu, admettez que c’est quand même cool de pouvoir faire mumuse avec python, bash, screen et twitter aussi facilement.

Ha oui, les paquets à installer: -python -python-twitter -screen

A vous de jouer !

PS: n’hésitez pas à me donner des corrections, des ajouts.

Edit: Ajout de l’input-encoding pour ne pas avoir tout ces soucis d’unicode… Merci Pyhon :)\\ Edit: Tiens, faut mettre un string et non un int pour les “id” de status… apparemment…

comments powered by Disqus