Чат XMPP: доступ к сообщениям о статусе контактов с помощью xmppPy's Roster - PullRequest
2 голосов
/ 04 марта 2010

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

import xmpp
import sys

userID   = 'myname@gmail.com' 
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('oneofmyfriends@gmail.com')

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

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

u'oneofmyfriends@googlemail.com': {'ask': None, 'resources': {}, 'name': u'Some Name', 'groups': [], 'subscription': u'both'}

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

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

Приветствия

Martin

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

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

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

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

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

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

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

2 голосов
/ 09 марта 2010

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

jabber.RegisterHandler('presence', myPresenceHandler)

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

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

...