Основную долю разрабатываемого сейчас программного обеспечения составляют приложения, так или иначе ориентированные на web. Громадные дата-центры с петабайтами данных, миллионы человеко-часов, потраченные на разработки самомасштабирующихся приложений, - всё это показывается пользователю в виде скромного web-интерфейса. Следом за web-ориентированными приложениями появился ещё один феномен - социализация. Благодаря таким сервисам, как livejournal, Facebook и Twitter, человек перенёс часть своей личной жизни и общения в Интернет. Первопроходцы в сфере социальных сетей захватили этот сегмент рынка и развили огромную инфраструктуру, предоставляющую богатые возможности для общения, обмена и оценки любого содержимого, а главное - изменяющуюся по требованию пользователя.
Появление новых социальных сервисов либо их элементов стало невыгодно ни титанам, захватившим эту область, ни пользователям, которым надоело регистрироваться каждый раз при заходе на новый сайт, ни владельцам этих сайтов - содержание базы данных пользователей и обеспечение их регистрации и взаимодействия подразумевают немалые расходы. Решение пришло в виде создания API (application programming interface), средствами которого социальная сеть предоставляла очередному сайту доступ к своим пользователям и сервисам, сайт фактически становился частью социальной сети. Пользователям не нужно больше регистрироваться и разбираться в незнакомом интерфейсе, теперь они заходят на сайт и видят привычные кнопки; владельцам небольшого сайта не нужно содержать базу данных пользователей и привлекать их для регистрации, а социальные сети получили вместо конкурентов дополнительную рекламу.
В данной статье будут рассмотрены основные возможности Facebook API для интеграции сайта с этой социальной сетью.
Платформа Facebook
Перед тем как рассматривать способы взаимодействия с какой-либо системой, нужно представлять, как она устроена изнутри. В качестве операционной системы создатели Facebook выбрали Linux, основная часть кода написана на PHP (который средствами HipHop компилируется в c++). База данных MySQL используется как хранилище пар ключ-значение, никаких сложных структур и join запросов. Для кэширования применяется memcached.
Для представления масштабов системы следует обратить внимание на следующую статистику:
- ежемесячная аудитория Facebook составляет более 500 млн пользователей;
- более 200 млрд просмотров страниц в месяц;
- более 4 трлн действий попадает в новостные ленты каждый день;
- более 150 млн обращений к кэшу в секунду; 2 трлн объектов в кэше;
- более 3 млрд фотографий загружается каждый месяц, до 1.2 млн фотографий в секунду;
- более миллиарда сообщений в чате каждый день;
- более 100 млн поисковых запросов в день.
Graph API
Graph API - это основа платформы facebook, средствами которой можно читать и писать информацию в социальную сеть. По сути, graph api представляет собой объекты (пользователи, фотографии, события, страницы) и связи между ними (отношения, общее содержимое и фото-теги). Каждый объект в графе имеет уникальный идентификатор, используя который, можно получить к нему доступ следующим образом - https://graph.facebook.com/ID. Ответ придёт в виде json. Например, запросив объект официальной страницы платформы facebook (идентификатор которой 19292868552), получим:
{ "name": "Facebook Platform", "type": "page", "website": "http://developers.facebook.com", "username": "platform", "founded": "May 2007", "company_overview": "Facebook Platform enables anyone to build...", "mission": "To make the web more open and social.", "products": "Facebook Application Programming Interface (API)...", "fan_count": 449921, "id": 19292868552, "category": "Technology" }
Существуют альтернативные идентификаторы, более приятные глазу, например, ту же страницу можно получить так https://graph.facebook.com/platform.
Все объекты в графе могут быть связаны между собой отношениями, проверить наличие данной связи можно следующим способом:
https://graph.facebook.com/идентификатор_объекта/тип_связи,
например:
Друзья: https://graph.facebook.com/me/friends?access_token=...
Новостная лента: https://graph.facebook.com/me/home?access_token=...
Like'и: https://graph.facebook.com/me/likes?access_token=...
Access_token - параметр, относящийся к авторизации, которая будет рассмотрена далее.
Основные объекты Facebook:
- Album (фотоальбом);
- Application (описание приложения, зарегистрированного в социальной сети);
- Checkin (географическая информация о местах, где побывал пользователь);
- Comment (комментарий на любой объект графа);
- Event (событие, например, описание времени и места какого-нибудь концерта);
- Insights (статистическая информация о приложениях, зарегистрированных в facebook, например, количество пользователей, нажатий кнопки like, и т.п.);
- остальные объекты - Link, Message, Note, Page, Photo, Post, Review, Status message, Subscription, Thread, User, Video, Group, FriendList.
Над всеми описанными выше объектами разрешены определённые операции. Основная операция - получить объект, поэтому рассмотрим некоторые возможности API, которые сделают это более удобным:
Selection - позволяет точно указать, какие поля объекта возвращать:
https://graph.facebook.com/bgolub?fields=id,name,picture
Также есть возможность запрашивать несколько объектов одновременно:
https://graph.facebook.com?ids=arjun,vernal - вернёт информацию о двух объектах в одном ответе. Интересно, что в параметр ids можно передать URL, так достаточно удобно искать идентификаторы сайтов в графе https://graph.facebook.com/?ids=http://www.imdb.com/title/tt0117500/.
Для удобства введён специальный идентификатор - me:
https://graph.facebook.com/me - так мы получим объект активного пользователя (который зашёл на наш сайт). Т.е. для того чтобы получить список друзей, посетителя нашего сайта, достаточно сделать такой запрос https://graph.facebook.com/me/friends?access_token=... Естественно, при условии, что наш сайт зарегистрирован в социальной сети, и пользователь на нём авторизовался.
Существует универсальный способ показать картинку любого объекта:
<img src="https://graph.facebook.com/100001689342861/picture" />
Естественно, этот подход работает и с профилями, событиями, группами и др. объектами графа. Дополнительный синтаксический сахар в возможных параметрах: square (50x50), small (50 пикселов в ширину, высота подбирается автоматически), large (200 пикселов в ширину, высота варьируемая). Пример запроса:
http://graph.facebook.com/100001689342861/picture?type=large
Естественно, что информации больше, чем мы можем принять за один запрос, поэтому рассмотрим механизм постраничного получения данных:
- Вариант со смещением и установкой размера страницы - limit, offset: https://graph.facebook.com/me/likes?limit=3
- Вариант с заданием временных рамок - until, since: https://graph.facebook.com/search?until=yesterday&q=orange
Стоит отметить, что если информация пришла не вся, то в json-ответе будет объект data с нашими данными и объект paging, содержащий поля previous и next, в которых содержатся ссылки для получения предыдущей и следующей страницы, соответственно. Это очень удобно, если нужно вытянуть из социальной сети всю информацию по определённому ключевому слову, её объём заранее неизвестен.
По умолчанию, дата в запросах представлена согласно стандарту ISO-8601, т.е. выглядит примерно так 2011-02-22T23:59:56+0000
Существует возможность задать формат возвращаемой даты:
http://graph.facebook.com/platform/feed?date_format=U, где в качестве параметра date_format можно передать то же, что и в php функцию stringdate ( string $format), довольно удобно и избавляет от постоянной конвертации даты из одного формата в другой.
Introspection - это красивое слово можно перевести как "само-выгребатор". Мы можем вытягивать информацию о пользователе сами, по кусочкам, запросить его сообщения, фотографии, его друзей, места, где он побывал, а можем просто попросить graph api вернуть нам объект, со всеми возможными связями для данного типа объекта, таким вот способом: https://graph.facebook.com/331218348435?metadata=1. Данная возможность - настоящая находка для тех, кому надо получить всю возможную информацию о каком-либо объекте.
Поиск. Формат запроса для поиска следующий - https://graph.facebook.com/search?q=ключевое_слово&type=тип_объекта. Поиск можно осуществлять по всем общедоступным объектам (post, user, page, event, group, place, checkin). Также можно использовать поиск по индивидуальной ленте новостей пользователя https://graph.facebook.com/me/home?q=facebook. Естественно, не без разрешения пользователя, но об этом - в разделе авторизации.
Публикация. Картина была бы не полной, если бы мы ничего не могли дописывать в граф. К счастью, это возможно с помощью HTTP POST запроса. Например, если нам надо опубликовать новое сообщение в новостной ленте пользователя Vasya_Pupkin (т.е. дописать сообщение в объект https://graph.facebook.com/Vasya_Pupkin/feed), то это можно сделать следующим запросом:
curl -F 'access_token=...' \ -F 'message=Hello, Vasya_Pupkin. I like this new API.' \ https://graph.facebook.com/Vasya_Pupkin/feed
Рассматривать, как изменять все типы объектов и какие конкретно поля содержат данные объекты, смысла нет, это можно посмотреть в документации, по ссылке http://developers.facebook.com/docs/reference/api/post/. По приведённой выше ссылке находится документация, позволяющая составить любой post запрос к graph API. Для операции записи необходимы дополнительные разрешения со стороны пользователя. Все возможные типы разрешений приведены по ссылке http://developers.facebook.com/docs/authentication/permissions/ - там есть всё, начиная от доступа к загруженным фотографиям и заканчивая разрешением отправлять sms-сообщения пользователю. Кроме записи новых данных, существует возможность удаления (https://graph.facebook.com/COMMENT_ID?method=delete).
Статистика. Почти все вышеперечисленные запросы (кроме поиска по общедоступным объектам) должны содержать параметр &access_token - это, по сути, идентификатор нашего приложения или сайта. По этому идентификатору можно получать различную статистику (в виде объектов типа insights), либо авторизовавшись как администратор приложения, и просматривать её на http://www.facebook.com/insights/ в виде удобных графиков.
Закончить краткий обзор graph API следует на самой интересной возможности - Real-Time updates. Наличие этого пункта показывает всю серьёзность, с которой Facebook относится к интеграции с другими приложениями. Обновления в режиме реального времени позволяют разработчикам сторонних сайтов получать информацию о некоторых изменениях их пользователей. Facebook сам уведомляет о том, что пользователь написал сообщение в новостную ленту, добавил друга или нажал кнопку like. Этот пункт разработчиков от необходимости периодически опрашивать API о таких изменениях. Некоторые детали этого механизма:
- Real-time - это может быть несколько минут;
- он распространяется только на объекты user, permissions, page (для приложений);
- требует подписки, поддержки особого механизма взаимодейстивия;
- принимать сторонний сайт должен как GET (для проверки подписки) так и POST (для данных) запросы.
Для управления подписками можно использовать (POST/GET/DELETE)
https://graph.facebook.com/<app-id>/subscriptions?access_token=...
Хранятся подписки в таком виде:
"object": "user", "callback_url": "http://www.xyz.com/sub_endpoint?xyz_token=123", "fields": ["email", "friends", "name", "picture"], "active": true
Механизм взаимодействия Faceook и подписанного на обновления стороннего сайта:
- Сначала facebook отправляет GET запрос на сервер сайта с тремя параметрами: hub.mode (тут будет передана строка subscribe), hub.challenge (произвольная строка) и hub.verify_token (токен сайта, который был отправлен на Facebook в запросе на подписку).
- Сначала сайт должен проверить, что посланный и принятый token совпадают.
- Затем отослать произвольную строку обратно (этот шаг позволяет избежать случая, когда Facebook может быть использован для DDoS атаки на сервер сайта).
- Только после вышеописанных шагов, facebook присылает сайту POST запросом идентификатор объекта, и список полей, которые изменены.
Новые данные придётся получать отдельным запросом.
Авторизация
Для аутентификации Facebook использует протокол OAuth 2.0, суть которого в трёх шагах:
- Аутентификация пользователя (проверка, что он тот, за кого себя выдаёт).
- Авторизация приложения (пользователю точно описывается, к чему сайт будет иметь доступ и что делать).
- Аутентификация приложения - подтверждение, что информация всё ещё уходит авторизированному приложению.
После прохождения этих трёх шагов сайт получает "user access token", который позволяет делать с данными пользователя всё, что он разрешил.
Facebook поддерживает аутентификацию на стороне сервера и на стороне клиента (JavaScript).
Примечание: Facebook поддерживает три типа приложений (Websites, Apps on Facebook.com, Mobile). В данной статье рассматривается только интеграция web-сайтов c социальной сетью.
Вначале разработчику необходимо зарегистрировать сайт - http://developers.facebook.com/setup/. После регистрации выдаётся App ID и AppSecret, а также html+JavaScript код с кнопками fb-login и fb-like.
Аутентификация, серверная сторона:
- При первом посещении сайта
пользователем перенаправляем
его на Facebook, с полученными при
регистрации appid, указав redirecturl:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL - Если пользователь не авторизирован, он увидит окошко для ввода логина и пароля.
- Затем пользователь увидит список того, что web-сайт будет делать с его данными (стандартно - access my basic information, но можно запросить права на отправку писем на электронную почту, доступ к новостной ленте и т.п.).
- Если пользователь разрешает
запрашиваемые сайтом действия,
то его перенаправит обратно на
web-сайт разработчика
http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER
С этим кодом можно пройти следующий этап - аутентификацию приложения, чтобы получить accesstoken, который необходимо передавать во всех запросах к graph api. Для этого нужно выполнить следующий запрос:
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE
Если аутентификация успешно завершена, сайт наконец-то получает accesstoken, вместе с которым передаётся ещё один параметр - expires, время в секундах, которое этот token будет работать.
Есть возможность запросить разрешение на offline_access, тогда token будет действовать вечно.
Клиентская сторона:
Выполняются похожие действия, итогами которых станет
http://YOUR_URL#access_token=166942940015970%7C2.sa0&expires_in=64090
access_token придётся извлекать из url при помощи JavaScript
Примеры обоих способов (на php и js) можно найти по ссылке http://developers.facebook.com/docs/authentication/.
Social plugins
Разработанные Facebook модули легко встраиваются в сторонний сайт, они позволяют интегрировать все самые распространённые функции:
- LikeButton - кликнув на кнопку like на сайте, ссылка на него уйдёт в новостную ленту пользователя, с его описанием;
- ActivityFeed - сама новостная лента;
- Recommendations - позволяет рекомендовать конкретные страницы на сайте;
- LikeBox - на сайте отображаются like'и;
- LoginButton - показывает аватар пользователя и друзей, которые также авторизировались на сайте;
- Registration - позволяет зарегистрироваться на сайте, используя fb эккаунт;
- Facepile - список аватарок пользователей, которые нажали like на сайте;
- Comments - возможность оставлять комментарии на сайте (сами комментарии хранятся в Facebook). Комментарии можно оставлять к чему угодно. Если зайти на сайт с модулем комментариев, под учётной записью администратора (под которой вы регистрировали ваш сайт), то модуль comments позволит модерировать и администрировать оставленные комментарии;
- LiveStream - позволяет пользователям делиться комментариями и активностями в реальном времени.
Перед тем, как разрабатывать собственный функционал, следует подробно изучить все возможности стандартных социальных модулей, может статься, предъявляемые требования уже реализованы. Более подробно с социальными модулями можно познакомиться по ссылке http://developers.facebook.com/docs/plugins/.
Facebook SDKs
В данном разделе будет рассмотрен основной инструментарий, который можно использовать для разработки под facebook api.
Прежде всего, JavaScript SDK (http://developers.facebook.com/docs/reference/javascript/)
Вот так можно реализовать асинхронную загрузку JavaScript библиотеки
<div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({appId: 'your app id', status: true, cookie: true, xfbml: true}); }; (function() { var e = document.createElement('script'); e.async = true; e.src = document.location.protocol +'//connect.facebook.net/en_US/all.js'; document.getElementById('fb-root').appendChild(e); }()); </script>
JavaScript + FB.XFBML.parse (http://developers.facebook.com/docs/reference/javascript/fb.xfbml.parse/)
Позволяет парсить fbml тэги из DOM'а
FB.XFBML.parse(document.getElementById('foo'));
Упрощает добавление социальных плагинов:
<fb:like /> <fb:login-button autologoutlink="true"/>
Ссылка на fbml (устаревает) - http://developers.facebook.com/docs/reference/fbml/
Ссылка на php-sdk https://github.com/facebook/php-sdk/
Ссылка на описание интернациализации (перевода и т.п.) http://developers.facebook.com/docs/Internationalization/
Дополнительный APIs - FQL, Old REST API
FQL - Facebook Query Language - позволяет по данному адресу https://api.facebook.com/method/fql.query?query=QUERY передавать запросы к graph api в стиле sql (использовать join'ы нельзя, только простые запросы)
Например,
SELECT name FROM user WHERE uid = me()
Также есть "встроенные функции" now(), strlen(), substr() и strpos().
Или более сложный - вытягиваем информацию о друзьях
SELECT uid, name, pic_square FROM user WHERE uid = me() OR uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
Вещь весьма удобная, почитать описание "таблиц" и синтаксиса можно по ссылке http://developers.facebook.com/docs/reference/fql/
Старый API, который в скором времени будет удалён, не рекомендуется его использовать, однако ознакомиться с ним можно по ссылке http://developers.facebook.com/docs/reference/rest/
Реальные задачи
Большинство задач для обычных сайтов можно решить средствами стандартных социальных модулей. Примеры нестандартных задач также не являются сложными.
Рассмотрим первый пример - необходимо создать приложение, которое по списку ключевых слов отслеживает активность в социальной сети, например, количество сообщений в группах. Возьмём ключевую фразу "lady gaga", по данной фразе нам необходимо отслеживать, как изменилось количество сообщений в день до и после выхода нового клипа. Грубо говоря, нам надо вытягивать из Facebook все группы, в названии которых содержится ключевое слово, это можно сделать с помощью запроса поиска (https://graph.facebook.com/search?q=lady%20gaga&type=group). Затем, не забывая про постраничный вывод информации, получать новые сообщения из каждой группы с помощью поиска с заданными временными рамками. Возникает вопрос: почему бы не искать сразу в сообщениях? Не все сообщения в группе, с названием "lady gaga" будут содержать данное ключевое слово, их то мы и не найдём, используя поиск сразу объектов типа post.
Составить top сайтов по количеству like'ов. Для решения данной задачи был использован старый REST API (а именно http://developers.facebook.com/docs/reference/rest/links.getstats/).
Заключение
Задача данной статьи - краткий обзор возможностей Facebook API: познакомить и показать, какие возможности предоставляет эта социальная сеть разработчикам, для интеграции в их сайты. Подробное руководство по каждому описанному выше пункту можно найти на сайте для разработчиков, в разделе документации http://developers.facebook.com/docs/.
Источники:
http://developers.facebook.com/docs/
http://www.insight-it.ru/masshtabiruemost/arkhitektura-facebook/
Никита МАНЬКО,
DjComandos@gmail.com
Комментарии
Вот интересная статья про Facebook API