Как отправить многоадресное сообщение (нескольким пользователям) с использованием xmpp и Python xmpppy (XEP-0033: расширенная адресация Stanza)

Я использую 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: расширенная адресация Stanza 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>

Но я не нашел способа сделать то же самое в Python с использованием xmpppy, есть идеи о том, как создать раздел многоадресной рассылки и отправить сообщение нескольким пользователям с помощью Python?

Благодарю.

1 ответ

Возможно, вы могли бы сделать это без 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)
Другие вопросы по тегам