我有一个在ICQ上与用户交流的小机器人,它使用Twisted.Words,Oscar协议。我需要查看他们的在线状态,但这似乎只有当我的好友列表中有他们时才有可能。所以问题来了:
如何将好友添加到Twisted.Words Oscar中的好友列表?
这很奇怪,但在API文档中似乎没有任何关于它的内容,我在oscar.py源代码中也找不到任何好的线索。:\
发布于 2012-11-06 00:33:00
在看了几个小时的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,它包含您的好友组、这些组中的好友以及其他内容,如设置或其他内容。这是根据奥斯卡的文件。
我要将我的伙伴添加到我列表中的第一个组中。如果你有自己的案例,或者想要创建一个更灵活的解决方案,你必须在这方面做更多的调查。
接下来,当您想要将一个新好友添加到您的好友列表中时,您可以这样做(假设这仍然在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开始,每次从组中最高的位置开始递增1。
这就是我的全部。我希望它能帮助别人一次。如果您能添加任何东西或纠正我,我将很高兴看到您的意见!
https://stackoverflow.com/questions/13228452
复制相似问题