2

xmpppy を使用して、Google トークの連絡先のカスタム ステータス メッセージにアクセスしようとしています。私はここまでやってきました:

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')

戻り値なし

「生の名簿」を見ると、リソース ディクショナリが空であることがわかります

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

奇妙なことに、今日これが機能するようになりましたが、コードがわずかに異なっていた可能性がありますが、正確に何が違うのかわかりません...

どんな助けでも大歓迎です!

乾杯、

マーティン

4

2 に答える 2

3

私が最初に xmpp を使い始めたとき、私には明確ではなかったことが 1 つわかりました。フレンドシップは双方向です。

プレゼンス スタンザの使用
(a) 友達に「登録」することができ、友達は「登録済み」を返すことができます。
(b) 友達はあなたに「購読」することができ、あなたは「購読済み」を返すことができます。

(a) または (b) のいずれかが発生した場合、フレンドはあなたの名簿に登録されます。
(a) または (b) のいずれかが発生した場合、あなたはフレンド名簿に登録されます。

しかし...
あなたがあなたの友人に「購読」しない限り、あなたは彼らのステータスを見ることはありません
- (a) 起こる必要があります - 彼らがあなたに「購読」しない限り、彼らはあなたのステータスを見ることはありません - (b) 起こる必要があります.

ほとんどの XMPP クライアント (pidgin、trillian など) は、友人に「subscribed」を送信すると (友人が「subscribe」を送信した後)、自動的に「subscribe」を友人に送り返すようにします。XMPPPY は、そのままではこれを行いません。これを行うには、コーディングする必要があります。

これにより、ステータスが表示されなかった理由を説明できます。または、これがあなたの状況をカバーしていない場合は、他の誰かにとって参考になるかもしれません.

于 2010-08-18T03:17:44.090 に答える
2

タイミングの問題です。次のハンドラを追加します。

jabber.RegisterHandler('presence', myPresenceHandler)

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

接続する前に。次に、必ずjabber.Process()ループで呼び出します。問題は、あなたのコードでは、名簿オブジェクトを見る前にプレゼンス スタンザを受け取ったり、後で受け取ったりすることがあります。

于 2010-03-08T21:44:37.757 に答える