api - 与 Google 阅读器同步时如何跳过已知条目?

标签 api synchronization google-reader

为了将离线客户端写入 Google Reader 服务,我想知道如何最好地与该服务同步。

似乎还没有官方文档,到目前为止我找到的最好的来源是:http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI

现在考虑一下:根据上面的信息,我可以下载所有未读的项目,我可以指定要下载的项目数量,并使用 atom-id 可以检测到我已经下载的重复条目。

我缺少的是一种指定我只想要自上次同步以来的更新的方法。
我可以说给我 10 个(参数 n=10)最新的(参数 r=d)条目。如果我指定参数 r=o(日期升序),那么我也可以指定参数 ot=[last time of sync],但只有这样,当我只想阅读某些项目而不是所有项目时,升序没有任何意义项目。

知道如何在不再次下载所有项目而仅拒绝重复项的情况下解决该问题吗?不是一种非常经济的投票方式。

有人建议我可以指定我只想要未读的条目。但是为了使该解决方案以 Google Reader 不再提供此条目的方式工作,我需要将它们标记为已读。反过来,这意味着我需要在客户端上保持我自己的已读/未读状态,并且当用户登录到 Google 阅读器的在线版本时,条目已经被标记为已读。那对我不起作用。

干杯,
马里亚诺

最佳答案

要获取最新条目,请使用标准的 from-newest-date-descending 下载,该下载将从最新条目开始。您将在 XML 结果中收到一个“继续”标记,如下所示:

<gr:continuation>CArhxxjRmNsC</gr:continuation>`

浏览结果,找出任何新的东西。你会发现要么所有的结果都是新的,要么直到某个点都是新的,之后的一切你都已经知道了。

在后一种情况下,您已经完成了,但在前一种情况下,您需要找到比您已经检索的内容更旧的新内容。通过使用延续来获取结果,从您刚刚检索到的集合中的最后一个结果之后开始,将其作为 c 传递到 GET 请求中。参数,例如:
http://www.google.com/reader/atom/user/-/state/com.google/reading-list?c=CArhxxjRmNsC

继续这样,直到你拥有一切。
n参数是要检索的项目数的计数,与此配合得很好,您可以随时更改它。如果检查频率是用户设置的,因此可能非常频繁或非常罕见,您可以使用自适应算法来减少网络流量和处理负载。最初请求少量的最新条目,比如五个(将 n=5 添加到您的 GET 请求的 URL)。如果都是新的,在下一个请求中,
在您使用延续的地方,要求更大的数字,比如 20。如果这些仍然是全新的,要么提要有很多更新,要么已经有一段时间了,所以继续以 100 为一组。

但是,如果我在这里错了,请纠正我,您还想知道,在您下载了一个项目后,它的状态是否会因使用 Google 阅读器界面阅读它的人而从“未读”变为“已读”。

一种方法是:
  • 更新已在本地阅读的任何项目在 google 上的状态。
  • 检查并保存提要的未读计数。 (您希望在下一步之前执行此操作,以确保在下载最新项目和检查读取计数之间没有新项目到达。)
  • 下载最新项目。
  • 计算您的阅读次数,并将其与谷歌的进行比较。如果提要的阅读次数高于您计算的次数,您就知道在 google 上阅读了某些内容。
  • 如果有人在 google 上阅读过某些内容,请开始下载已读项目并将它们与您的未读项目数据库进行比较。你会发现一些谷歌说已读但你的数据库声称未读的项目;更新这些。继续这样做,直到您发现这些项目的数量等于您的阅读次数和谷歌的阅读次数之间的差异,或者直到下载量变得不合理。
  • 如果您没有找到所有已阅读的项目,请继续阅读;将剩余的数字记录为“未找到的未读”总数,您还需要将其包含在您认为未读的本地数字的下一次计算中。

  • 如果用户订阅了很多不同的博客,他也很可能对它们进行了广泛的标记,因此您可以在每个标签的基础上而不是整个提要上完成这一切,这应该有助于减少数据量,因为您无需为用户未在 google 阅读器上阅读任何新内容的标签进行任何传输。

    整个方案也可以应用于其他状态,例如已加星标或未加星标。

    现在,正如你所说,这

    ...would mean that I need to keep my own read/unread state on the client and that the entries are already marked as read when the user logs on to the online version of Google Reader. That doesn't work for me.



    够真实。既不保持本地已读/未读状态(因为您无论如何都要保留所有项目的数据库)也不标记在谷歌中读取的项目(API 支持)似乎非常困难,那么为什么这对您不起作用?

    然而,还有一个问题:用户可能会在谷歌上将已读的内容标记为未读。这会给系统带来一些麻烦。我的建议是,如果你真的想尝试解决这个问题,假设用户通常只会接触最近的东西,并且每次都下载最新的几百个左右的项目,检查所有的状态他们。 (这并不是那么糟糕;下载 100 个项目花了我 0.3 秒的 300KB 到 2.5 秒的 2.5MB,尽管在非常快的宽带连接上。)

    同样,如果用户有大量订阅,他也可能获得相当多的标签,因此在每个标签的基础上执行此操作将加快速度。实际上,我建议您不仅要根据每个标签进行检查,而且还要分散检查,每分钟检查一个标签,而不是每 20 分钟检查一次。如果您想降低带宽,您还可以对旧项目的状态变化进行这种“大检查”,而不是像“新东西”检查那样频繁地进行,也许每隔几个小时一次。

    这有点占用带宽,主要是因为您需要从谷歌下载完整的文章来检查状态。不幸的是,在我们提供给我们的 API 文档中,我看不到任何解决方法。我唯一真正的建议是尽量减少对非新项目的状态检查。

    关于api - 与 Google 阅读器同步时如何跳过已知条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384771/

    相关文章:

    C#按时间同步2个不同类型的列表

    google-reader - 如何访问 Feedly API?

    rss - 谷歌阅读器API?

    java - Google Reader API - 获取提要

    javascript - 未处理的PromiseRejection警告: Unhandled promise rejection - API

    javascript - 表单数据不会使用 onChange() 绑定(bind)到 React 组件

    Java:如何将 UTC 时间戳转换为本地时间?

    java - 创建和加入线程时副作用的可见性

    synchronization - 在 channel 上阻塞发送一个错误的同步范例以及为什么

    api - Instagram API 和分页