我使用xmpppy http://xmpppy.sourceforge.net/发送Jabber通知,使用以下代码可以很好地处理单个目标:
# pip install https://github.com/rochacbruno/xmpppy/tarball/master
import xmpp
JABBER_SETTINGS = {"USERNAME": None, "PASSWORD": None, "DOMAIN": None, "RESOURCE": None}
def get_jabber_client():
client = xmpp.Client(JABBER_SETTINGS.get('DOMAIN'))
client.connect(server=(JABBER_SETTINGS.get('DOMAIN'), '5222'))
client.auth(
JABBER_SETTINGS.get('USERNAME'),
JABBER_SETTINGS.get('PASSWORD'),
JABBER_SETTINGS.get('RESOURCE')
)
client.sendInitPresence()
return client
def send_message(to, message):
client = get_jabber_client()
xmpp_message = xmpp.Message(to, message)
client.send(xmpp_message)
client.disconnect()
send_message("single.destination@domain.com", "Hello World!")
但现在我需要将消息发送到多个目的地,现在我正在做。
for users in list_of_users:
send_message(user, "Hello World!")
哪种方法很好,但每次调用它都会启动身份验证过程并花费大量时间。
我尝试创建单个客户端并使用同一客户端发送消息。
def send_message(to, message):
if isinstance(to, basestring):
to = [to]
assert isinstance(to, (list, tuple))
client = get_jabber_client()
for destination in to:
xmpp_message = xmpp.Message(destination, message)
client.send(xmpp_message)
client.disconnect()
send_message(['user1...', 'user2...'], "Hello World!")
上面的代码有效,但只有列表中的第一个用户才能正确格式化消息,其他用户以纯XML格式接收消息。
我看到了这段代码(在.net中),提到了XEP-0033:Extended Stanza Addressing http://forum.ag-software.net/thread/1482-Send-Message-To-all-users-in-contact-list
var addresses = new Addresses();
addresses.AddAddress(new Address
{
Type = Type.to,
Jid = "hildjj@jabber.org/Work",
Description = "Joe Hildebrand"
});
addresses.AddAddress(new Address
{
Type = Type.cc,
Jid = "jer@jabber.org/Home",
Description = "Jeremie Miller"
});
var msg = new Matrix.Xmpp.Client.Message();
msg.Add(addresses);
msg.To = "multicast.jabber.org";
msg.Body = "Hello, world!";
builds the following Xml:
<message to='multicast.jabber.org'>
<addresses xmlns='http://jabber.org/protocol/address'>
<address type='to' jid='hildjj@jabber.org/Work' desc='Joe Hildebrand'/>
<address type='cc' jid='jer@jabber.org/Home' desc='Jeremie Miller'/>
</addresses>
<body>Hello, world!</body>
</message>
但我没有找到使用xmpppy在Python中做同样的方法,有关如何构建多播节并使用Python将消息发送给多个用户的任何想法?
感谢。
答案 0 :(得分:2)
你可以在没有XEP-0033的情况下完成这项工作。在此循环中,您第一次覆盖变量message
的值,后续消息将出现乱码内容:
for destination in to:
message = xmpp.Message(destination, message)
client.send(message)
请改为尝试:
for destination in to:
xmpp_message = xmpp.Message(destination, message)
client.send(xmpp_message)