Чат XMPP: доступ к сообщениям о состоянии контактов с помощью списка xmppPy

Я пытаюсь получить доступ к пользовательским сообщениям о статусе моих контактов Google Talk с помощью xmpppy. Я сделал это так далеко:

import xmpp
import sys

userID   = '[email protected]' 
password = 'mypassword'
ressource = 'Script'

jid  = xmpp.protocol.JID(userID)
jabber  = xmpp.Client(jid.getDomain(), debug=[])

connection = jabber.connect(('talk.google.com',5222))
auth = jabber.auth(jid.getNode(), password, ressource)

jabber.sendInitPresence(requestRoster=1)
myroster = jabber.getRoster()

объект реестра myroster теперь содержит мои контакты, но пользовательское сообщение о состоянии не включено.

myroster.getStatus('[email protected]')

возвращает Нет

глядя на «сырой список», я вижу, что словарь ресурсов пуст

u'[email protected]': {'ask': None, 'resources': {}, 'name': u'Some Name', 'groups': [], 'subscription': u'both'}

Странно то, что я заставил это работать сегодня, но код мог быть немного другим, но я не могу понять, что именно я сделал по-другому...

Любая помощь будет принята с благодарностью!

Ваше здоровье,

Мартин


person Hoff    schedule 04.03.2010    source источник


Ответы (2)


Это вопрос времени. Добавьте обработчик с:

jabber.RegisterHandler('presence', myPresenceHandler)

def myPresenceHandler(self, con, event):
  fromjid = event.getFrom().getStripped()
  status = myroster.getStatus(fromjid)

ПЕРЕД подключением. Затем обязательно вызовите jabber.Process() в цикле. Проблема в том, что с вашим кодом вы иногда будете получать строфы присутствия до того, как просмотрите объект реестра, а иногда и после.

person Joe Hildebrand    schedule 08.03.2010

Вот одна вещь, которую я обнаружил, которая была мне непонятна, когда я впервые начал работать с xmpp. Дружба двусторонняя.

Использование строф присутствия
(а) Вы можете "подписаться" на своего друга, и ваш друг может ответить "подписан".
(б) Ваш друг может "подписаться" на вас, и вы можете ответить "подписан".

Ваш друг будет в вашем списке, если произойдет (а) или (б).
Вы будете в списке ваших друзей, если произойдет (а) или (б).

Однако...
Вы не увидите их статус, пока не "подпишетесь" на своего друга - (а) это должно произойти
Они не увидят ваш статус, пока не "подпишутся" на вас - (б) должно произойти.

Большинство клиентов XMPP (pidgin, trillian и т. д.) автоматически заставят вас отправить «подписаться» вашему другу, когда вы отправите им «подписку» (после того, как они отправили вам «подписаться»). XMPPPY не делает этого из коробки. Вы должны закодировать его, чтобы сделать это.

Это может объяснить, почему вы не видели статус. Или, если это не распространяется на вашу ситуацию, это может быть информативно для кого-то еще.

person David Gregory    schedule 18.08.2010
comment
Привет, Дэвид, хотя я еще не применил вашу информацию, я ценю, что вы доказали этот ответ. Я опубликую еще один комментарий, как только узнаю, было ли это причиной проблемы. ваше здоровье! Мартин - person Hoff; 19.08.2010