2

ICQ でユーザーと通信する小さなボットがあります。これは Twisted.Words、Oscar プロトコルを使用しています。彼らのオンライン ステータスを確認する必要がありますが、それは、バディ リストに登録している場合にのみ可能のようです。だからここに質問があります:

Twisted.Words Oscar の友達リストに友達を追加するにはどうすればよいですか?

これはかなり奇妙ですが、API ドキュメントには何もないようで、oscar.py ソース コードには良い手がかりが見つかりませんでした。:\

4

1 に答える 1

2

最後に、oscar.py のコードと OSCAR プロトコルのドキュメントを何時間も調べた後、解決策を思いつきました。

それでは、行きましょう。この例 の関数gotBuddyList(self, l)に移動します: http://twistedmatrix.com/documents/current/words/examples/oscardemo.py

SSI が受信されたときに呼び出されるコールバック関数である、独自の類似物がある場合があります。次のようにバインドされています。

self.requestSSI().addCallback(self.gotBuddyList)

したがって、この gotBuddyList(self, l) 関数内に次のように記述します。

self.groupAll = l[0][0]

私の場合、これにはバディ リスト (通常の ICQ クライアントから事前に手動で作成されたもの) の最初のバディ グループが含まれます。l変数は、サーバーから受信した SSI であり、バディ グループ、それらのグループ内のバディ、および設定などの他の要素が含まれています。それはOSCARのドキュメントによるとです。

リストの最初のグループに仲間を追加します。独自のケースがある場合、またはより柔軟なソリューションを作成したい場合は、それについてさらに調査する必要があります。

次に、バディ リストに新しいバディを追加する場合は、次のようにします (これがまだ BOSConnection の実装クラス メソッドの 1 つにあると仮定します)。

buddy = oscar.SSIBuddy(the_uin_to_add)  # put the UIN of the buddy to add in the argument
try:
    buddyID = max(self.groupAll.usersToID.itervalues()) + 1    # incrementing the buddyID
except ValueError:       # if the group is empty yet
    buddyID = 1
self.groupAll.addUser(buddyID, buddy)   # adding it to the group
self.addItemSSI(buddy)      # actually sending the stuff to the server

これで、バディがリストに追加されました。彼がオンラインの場合、すぐにupdateBuddyイベントを取得します。このイベントには、彼のオンライン ステータスなどに関する情報が含まれています。

ここで、buddyID が何なのかよくわかりませんでした。それを説明する情報はありません。しかし、最終的には、それはバディが所属するグループ内の単なる内部 ID であると想定しました。これは 32767 に制限されています。1 から開始し、毎回グループ内の最大値から 1 ずつ増加させることにしました。

私が持っているのはそれだけです。一度誰かの役に立てば幸いです。何か追加したり、私を修正したりできる場合は、コメントをお待ちしております。

于 2012-11-05T16:33:00.350 に答える