如何为好友添加对新服务的支持?

如何为好友添加对新服务的支持?

随着新的好友应用登陆 Ubuntu,我意识到添加对 Instagram 的支持在时间轴上会很酷。我也想过自己尝试一下,但我很难找到任何文档。

是否有规范描述每个协议需要什么?身份验证如何工作?是否需要先向 ubuntu-online-accounts 添加支持,或者是否有办法让朋友注册新协议?

它非常新,而且在 Google 上很难找到名字,因此,任何能指明正确方向的指示都将不胜感激。

答案1

朋友作者在这里。

确实,正如您所怀疑的那样,在向 Friends 添加支持之前,Ubuntu Online Accounts 中需要提供支持。Friends 架构非常依赖 UOA,以便为我们完成所有授权并管理所有 API 密钥。我最喜欢的例子是 LinkedIn,因为它是迄今为止唯一由社区贡献的协议。UOA 插件主要只是两个 XML 文件,加上一点点 autoconf 技巧,看起来像这样。(向下滚动一点查看差异,它清楚地显示了 LinkedIn 运行所需添加的每一项内容)。

对协议完成相同操作后,您需要针对 lp:account-plugins 提出合并建议,并让 Mardy 审核、批准和合并它们。完成这些后,您就可以开始编写好友插件了,该插件将使用 Python 3 编写。

现在,其中一个主要的主要的Friends 相对于 Gwibber 的改进是使用子类。在原始 Gwibber 代码中,子类完全没有用到,因此每个新的协议插件都是巨大的复制粘贴各种低级功能的 hackwork。在实现 Friends 时,我非常小心地将通用功能提取到超类中,以便可以轻松地对其进行子类化和修改。超类也有很多文档字符串,您在开始时应该参考这些内容。遗憾的是,我们尚未设置 sphinx 来在任何地方发布这些内容,因此您现在只能阅读代码。

需要记住的重要事项是,类的名称必须与使用的“提供程序名称”匹配,不区分大小写。因此,如果您将提供程序名称定义为instagram,则应创建文件protocols/instagram.py,并将 Python 类命名为Instagram

为了让插件真正发挥作用,你必须实现两个最重要的方法,即_whoamireceive。这些方法在 base.py 中有详细记录(链接见上文),但基本上该_whoami方法将被自动调用,并传入一个表示已解析 JSON blob 的字典,该字典是服务在身份验证时提供给我们的。如果你很幸运,该字典将包含你的 Instagram 用户名、用户 ID 和显示名称,但如果没有,你需要进行二次 API 调用才能收集这些信息。请参阅Facebook._whoami有关协议未预先提供信息并要求在方法内进行额外 API 调用的示例,请参阅Twitter._whoami作为协议的示例,它为我们提供了所需的所有详细信息。

之后,该receive方法负责进行 API 调用,以轮询服务中的新消息。这种方法的格式更加自由,因为每个 REST API 都略有不同,因此您应该参考网站的 API 文档,以了解这里到底需要做什么。在 http.py 中,我们提供了UploaderDownloader类,使 REST API 调用变得容易,甚至可以为您解析 JSON 服务器响应。使用这些便利类很重要,因为它们包装了libsoup,配置为遵守 GNOME 代理设置(您可能还记得 Gwibber 的代理支持一直很糟糕,好吧,我们现在已经解决了所有这些问题)。

收到服务器的 API 响应后,您需要将其存储在我们的 DeeModel 中(Gwibber 使用转储到 sqlite db 中的 JSON blob 来存储您的消息,而我们使用 DeeModel,它基本上只是一个在 DBus 之间共享状态的数据库,使多个客户端可以轻松显示消息数据)。我们将存储新消息的行为称为“发布”,我们为此提供了一种便捷方法Base._publish。基本上,您所要做的就是填写此处的空白,确保在尽可能多的列中填写尽可能多的信息。_publish 的可能参数是在架构中定义,并且您可以再次参考现有的插件来了解它们是如何做到的。

一旦您走到这一步,您应该已经有足够的能力对其进行测试了。我们在tools目录中提供了几个工具,以便您可以轻松地从源代码树中运行代码,这样您就不必在每次想要进行更改时都将其安装到系统中。您应该做的是打开一个终端,cd 到源代码树的根目录,然后运行./tools/debug_slave.py。它的作用是连接到 DeeModel,并显示发生在它身上的所有事情,这样您就可以看到消息在传入时实时显示。然后,在第二个终端中,再次 cd 到源代码树的根目录,然后运行,./tools/debug_live.py instagram receive这将手动触发 Instagram.receive 方法并显示一堆调试输出,告诉您运行时发生的情况(log.debug("hi")如果您想查看有关发生的情况的更多详细信息,您可以在代码中穿插对的调用)。

哦,如果你还在读的话,linkedin插件还没有进入主干,但是你仍然可以在这里查看它。

如果您有任何其他问题,我总是在 freenode 上的 #gwibber,而且我强烈地感觉到新的代码库比 Gwibber 曾经拥有的任何东西都更具可读性和更好的文档性,所以请阅读那里的代码,通过示例学习应该不会太难。Facebook 和 Twitter 是最完整的。

感谢您对 Friends 的关注!

相关内容