【问题标题】:Error: "Calls to mailbox_fql have exceeded the rate of 300 calls per 600 seconds"错误:“对 mailbox_fql 的调用已超过每 600 秒 300 次调用的速率”
【发布时间】:2011-12-23 08:32:02
【问题描述】:

我在测试我的应用程序时收到 Graph API 错误 #613(消息:“Calls to mailbox_fql have exceeded the rate of 300 calls per 600 seconds”,类型:OAuthException)。这是一个桌面应用程序,唯一的副本是在我的机器上运行的那个(所以只有一个 access_token 和一个用户 - 我)。

我每隔 15 秒左右查询一次inbox 端点。结合起来,该应用程序每分钟进行大约 12 次 API 调用(对各种端点)。无论哪个调用获取第 300 个线程,它都会始终失败(inbox 端点的第一页上大约有 25 个线程,我只获取第一页)。我没有批量调用 Graph API。

我正在使用 Objective-C 在 Mac OS X 10.7 上进行开发。我使用NSURLConnection 异步调用Graph API。据我所知,NSURLConnection 处理的每个请求都应该只对 Facebook 的 API 产生一个请求。

继续进行上述操作,我无法弄清楚我收到此错误的原因。我怀疑这是因为对inbox 端点的一次调用(对 URI https://graph.facebook.com/me/inbox?access_token=... 的调用)被计为对mailbox_fql 的多次调用。特别是,我认为返回 线程的单个调用算作针对 mailbox_fql 调用。如果是这种情况,有没有办法减少每次 API 调用对 mailbox_fql 的调用次数(例如,方法是仅获取收件箱中的 个最新线程,而不是整个线程第一页)?

关于这个主题的文档似乎很少,所以我主要是通过反复试验来解决问题。如果其他人知道如何解决这个问题,我会很高兴。

【问题讨论】:

    标签: objective-c facebook macos facebook-graph-api inbox


    【解决方案1】:

    编辑:事实证明,您可以传递一个limit GET 参数,不出所料,它会限制结果的数量。但是,Developer blog 指出了这种方法的一些限制(即,如果您的用户看不到某些结果,则返回的结果可能少于请求的结果)。

    该博客建议在调用标准 Graph API 时使用 until 和/或 since 作为 GET 参数。这些参数采用任何符合 strtotime() 的字符串(或 Unix 纪元时间)并相应地限制您的结果。

    原答案如下:

    经过进一步研究,看来我的选择是减少获取频率或使用自定义 FQL 查询来限制对 mailbox_fql 的调用次数。我还没有找到任何方法来限制标准 Graph API 调用对inbox 端点的响应。在本例中,我使用以下形式的 FQL 查询:

    https://graph.facebook.com/fql?q=SELECT <fields> FROM thread WHERE folder_id=1 LIMIT <n>&access_token=...
    

    &lt;fields&gt; 是一个以逗号分隔的字段列表(在 Facebook 的线程 FQL 文档中描述)。 threadinbox 端点对应的表的文字名称;新的thread 端点对应于unified_thread 表,但尚未公开。 folder_id=1 表示我们要使用收件箱(而不是发件箱或更新文件夹)。

    在实践中,我将 &lt;n&gt; 设置为 5,如果使用 15 秒的调用间隔,这会导致在 10 分钟的跨度内合理地调用 200 次 mailbox_fql。在我的测试中,我没有收到错误 #613,所以我猜它有效。

    我想这里的大多数人已经熟悉 FQL 的来龙去脉,但这对我来说是新的。我希望这可以帮助其他一些处理类似问题的新手!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2021-07-16
      • 2019-02-22
      • 2011-12-02
      相关资源
      最近更新 更多