2010-11-24 59 views
1

J'utilise python-xmpp pour envoyer des messages jabber. Tout fonctionne bien sauf que chaque fois que je veux envoyer des messages (toutes les 15 minutes), je dois me reconnecter au serveur jabber, et entre-temps le client expéditeur est hors ligne et ne peut pas recevoir de messages. Donc, je veux écrire un client xmpp très simple, qui fonctionne indéfiniment, qui est en ligne tout le temps et peut envoyer (et recevoir) des messages lorsque cela est nécessaire.Simple client XMPP en continu fonctionnant en python

Mon approche triviale (non-travail):

import time 
import xmpp 

class Jabber(object): 
    def __init__(self): 
     server = 'example.com' 
     username = 'bot' 
     passwd = 'password' 
     self.client = xmpp.Client(server) 
     self.client.connect(server=(server, 5222)) 
     self.client.auth(username, passwd, 'bot') 
     self.client.sendInitPresence() 
     self.sleep() 

    def sleep(self): 
     self.awake = False 
     delay = 1 
     while not self.awake: 
      time.sleep(delay) 

    def wake(self): 
     self.awake = True 

    def auth(self, jid): 
     self.client.getRoster().Authorize(jid) 
     self.sleep() 

    def send(self, jid, msg): 
     message = xmpp.Message(jid, msg) 
     message.setAttr('type', 'chat') 
     self.client.send(message) 
     self.sleep() 

if __name__ == '__main__': 
    j = Jabber() 
    time.sleep(3) 
    j.wake() 
    j.send('[email protected]', 'hello world') 
    time.sleep(30) 

semble ici Le problème est que je ne peux pas le réveiller. Ma meilleure supposition est que j'ai besoin d'une sorte de concurrence. Est-ce vrai, et si oui, comment ferais-je le mieux?

EDIT: Après avoir examiné toutes les options concernant la concurrence, j'ai décidé d'aller avec twisted et wokkel. Si je pouvais, je supprimerais ce post.

+0

Si vous souhaitez être en mesure d'envoyer et de recevoir des messages en même temps, vous aurez besoin de la simultanéité. Regardez dans le module 'multiprocessing' ou l'un des nombreux tutoriels là-bas. – katrielalex

Répondre

2

Il y a un bon exemple sur la homepage de xmpppy lui-même (ce qui est un autre nom pour python-XMPP), qui fait presque ce que vous voulez: xtalk.py

Il est essentiellement un jabber-client de la console, mais shouldn » t être difficile de réécrire dans le bot que vous voulez.

Il est toujours en ligne et peut envoyer et recevoir des messages. Je ne vois pas le besoin d'un module de multitraitement (ou d'un autre type de concurrence) ici, sauf si vous avez besoin de recevoir et d'envoyer des messages au exactement en même temps.

+0

La documentation est un peu éparse. En utilisant l'exemple xtalk.py, comment imprimez-vous le message reçu? – Andrew

+0

@Andrew: Regardez de plus près la fonction xmpp_message. – kolobos

0

Une boucle sur la méthode Process(timeout) est un bon moyen d'attendre et de traiter les nouvelles strophes entrantes tout en maintenant la connexion.