简单的持续运行的Python XMPP客户端

1 投票
2 回答
10115 浏览
提问于 2025-04-16 07:33

我正在使用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)

这里的问题似乎是我无法让它“醒过来”。我猜可能需要一些并发处理。这样说对吗?如果是的话,我该怎么做呢?

补充:在研究了所有关于并发的选项后,我决定使用twisted和wokkel。如果可以的话,我真想删掉这篇帖子。

2 个回答

0

使用 Process(timeout) 方法来循环处理是一个不错的选择,这样可以在保持连接的同时,等待并处理任何新到的数据。

2

在xmpppy的主页上,有一个很好的例子(xmpppy其实就是python-xmpp的另一个名字),这个例子几乎实现了你想要的功能:xtalk.py

这个例子基本上是一个控制台的Jabber客户端,但要把它改写成你想要的机器人应该不难。

它始终在线,可以发送和接收消息。我觉得在这里不需要使用多进程(或者其他并发)模块,除非你需要在完全相同的时间发送和接收消息。

撰写回答