如何为Friends添加新服务的支持?

随着新的朋友应用登陆Ubuntu,我想到在时间线中添加对Instagram的支持将很酷。我也想尝试一下,但是我很难找到任何文档。

有没有描述每个协议所需内容的规范?认证是如何工作的?是否需要先向ubuntu-online-accounts添加支持,还是朋友们可以注册新的协议?

这是非常新的东西,它的名称很难通过谷歌搜索,所以任何指导方向的提示都将不胜感激。


这是我目前能找到的最好的:https://bugs.launchpad.net/ubuntu/+source/friends/+bug/1156979 和 https://code.launchpad.net/~robru/gwibber/friends 但看起来你可以使用Gwibber所使用的任何东西(?) - Rinzwind
支持的协议代码似乎存在于以下位置:http://bazaar.launchpad.net/~super-friends/friends/trunk/files/head:/friends/protocols/但是我真正希望看到的是描述功能等内容的规范... - andrewsomething
还只是刚刚开始的阶段 ;) - Rinzwind
请给我一个Tumblr账号。 - Khurshid Alam
1个回答

朋友们,作者在这里。

确实,正如你所怀疑的那样,在将支持添加到Friends之前,需要在Ubuntu在线账户中进行支持。Friends的架构非常依赖UOA,以便为我们执行所有的授权和管理所有的API密钥。我最喜欢的例子是LinkedIn,因为它是迄今为止唯一由社区贡献的协议。UOA插件主要只有两个XML文件,再加上一点autoconf的技巧,看起来就像这样。(向下滚动一点,可以清楚地显示出为使LinkedIn工作而需要添加的每一个细节)。

一旦你对自己的协议做了同样的事情,你需要提出合并请求,针对lp:account-plugins,并让Mardy进行审查、批准和合并。一旦完成这些步骤,你就可以开始编写Friends插件,该插件将使用Python 3编写。

现在,Friends相对于Gwibber的一个重大改进是引入了子类的使用。在原始的Gwibber代码中,几乎没有使用子类,因此每个新的协议插件都是一个庞大的复制粘贴工作,包含了各种低级功能的片段。在实现Friends时,我非常注意将通用功能提取到一个超类中,这样可以轻松地进行子类化和修改。超类还有很多文档字符串,在开始时您应该参考它们。不幸的是,我们还没有设置sphinx来发布这些文档,所以您现在只能阅读代码。
需要记住的一些重要事项是,您的类名必须与使用的“providername”匹配(不区分大小写)。因此,如果您定义了providername为instagram,那么您应该创建文件protocols/instagram.py,并将Python类命名为Instagram
你绝对必须实现的两种最重要的方法,以便使你的插件真正起作用,分别被称为_whoamireceive。这些方法在base.py(上面链接)中都有详细说明,但基本上_whoami方法将会自动调用,并传入一个代表已解析JSON块的字典,该块是在授权发生时由服务提供给我们的。如果你运气好,该字典将包含你的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使用JSON blob转储到sqlite数据库来存储消息,而我们使用的是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的关注!