Python を使用して、複数の連絡先のオンライン/オフラインの可用性に基づいてメッセージを送信する jabber ボットをセットアップする必要があります。
私はpyxmppとxmpppyを調べてきましたが、特定の連絡先のステータスを確認する方法を見つけることができませんでした.
これを達成する方法についての指針はありますか?
bot.status_of("contact1@gmail.com")
理想的には、例えば返すようなものが欲しい"online"
連絡先の存在 (連絡可能性に関する情報を含む) がボットによって非同期に受信されるため、希望する方法でそれが可能だとは思いません。
プレゼンス ハンドラー関数を作成し、それを接続に登録する必要があります。この関数は、連絡先からプレゼンスを受信するたびに呼び出されます。通話のパラメーターは、連絡先がオンラインかどうかを示します。それに応じて、連絡先にメッセージを送信できます。
あなたを使っxmpppy
てそれを次のようにします:
def connect(jid, password, res, server, proxy, use_srv):
conn = xmpp.Client(jid.getDomain())
if not conn.connect(server=server, proxy=proxy, use_srv=use_srv):
log( 'unable to connect to server.')
return None
if not conn.auth(jid.getNode(), password, res):
log( 'unable to authorize with server.')
return None
conn.RegisterHandler( 'presence', callback_presence)
return conn
conn = connect(...)
def callback_presence(sess, pres):
if pres.getStatus() == "online":
msg = xmpp.Message(pres.getFrom(), "Hi!")
conn.send(msg)
PS: 私はコードをテストしていませんが、これと非常によく似たものになるはずです。
あなたが望むことは、を介して行われます<presence type="probe"/>
。これはクライアントに代わって実行され、クライアントによって実行されるべきではありません (XMPP IM の RFC に従って)。これはボットなので、プレゼンス プローブを実装して、特定のエンティティの現在のプレゼンスを受け取ることができます。サーバーはプレゼンス プローブに対してクライアントに代わって応答するため、プローブをベア JID (sans リソース) に送信することを忘れないでください。これは、ワークフローが次のようになることを意味します。
<presence/> // I'm online! BOT
<presence from="juliet@capulet.org/balcony"/> RESPONSE
<presence from="romeo@montague.net/hallway"/> // and so on... RESPONSE
<presence type="probe" to="benvolio@montague.net"/> BOT
<presence from="benvoio@montague.net/hallway"> RESPONSE
<status>Huzzah!</status>
<priority>3</priority>
</presence>
コール フローがどのように動作するかについての詳細な情報については、 RFCのその部分を参照してください。
あなたがする必要があるのは:
現在、必要なプレゼンス情報によって異なります。簡単にするために、「オンライン」/「オフライン」の値だけが必要であるとしましょう。キャッシュは、キーがベア (リソースなし) JID であるディクショナリであり、値はこの JID に接続されたリソースのセットです。例えば:
{'foo@bar.com': set(['work', 'notebook']), 'bob@example.net': set(['gtalk'])}
ここで、特定の JID/リソースから「利用可能な」プレゼンスを受け取った場合:
if jid not in cache:
cache[jid] = set()
cache[jid].add(resource)
逆に、「利用不可」のプレゼンスを受け取った場合:
if jid in cache: # bad people send "unavailable" just to make your app crash
cache[jid].discard(resource)
if 0 == len(cache[jid]):
del cache[jid]
そしていま:
def is_online(jid):
return jid in cache
もちろん、より詳細な情報が必要な場合は、連絡先の利用可能なリソースのリストだけでなく、各リソースのステータス、ステータス メッセージ、優先度なども維持できます。