воскресенье, 7 апреля 2013 г.

Facebook API

Речь пойдет про использование facebook api для мобильного приложения под андроид. Если вы взялись за api, причём не важно для чего, знайте - вы вляпались. Много багов, ограничений, нюансов.

Я не буду останавливаться на элементарных вещах, как получение api key, отправка запросов и прочее, про которые можно узнать, почитав доки. Интересны нюансы, обычно, в них проблемы.

Использую в подавляющем большинстве FQL, а не Graph API. Потому что FQL позволяет запрашивать только нужные поля, которые надо, или достаточно сложные запросы, как: получить все альбомы моих друзей или получить все мероприятия, в которых среди участников есть определённый юзер. Но совсем без Graph API не обойтись. К примеру я не знаю, как получить документы групп с помощью FQL.

Первое, что надо уяснить, свести к минимуму количество запросов к серверу. Потому что у facebook есть определённые ограничения на максимальное количество запросов в определенный интервал времени. В один прекрасный момент просто начнут приходить json-ы с ошибкой. И придется ждать время. Понятно, что на родное приложение facebook с api key 350685531728 это не распространяется.

Часто встречаются ограничения на количество возвращаемых данных, limit в этом случае игнорируется:
- список тредов (50)?
- список альбомов, где фиды альбомов получаются выборкой из другой batch данного запроса. Возвращает только 200 альбомов.
"fids": SELECT object_id FROM album WHERE owner = ...
"albums: "SELECT object_id,name,... FROM album WHERE object_id IN (SELECT object_id FROM #fids)
- список фото по списку фидов альбомов: нельзя указывать больше 50 фидов.
SELECT album_object_id, object_id, caption,... FROM photo WHERE album_object_id IN (...)
- список всех альбомов по списку юзеров. На тестовом аккаунте: друзей ~800. Альбомов ~9000. Если же сделать запрос ниже, то вернёт ~2000 альбомов для ~70 юзеров.
SELECT object_id,owner FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me()) OR owner = me()

Мне нужно было получить документы всех групп. Для этого использовал batch requests, где каждая из 50 batch запрашивала документы какой-то одной группы. По непонятной причине, иногда ответ получается "урезанный", большинство batch пустые. Если же следом отправить такой же запрос, то всё корректно.

Не корректно работают тэги для видео. Если запрашивать их через graph api как: video_id/tags, то возвращает не всех юзеров. Хотя, если использовать fql: SELECT subject FROM video_tag WHERE vid = video_id, то вижу всех юзеров.

 недописано...