Ошибка: «Звонки на mailbox_fql превысили 300 звонков за 600 секунд» - PullRequest
5 голосов
/ 23 декабря 2011

При тестировании моего приложения я получаю сообщение об ошибке API Graph # 613 (сообщение: "Calls to mailbox_fql have exceeded the rate of 300 calls per 600 seconds", введите: OAuthException).Это приложение для настольного компьютера, и единственная копия - это копия, запущенная на моем компьютере (так что есть только один access_token и один пользователь - я).

Я запрашиваю конечную точку inbox каждые 15 секунд,В совокупности приложение выполняет около 12 вызовов API (для различных конечных точек) в минуту.Он последовательно терпит неудачу при любом вызове, выбирающем 300-й поток (на первой странице конечной точки inbox имеется около 25 потоков, и я только выбираю первую страницу).Я не собираю никаких вызовов API Graph.

Я занимаюсь разработкой под Mac OS X 10.7 с использованием Objective-C.Я использую NSURLConnection для асинхронного вызова API Graph.Насколько я знаю, каждый запрос, обработанный NSURLConnection, должен приводить только к одному запросу к API Facebook.

Продолжая описывать выше, я не могу понять, почему я получаю эту ошибку.Я подозреваю, что это потому, что один вызов к конечной точке inbox ( т.е. вызов URI https://graph.facebook.com/me/inbox?access_token=...) считается более чем одним вызовом mailbox_fql.В частности, я думаю, что один вызов, который возвращает потоков, считается как вызовов против mailbox_fql.Если это так, есть ли способ уменьшить количество вызовов до mailbox_fql на вызов API ( например , выбирая только самые последние темы в папке входящих, а не целые первыестраница)?

Документация по этой теме выглядит довольно скудной, поэтому мне пришлось обходиться в основном методом проб и ошибок.Я был бы рад, если бы кто-то еще знал, как решить эту проблему.

1 Ответ

4 голосов
/ 24 декабря 2011

Редактировать: Оказывается, вы можете передать параметр limit GET, который, что неудивительно, ограничивает количество результатов.Тем не менее, Блог разработчиков отмечает некоторые ограничения при таком подходе (а именно, что меньше результатов, чем запрошено, может быть возвращено, если некоторые не видны вашему пользователю).

Блог рекомендует использовать untilи / или since в качестве параметров GET при вызове стандартного API Graph.Эти параметры принимают любую strtotime() -стандартную строку (или время эпохи Unix) и соответственно ограничивают ваши результаты.

Исходный ответ следует:

После некоторых дальнейших исследований мне кажется, что я могу выбирать реже или использовать собственные FQL-запросы, чтобы ограничить количество обращений к mailbox_fql.Я не смог найти способа ограничить ответ стандартного вызова API Graph конечной точкой inbox.В данном случае я использую FQL-запрос следующей формы:

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

<fields> - это список полей, разделенных запятыми (описан в ветке FQL документа Facebook).thread - буквальное имя таблицы, соответствующее конечной точке inbox;новая конечная точка thread соответствует таблице unified_thread, но она еще не является общедоступной.folder_id=1 означает, что мы хотим использовать входящие (в отличие от папок «Исходящие» или «Обновления»).

На практике я устанавливаю <n> на 5, что приводит к разумным 200 вызовам mailbox_fql в 10-минутном интервале при использовании 15-секундных интервалов вызова.В моих тестах я не получал сообщение об ошибке № 613, так что я думаю, что оно работает.

Я предполагаю, что большинство людей здесь уже были знакомы с плюсами и минусами FQL, но это было для меня новым.Я надеюсь, что это поможет некоторым другим новичкам, имеющим дело с подобными проблемами!

...