Twitter client terminal

Tags:: twitter :: bash :: python :: screen :: linux :: curses

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.

screentwitt

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...

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile

Pas de commentaire pour le moment

Ajouter un commentaire
Veuillez répondre à la question suivante : Taper "geek" sans les guillemets

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://metal3d.org/index.php/trackback/default/tb?id=blog%2F239

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming

  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict