【问题标题】:how to add a buddy to buddy list in twisted.words oscar (icq)如何在 twisted.words oscar (icq) 中将好友添加到好友列表
【发布时间】:2012-11-05 08:33:47
【问题描述】:

我有一个小型机器人在 ICQ 上与用户通信,它使用 Twisted.Words、Oscar 协议。我需要查看他们的在线状态,但这似乎只有在我的好友列表中有他们时才有可能。那么问题来了:

如何在 Twisted.Words Oscar 的好友列表中添加好友?

这很奇怪,但在 API 文档中似乎没有任何内容,而且我在 oscar.py 源代码中找不到任何好的线索。 :\

【问题讨论】:

    标签: twisted icq twisted.words


    【解决方案1】:

    在查看 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。

    这就是我的全部。我希望它可以帮助某人一次。如果您可以添加任何内容或纠正我,我会很高兴看到您的 cmets!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多