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


19

随着新的friends-app在Ubuntu中的登陆,我想到在时间轴上添加对Instagram的支持将是很酷的。我还以为自己可能会对此感到怀疑,但是我很难找到任何文档。

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

它非常新,很难用Google命名,因此任何指向正确方向的指针都将不胜感激。


这是我目前所能找到的最好的东西:bugs.launchpad.net/ubuntu/+source/friends/+bug/1156979code.launchpad.net/~robru/gwibber/friends但看起来您可以使用所使用的任何东西for Gwibber(?)
Rinzwind 2013年

好吧,受支持协议的代码似乎存在于:bazaar.launchpad.net/~super-friends/friends/trunk/files/head/ ...但是我真正想看到的是描述功能等的规范。 ..
andrewsomething

现在还处于初期;)
Rinzwind 2013年

有人给我tumblr plz。
Khurshid Alam

Answers:


34

朋友在这里作者。

确实,正如您所怀疑的那样,必须先在Ubuntu Online Accounts中获得支持,然后才能将支持添加到Friends。Friends架构非常依赖于UOA来完成所有授权并为我们管理所有API密钥。我最喜欢的示例是LinkedIn,因为它是迄今为止社区贡献的唯一协议。UOA插件大部分只是两个XML文件,外加一些autoconf欺骗,看起来像这样。(对diff进行一些滚动,可以清楚地显示出要使LinkedIn正常运行所需添加的所有内容)。

一旦对协议完成了相同的工作,就需要对lp:account-plugins提出合并建议,并让Mardy审查,批准和合并它们。安装好之后,您可以开始编写friends插件,该插件将使用Python 3编写。

现在,Friends通过Gwibber引入的主要改进之一是子类的使用。在原始的Gwibber代码中,子类绝对不做任何事情,因此每个新的协议插件都是各种底层功能的巨大复制与粘贴hackjob。在实现Friends时,我非常小心地将通用功能提取到超类中,可以轻松地将其子类化和修改。超类还具有很多文档字符串,在开始时应参考这些文档字符串。不幸的是,我们尚未设置sphinx以便将其发布到任何地方,因此您现在只需要阅读代码即可。

要记住的一些重要事项是,类名必须与所用的“ providername”相匹配,不区分大小写。因此,如果将providername定义为instagram,则应该创建文件protocols/instagram.py,并命名Python类Instagram

为了使您的插件实际执行任何操作,您必须绝对实现的两个最重要的方法称为_whoamireceive。这些在base.py(上面链接)中有很好的文档,但是基本上该_whoami方法将被自动调用,并传递一个dict来表示已解析的JSON blob,该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最完整。

感谢您对“朋友”的关注!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.