问题描述
随着新的 friends-app 登陆 Ubuntu,我想到时间线中的 adding support for Instagram 会很酷。我还想我可能会自己尝试一下,但我很难找到任何文档。
是否有描述每个协议所需内容的规范?身份验证如何工作?是否需要先将支持添加到 ubuntu-online-accounts 或者有没有办法让朋友注册新协议?
它非常新,而且 Google 的名字很难命名,因此任何指向正确方向的指针都将不胜感激。
最佳答案
朋友作者在这里。
确实,正如您所怀疑的,在将支持添加到 Friends 之前,需要在 Ubuntu 在线帐户中提供支持。 Friends 架构在很大程度上依赖于 UOA,以便为我们完成所有授权和管理所有 API 密钥。我最喜欢的例子是 LinkedIn,因为它是迄今为止社区贡献的唯一协议。 The UOA plugin is mostly just two XML files, plus a little bit of autoconf trickery, which looks like this.(向下滚动一点查看差异,它清楚地显示了为使 LinkedIn 工作需要添加的每一件事)。
一旦你对你的协议做了同样的事情,你需要针对 lp:account-plugins 提议合并,并让 Mardy 审查、批准和合并它们。一旦准备就绪,您就可以开始编写 Friends 插件了,该插件将使用 Python 3 编写。
现在,Friends 对 Gwibber 的主要改进之一是子类的使用。在最初的 Gwibber 代码中,绝对没有对子类做任何事情,所以每个新的协议插件都是对各种低级功能的巨大复制和粘贴。在实现 Friends 时,我非常小心地将通用功能提取到一个超类中,该超类可以轻松地进行子类化和修改。 The superclass also has quite a lot of docstrings, 入门时应参考。不幸的是,我们还没有设置 sphinx 在任何地方发布这些,所以你现在只需要阅读代码。
需要记住的一些重要事项是,您的班级名称必须与使用的 “providername” 大小写敏感ly 匹配。因此,如果您将 providername 定义为 instagram
,那么您应该创建文件 protocols/instagram.py
,并将您的 Python 类命名为 Instagram
。
为了让你的插件真正做任何事情,你绝对必须实现的两个最重要的方法被称为 _whoami
和 receive
。这些在 base.py(上面链接)中有很好的记录,但基本上 _whoami
方法将被自动调用,并传入一个表示 already-parsed JSON blob 的字典,该字典在发生身份验证时由服务提供给我们。如果幸运的话,该 dict 将包含您的 Instagram 用户名、用户 ID 和显示名称,但如果没有,您将需要进行辅助 API 调用以收集这些信息。请参阅 Facebook._whoami
了解协议示例,该协议未预先提供信息并需要从方法中进行额外的 API 调用,请参阅 Twitter._whoami
了解协议示例,该协议为我们提供了我们需要的所有详细信息。
之后,receive
方法负责进行 API 调用以轮询服务以获取新消息。这个有点多 free-form,因为每个 REST API 都略有不同,所以你应该参考网站的 API 文档来弄清楚这里到底需要做什么。在 http.py 中,我们提供了 Uploader
和 Downloader
类,可以轻松进行 REST API 调用,甚至可以为您解析 JSON 服务器响应。使用这些便利类很重要,因为它们包装了 libsoup
,它被配置为支持 GNOME 代理设置(您可能还记得 Gwibber 的代理支持一直是多么糟糕,我们现在已经修复了所有这些)。
从服务器获得 API 响应后,您需要将其存储在我们的 DeeModel 中(Gwibber 使用转储到 sqlite db 的 JSON blob 来存储您的消息,我们使用的是 DeeModel,它基本上只是一个数据库跨 DBus 共享状态,使多个客户端轻松显示消息数据)。我们将存储新消息的行为称为 “publishing”,我们在 Base._publish
处为它提供了一个方便的方法。基本上你所要做的就是在这里填空,确保尽可能多的信息被填入尽可能多的列中。 _publish 的可能参数是 defined in the schema ,您可以再次参考现有插件以了解它们是如何做到的。
一旦你走到这一步,你应该有足够的能力来测试它。我们在 tools
目录中提供了一些工具,以使您可以轻松地从源代码树中运行代码,因此您不必每次想要进行更改时都将其安装到系统中。您应该做的是打开一个终端,cd 到源代码树的根目录,然后运行 ./tools/debug_slave.py
。它所做的是连接到 DeeModel,并只显示发生在它身上的所有事情,这样您就可以看到消息在进入时实时显示。然后,在第二个终端中,再次 cd 到源代码树的根目录,然后运行 ./tools/debug_live.py instagram receive
这将手动触发 Instagram.receive 方法并显示一堆调试输出,以告诉您在运行时发生了什么(如果您想查看有关发生情况的更多详细信息,可以在代码中调用 log.debug("hi")
)。
哦,如果你还在阅读,the linkedin plugin hasn’t landed in trunk yet, but you can still take a look at it here.
如果您有任何其他问题,我总是在 freenode 上的#gwibber 中,而且我非常强烈地认为新代码库比 Gwibber 曾经拥有的任何东西都更具可读性和更好的文档记录,所以请阅读那里的代码,它应该举例来说太难了。 Facebook 和 Twitter 是最完整的。
感谢您对朋友的关注!