Простой непрерывно работающий XMPP-клиент в Python - PullRequest
1 голос
/ 24 ноября 2010

Я использую python-xmpp для отправки jabber сообщений.Все работает отлично, за исключением того, что каждый раз, когда я хочу отправлять сообщения (каждые 15 минут), мне нужно переподключаться к серверу jabber, а тем временем отправляющий клиент находится в автономном режиме и не может получать сообщения.

Итак, я хочу написать действительно простой, бесконечно работающий клиент xmpp, который постоянно находится в сети и может отправлять (и получать) сообщения, когда это необходимо.

Мой тривиальный (нерабочий) подход:

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('receiver@example.org', 'hello world')
    time.sleep(30)

Проблема здесь в том, что я не могу ее разбудить.Мое лучшее предположение, что мне нужен какой-то параллелизм.Это правда, и если да, то как мне лучше всего это сделать?

РЕДАКТИРОВАТЬ: После изучения всех вариантов, касающихся параллелизма, я решил пойти с витой и wokkel.Если бы я мог, я бы удалил этот пост.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

На домашней странице есть хороший пример самой xmpppy (другое название для python-xmpp), которая делает почти то, что вам нужно: xtalk.py

По сути, это консольный jabber-клиент, но его не так сложно переписать в нужного вам бота.

Он всегда в сети и может отправлять и получать сообщения.Я не вижу здесь необходимости в многопроцессорном (или другом параллельном) модуле, если только вам не нужно получать и отправлять сообщения в в одно и то же время .

0 голосов
/ 22 декабря 2010

Цикл по методу Process(timeout) является хорошим способом ожидания и обработки любых новых входящих строф, сохраняя соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...