XMPP Чат: Доступ к сообщениям о состоянии контактов с рецептуре XMPPPY

StackOverflow https://stackoverflow.com/questions/2381597

  •  24-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить доступ к своим сообщениям пользовательских контактов Google Talk Contace с 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 Country Object теперь содержит мои контакты, но сообщение пользовательского состояния не включено.

myroster.getStatus('oneofmyfriends@gmail.com')

Возвращает ничего

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

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

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

Любая помощь была бы очень ценится!

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

Мартин

Это было полезно?

Решение

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

jabber.RegisterHandler('presence', myPresenceHandler)

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top