April 19, 2014

Публикация на стену страницы/группы в Facebook со своего сайта в один клик через graph api

Итак, есть задача - необходимо со своего сайта максимально просто и быстро публиковать разные вещи на страницу сайта в Facebook. В моем случае это сайт цитат Socratify.Net.

Благо у Фейсбука замечательное API и все это сделать можно. Значит какая стоит задача? У сайта есть своя страничка в фейсбуке для социального продвижения и необходимо, находясь на страничке цитаты под админом (пример странички - цитаты Конфуция), одним нажатием кнопки запостить эту цитату на стену в читабельном виде.

Еще одно (и очень важное) условие - постить необходимо от имени страницы, а не от имени пользователя, админа странички. В этом и заключается вся сложность задачи.

Для начала необходимо подключить js-файл фейсбука:

//connect.facebook.net/{lang}/all.js#xfbml=1&appId={app_id}

lang - это локализация вашего сайта (к примеру, en) и app_id - id вашего приложения в facebook, это не id странички в соцсети, а именно приложения, в моем случае через него происходит авторизация на сайте через facebook.

Вся задача делается ajax-ом (без перезагрузки странички). Для публикации от имени странички необходимо получить access_token страницы. Делаем это на стороне сервера, но сначала нам необходимо получить access_token админа страницы фейсбука (тоесть вашего пользователя) и делается это перед отправки ajax-запроса на наш сервер javascript-ом.

Вот js-код (с использованием jQuery):

$("#post_to_facebook_button").click(function(){
    var access_token = FB.getAccessToken();

    if (!access_token) {
        FB.login();
        access_token = FB.getAccessToken();
    }

    $.ajax({
        url: "/post-to-facebook-page-wall/348844",
        type: "POST",
        data: {access_token: access_token},
        success: function(data){
            // success handler
        }
    });
});

На стороне сервера мы уже имеем access_token админа страницы фейсбука и теперь сможем с его помощью получить access_token самой страницы (срок его жизни на момент написания статьи равен одному часу, поэтому получаем его при каждой публикации на стену). Я делаю это с помощью замечательной библиотеки requests (Python, сайт написан на Python/Flask):

url = "https://graph.facebook.com/%d" % FACEBOOK_PAGE_ID
response = requests.get(url, params=dict(
    fields="access_token",
    method="GET",
    format="json",
    suppress_http_code=1,
    access_token=user_access_token,
))
access_token = response.json()['access_token']

Имея access_token страницы постим цитату на стену страницы:

url = "https://graph.facebook.com/%d/feed" % FACEBOOK_PAGE_ID
data = {
    'message': (
        u'When nature has work to be done, '
        u'she creates a genius to do it.\n\n'
        u'© Ralph Waldo Emerson'
    ),
    'access_token': access_token,
}
response = requests.post(url, data=data)

if 'id' in response.json():
    # posted ok
else:
    print response.json()  # error

Тут пример написан на Python, но я думаю его будет легко адаптировать и под PHP, и под Ruby, и под что угодно еще.

No comments:

Post a Comment