我有一个小型机器人在 ICQ 上与用户通信,它使用 Twisted.Words、Oscar 协议(protocol)。我需要查看他们的在线状态,但这似乎只有当我将他们列入我的好友列表时才有可能。那么问题来了:
如何将好友添加到 Twisted.Words Oscar 中的好友列表?
这很奇怪,但 API 文档中似乎没有任何相关内容,而且我在 oscar.py 源代码中找不到任何好的线索。 :\
最佳答案
经过几个小时的查看 oscar.py 代码和 OSCAR 协议(protocol)文档后,我终于想出了一个解决方案。
所以我们开始吧。转到本例中的函数 gotBuddyList(self, l): http://twistedmatrix.com/documents/current/words/examples/oscardemo.py
您可能有自己的类似物,即收到 SSI 时调用的回调函数。它的绑定(bind)如下:
self.requestSSI().addCallback(self.gotBuddyList)
因此,在这个gotBuddyList(self, l)函数中,您可以输入以下内容:
self.groupAll = l[0][0]
就我而言,这包含我的好友列表中的第一个好友组(它是从常规 ICQ 客户端提前手动创建的)。 l 变量是从服务器接收到的 SSI,它包含您的好友组、这些组中的好友以及其他内容(例如设置等)。这是根据 OSCAR 文档得出的。
我要将我的好友添加到列表中的第一组中。如果您有自己的案例或想要创建更灵活的解决方案,则必须对此进行更多调查。
接下来,当您想要将新好友添加到好友列表时,您可以执行以下操作(假设这仍在 BOSConnection 的实现类方法之一内):
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 开始,每次从组中最高的 ID 开始加 1。
这就是我所拥有的一切。我希望它可以帮助别人一次。如果您可以添加任何内容或纠正我,我将很高兴看到您的评论!
关于twisted - 如何将好友添加到twisted.words oscar (icq) 中的好友列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13228452/