Twitter client terminal

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…

Ça peut vous intéresser aussi


screen automatique

Voilà quelques temps que je n’ai pas tapé un ...


Netcat, créez votre serveur en BASH

Bash est puissant, très puissant. Les commandes et utilisations sont vastes ...


OpenOffice en mode serveur

Il est parfois compliqué de créer des documents dignes de ...


xinetd ou la création de service facile

Création d’un serveur avec xinetd

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.