it-roy-ru.com

facebook: постоянный токен доступа к странице?

Я работаю над проектом, который имеет страницы Facebook в качестве одного из источников данных. Он импортирует некоторые данные из него периодически, без участия GUI. Затем мы используем веб-приложение, чтобы показать данные, которые у нас уже есть.

Не вся информация является публичной. Это означает, что я должен получить доступ к данным один раз, а затем сохранить их. Тем не менее, я не знаю процесс, и я еще не нашел хороший учебник по этому вопросу. Я думаю, мне нужен access_token, как я могу получить его от пользователя, шаг за шагом? Пользователь является администратором страницы Facebook, должен ли он добавить какое-нибудь наше приложение FB на страницу?

Правка: Спасибо @phwd за совет. Я сделал учебник, как получить постоянный токен доступа к странице, даже если offline_access больше не существует.

Правка: Я только что узнал, что он ответил здесь: Длительный токен доступа FB для сервера, чтобы получить информацию о странице FB

161
Vlasec

Следуя инструкциям, изложенным в Facebook { расширение документации по токенам страницы } _ Мне удалось получить токен доступа к странице, срок действия которого не истек.

Я предлагаю использовать Graph API Explorer для всех этих шагов, если не указано иное.

0. Создать приложение Facebook

Если у вас уже есть приложение, перейдите к шагу 1.

  1. Перейдите на Мои приложения .
  2. Нажмите «+ Добавить новое приложение».
  3. Настройте приложение для веб-сайта.

Вам не нужно менять его разрешения или что-то еще. Вам просто нужно приложение, которое не исчезнет, ​​прежде чем вы закончите с вашим токеном доступа.

1. Получите пользовательский токен доступа

  1. Перейдите к Graph API Explorer .
  2. Выберите приложение, для которого вы хотите получить токен доступа (в раскрывающемся меню «Приложение», а не в меню «Мои приложения»).
  3. Нажмите «Получить токен»> «Получить токен доступа пользователя».
  4. Во всплывающем окне на вкладке «Расширенные разрешения» установите флажок «manage_pages».
  5. Нажмите «Получить токен доступа».
  6. Предоставьте доступ из учетной записи Facebook, у которой есть доступ для управления целевой страницей. Обратите внимание, что если этот пользователь потеряет доступ к окончательному, никогда не истекающий токен доступа перестанет работать.

Токен, который появляется в поле «Токен доступа», является вашим недолговечным токеном доступа.

2. Создайте маркер доступа с длительным сроком действия

Следуя этим инструкциям из документации Facebook, отправьте запрос GET на

https://graph.facebook.com/v2.10/oauth/access_token?grant_type=fb_exchange_token&client_id={app_id} & client_secret = {app_secret} & fb_exchange_token = {short_lived_token}

ввод идентификатора и секрета вашего приложения, а также кратковременного токена, созданного на предыдущем шаге.

Вы не можете использовать Graph API Explorer. По какой-то причине он застревает на этом запросе. Я думаю, что это потому, что ответ не JSON, а строка запроса. Поскольку это запрос GET, вы можете просто перейти по URL в вашем браузере.

Ответ должен выглядеть так:

{"access_token": "ABC123", "token_type": "bearer", "expires_in": 5183791}

«ABC123» будет вашим долгоживущим токеном доступа. Вы можете поместить его в Access Token Debugger для проверки. Под «Истекает» должно быть что-то вроде «2 месяца».

3. Получить идентификатор пользователя

Используя маркер долговременного доступа, сделайте запрос GET для 

https://graph.facebook.com/v2.10/me?access_token={long_lived_access_token}

Поле id - это идентификатор вашей учетной записи. Вам понадобится это для следующего шага.

4. Получить постоянный токен доступа к странице

Сделать запрос GET

https://graph.facebook.com/v2.10/{account_id}/accounts? access_token = {long_lived_access_token}

Ответ JSON должен иметь поле data, в котором находится массив элементов, к которым у пользователя есть доступ. Найдите элемент для страницы, с которой вы хотите получить токен постоянного доступа. В поле access_token должен быть ваш токен постоянного доступа. Скопируйте его и протестируйте в Access Token Debugger . В поле «Срок действия» следует указать «Никогда».

574
donut

Вот мое решение, использующее только Graph API Explorer & Access Token Debugger :

  1. Graph API Explorer:
    • Выберите ваше приложение в правом верхнем раскрывающемся меню
    • В раскрывающемся списке «Получить токен доступа пользователя» (поле справа от маркера доступа) выберите необходимые разрешения.
    • Скопировать токен доступа пользователя
  2. Access Token Debugger:
    • Вставьте скопированный токен и нажмите «Отладка»
    • Нажмите «Расширить токен доступа» и скопируйте сгенерированный долгосрочный токен доступа пользователя.
  3. Graph API Explorer:
    • Вставьте скопированный токен в поле «Токен доступа»
    • Сделайте запрос GET с "PAGE_ID? Fields = access_token"
    • Найти постоянный токен доступа к странице в ответе (узел "access_token")
  4. (Необязательно) Access Token Debugger:
    • Вставьте постоянный токен и нажмите «Отладка»
    • «Истекает» должно быть «Никогда»

(Протестировано с API версии 2.9-2.11, 3.0-3.1)

65
Rob

В дополнение к рекомендуемым шагам в Vlasec answer вы можете использовать:

  • Graph API Explorer для выполнения запросов, например, /{pageId}?fields=access_token&access_token=THE_ACCESS_TOKEN_PROVIDED_BY_GRAPH_Explorer
  • Access Token Debugger , чтобы получить информацию о токене доступа.
10
chuycepeda

Я сделал скрипт PHP, чтобы сделать его проще. Создать приложение . В Graph API Explorer выберите ваше приложение и получите токен пользователя с полномочиями manage_pages и publish_pages. Найдите идентификатор своей страницы внизу страницы «О нас». Заполните конфигурационные переменные и запустите скрипт.

<?php
$args=[
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
];

echo generate_token($args);

function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.8/{$userid}/accounts?access_token={$longtoken}")); // get permanent token
    foreach($r->data as $d) if($d->id==$args['pageid']) return $d->access_token;
}
9
dw1

Еще один PHP ответ, чтобы облегчить жизнь. Обновлено для Facebook Graph API 2.9. Просто заполните и загрузите.

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/me?access_token={$longtoken}")); // get user id
    $userid=$r->id;
    $r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$userid}?fields=access_token&access_token={$longtoken}")); // get permanent token
    if($r->id==$args['pageid']) $finaltoken=$r->access_token;
    return $finaltoken;
}
?>

Приложение: (альтернатива)

На диаграмме 2.9 и далее вы можете пропустить большую часть хлопот, связанных с получением токена длительного доступа, просто щелкнув Расширить маркер доступа в нижней части средства отладчика токена доступа , после отладки токена короткого доступа. Вооружившись информацией о pageid и longlivedtoken, запустите приведенный ниже php, чтобы получить токен постоянного доступа.

<?php
$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'longlivedtoken'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
$r=json_decode(file_get_contents("https://graph.facebook.com/v2.9/{$args['pageid']}?fields=access_token&access_token={$args['longlivedtoken']}"));
return $r->access_token;
}
?>

Хотя второй код избавляет вас от хлопот, я рекомендую запускать первый php-код, если вы не слишком торопитесь, потому что он перепроверяет pageid и userid. Второй код не сработает, если вы ошибочно выберете токен пользователя.

Благодаря dw1 и Роб

8
Siddhant Rimal

Я попробовал эти шаги: https://developers.facebook.com/docs/marketing-api/access#graph-api-Explorer

Получить постоянный токен доступа к странице

  • Перейти к Graph API Explorer
  • Выберите приложение в Приложение
  • Вставьте долгосрочный токен доступа в Access Token
  • Рядом с Токен доступа выберите страницу, для которой требуется токен доступа. Маркер доступа отображается в виде новой строки.
  • Нажмите i, чтобы просмотреть свойства этого токена доступа.
  • Нажмите кнопку «Открыть в Access Token Tool» еще раз, чтобы открыть «Access Token Debugger», чтобы проверить свойства

Один совет, он работал только для меня, когда язык страницы english.

6
Fabian

Получая токен постоянного доступа, я выполнил 5 шагов, упомянутых в Donut. Однако на 5-м шаге при создании токена постоянного доступа возвращается токен долгосрочного доступа (действителен в течение 2 месяцев), а не токен постоянного доступа (срок действия которого никогда не истекает). Я заметил, что текущая версия Graph API - V2.5. Если вы пытаетесь получить токен постоянного доступа с V2.5, он предоставляет долгоживущий токен доступа. Попробуйте выполнить вызов API с помощью V2.2 (если вы не можете изменить версию в графе API Explorer, нажмите на вызов API https://graph.facebook.com/v2.2/ {account_id}/accounts? access_token = {long_lived_access_token} в новой вкладке с V2.2), затем вы получите токен постоянного доступа (который никогда не заканчивается)

4
baji shaik

Если вы запрашиваете только данные страницы, вы можете использовать токен доступа к странице. Вам нужно будет только авторизовать пользователя один раз, чтобы получить токен доступа пользователя; продлите его до двух месяцев, затем запросите токен для страницы. Это все объясняется в Сценарий 5 . Обратите внимание, что полученный токен доступа к странице действителен только в течение срока действия токена доступа пользователя.

4
phwd

В дополнение к упомянутым методам стоит отметить, что для межсерверных приложений вы также можете использовать эту форму токена постоянного доступа: App_id | app_secret Этот тип токена доступа называется App Token. Обычно его можно использовать для вызова Graph API и запроса общедоступных узлов в бэк-энде вашего приложения . Здесь упоминается: https://developers.facebook.com/docs/facebook-login/access-tokens

3
ZeKoU

Многие из этих примеров не работают, не уверен, что это из-за выхода 2.9v, но я бился головой. В любом случае, я взял версию @ dw1 и немного изменил ее с помощью видео @KFunk, и у меня это получилось для 2.9. Надеюсь это поможет.

$args=[
/*-- Permanent access token generator for Facebook Graph API version 2.9 --*/
//Instructions: Fill Input Area below and then run this php file
/*-- INPUT AREA START --*/
    'usertoken'=>'',
    'appid'=>'',
    'appsecret'=>'',
    'pageid'=>''
/*-- INPUT AREA END --*/
];
echo 'Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
function generate_token($args){
    $r = json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/{$args['pageid']}?fields=access_token&access_token={$longtoken}")); // get user id
    $finaltoken=$r->access_token;
    return $finaltoken;
}
1
Cesar Bielich

Благодаря @donut мне удалось получить бесконечный токен доступа в JavaScript.

// Initialize exchange
fetch('https://graph.facebook.com/v3.2/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token={short_lived_token}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Get the user data
    fetch(`https://graph.facebook.com/v3.2/me?access_token=${json.access_token}`)
    .then((data) => {
        return data.json();
    })
    .then((userData) => {
        // Get the page token
        fetch(`https://graph.facebook.com/v3.2/${userData.id}/accounts?access_token=${json.access_token}`)
        .then((data) => {
            return data.json();
        })
        .then((pageToken) => {
            // Save the access token somewhere
            // You'll need it at later point
        })
        .catch((err) => console.error(err))
    })
    .catch((err) => console.error(err))
})
.catch((err) => {
    console.error(err);
})

а затем я использовал сохраненный токен доступа, как это

fetch('https://graph.facebook.com/v3.2/{page_id}?fields=fan_count&access_token={token_from_the_data_array}')
.then((data) => {
    return data.json();
})
.then((json) => {
    // Do stuff
})
.catch((err) => console.error(err))

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

1
Vladimir Jovanović

Достигнут предел заявки (# 4) - FB API v2.1 и выше

Этот ответ привел меня к «окончательному ответу для нас», и поэтому он очень тесно связан, поэтому я добавляю его здесь. Хотя это связано с вышеизложенным, оно отличается, и, похоже, FB несколько упростило этот процесс.

Наши подсчеты на нашем сайте перестали работать, когда FB перевернул API до версии 2.1. В нашем случае у нас уже было приложение FB, и мы НЕ использовали логин FB. Итак, нам нужно было получить токен FB APP для выполнения новых запросов. Это по состоянию на 23 августа 2016 года.

  1. Перейдите по адресу: https://developers.facebook.com/tools/Explorer
  2. Выберите версию API, а затем используйте GET и вставьте следующее: 

    /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
    

    Вы можете взять свой app id и свой app secret со страницы своего приложения. Главная страница разработчиков FB Apps

  3. Запустите запрос графа, и вы увидите:

    {
       "access_token": "app-id|app-token",
       "token_type": "bearer"
    }
    

    Куда 

    «Приложение-идентификатор»
    а также 
    «Приложение-маркер»
    будет идентификатором вашего приложения со страницы приложения FB и сгенерированным хешем приложения FB, который вы только что получили.

  4. Затем проверьте ваш новый токен доступа APP: FB Access Token tester

  5. Вы должны увидеть, вставив 

    «Приложение-маркер»
    в тестер токенов, один токен на основе приложения без даты/времени истечения срока действия.

В нашем случае мы используем FB js sdk, поэтому мы изменили наш вызов так: (пожалуйста, обратите внимание, что ТОЛЬКО получает счет акций, а не счет акций и комментариев вместе взятых, как раньше):

FB.api(
    '/','GET',{
    // this is our FB app token for our FB app 
        access_token: FBAppToken,
        "id":"{$shareUrl}","fields":"id,og_object{ engagement }"
}

Теперь это работает правильно. Это потребовало много поиска и официального сообщения об ошибке с FB, чтобы подтвердить, что мы должны начать делать токенизированные запросы к API FB. Кроме того, я попросил, чтобы они (FB) добавили ключ к коду ошибки (# 4), в котором упоминается токенизированный запрос.

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

1
wittmason

Я нашел этот ответ который ссылается на этот инструмент который действительно очень помог.

Я надеюсь, что этот ответ остается в силе, когда вы читаете это.

0
Bamboomy