如何使用 python xmpppy 在 gtalk 中创建 MUC

Posted

技术标签:

【中文标题】如何使用 python xmpppy 在 gtalk 中创建 MUC【英文标题】:How to create MUC in gtalk using python xmpppy 【发布时间】:2012-07-05 05:49:26 【问题描述】:

谁能帮我修复这段代码,我真的需要它,但不知道下一步该做什么。我需要创建一个群聊并向受邀者发送消息,现在是 example2@gmail.com,但它没有... 有错吗?

#!/usr/bin/python
import sys,os,xmpp,time                                          
jid = 'example1@gmail.com'
psw = 'psw'
jid=xmpp.protocol.JID(jid)
cl=xmpp.Client(jid.getDomain(),debug=[])
cl.connect()
cl.auth(jid.getNode(),psw)
node = jid.getNode()
domain = 'talk.google.com'
room = node + '@' + domain
nroom = room + '/' + 'Maria'
mes = xmpp.Presence(to=nroom) 
cl.sendInitPresence()
cl.send(mes)


NS_MUCUSER = 'http://jabber.org/protocol/muc#user'
invite = xmpp.simplexml.Node('invite')
invite.setAttr('to', 'example2@gmail.com')
invite.setTagData('reason', 'I really need it!') 
mess = xmpp.Message(to=room)
mess.setTag('x', namespace=NS_MUCUSER).addChild(node=invite)
cl.send(mess)


msg = xmpp.protocol.Message(body="Hello there!")
msg.setTo(room)
msg.setType('groupchat')
cl.send(msg)
time.sleep(1)   # some older servers will not send the message if you disconnect immediately after sending
cl.disconnect()
print "Done"

【问题讨论】:

嗨,玛丽亚,如果你展示你迄今为止所做的事情,你会得到更多更好的答案 - 一些代码的 sn-ps 展示了你在哪里感到困惑。 我知道这里有错误,但我能做的就是... 【参考方案1】:

根据规范 - http://xmpp.org/extensions/xep-0045.html#createroom - 发送加入一个不存在的房间的请求应该创建那个房间(或 MUC)

创建和配置此类房间的工作流程如下:

The user sends presence to <room@service/nick> and signal his or her support
for the Multi-User Chat protocol by including extended presence information 
in an empty <x/> child element qualified by the 'http://jabber.org/protocol/muc' 
namespace (note the lack of an '#owner' or '#user' fragment).

If this user is allowed to create a room and the room does not yet exist, the
service MUST create the room according to some default configuration, assign the
requesting user as the initial room owner, and add the owner to the room but not 
allow anyone else to enter the room (effectively "locking" the room). The initial
presence stanza received by the owner from the room MUST include extended 
presence information indicating the user's status as an owner and acknowledging
that the room has been created (via status code 201) and is awaiting 
configuration.

因此应该根据文档进行类似的操作。

jid=xmpp.protocol.JID('example@gmail.com')
cl=xmpp.Client(jid.getDomain(),debug=[])

jid = xmpp.protocol.JID('example@gmail.com')
client = xmpp.Client(jid.getDomain(), debug=[])
client.connect()
client.auth(jid.getNode(), 'my secret password')
client.send(xmpp.Presence(to='room@talk.google.com/ANick')

【讨论】:

我不明白如何获取我的房间名称。我将如何向所有人发送消息?我应该先邀请他们吗?他们应该来自我的名单吗?你能给我举个例子来说明什么“我的房间/我的尼克”可以被替换吗? 您可能想在这里浏览一下规格:xmpp.org/extensions/xep-0045.html【参考方案2】:

我发现我的错误。问题是我没有等待足够长的时间从服务器获得答案,我在服务器能够创建聊天室之前邀请了人们。现在我等到我从服务器得到答案,然后发送邀请消息。

【讨论】:

以上是关于如何使用 python xmpppy 在 gtalk 中创建 MUC的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python xmpppy 获取 XMPP 服务器中所有 MUC 的列表?

如何使用 xmpp 和 Python xmpppy 发送多播消息(多个用户)(XEP-0033:扩展节寻址)

安装 xmpppy python 库和识别模块时遇到问题

XMPPPY 有在客户端管理邀请的功能吗?

如何使用 xmpppy 向聊天室发送消息?

Python xmpppy客户端未向appengine xmpp客户端发送消息