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 的实现类方法之一中):

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 回答