错误:“对mailbox_fql的调用已超过每600秒300次调用的速率”

时间:2011-12-23 08:32:03

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

我在测试应用时收到了图谱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的多次调用。特别是,我认为单个调用返回< n>线程计为< n>致电mailbox_fql。如果是这种情况,有没有办法减少每次API调用mailbox_fql的调用次数(例如,只需获取收件箱中的&n;最新线程,而不是比整个第一页)?

关于这个主题的文档看起来很少,所以我不得不通过反复试验来解决问题。如果有人知道如何解决这个问题,我会很激动。

1 个答案:

答案 0 :(得分:4)

编辑:事实证明,您可以传递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=...

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

在实践中,我将<n>设置为5,这样在使用15秒的通话时间间隔内,在10分钟的时间内可以合理地拨打200 mailbox_fql。在我的测试中,我没有收到错误#613,所以我猜它有效。

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