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

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

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

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

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

Ответ 1

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

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

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

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

  • Перейдите в Мои приложения.
  • Нажмите "+ Добавить новое приложение".
  • Установите приложение для веб-сайта.

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

1. Получить токен пользователя с ограниченным живым доступом

  • Перейдите в Graph API Explorer.
  • Выберите приложение, для которого вы хотите получить токен доступа (в раскрывающемся меню "Приложение", а не в меню "Мои приложения" ).
  • Нажмите "Получить токен" > "Получить токен доступа пользователя".
  • Во всплывающем меню на вкладке "Расширенные разрешения" установите флажок "manage_pages".
  • Нажмите "Получить токен доступа".
  • Предоставить доступ к учетной записи 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}

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

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

Ответ должен выглядеть следующим образом:

{ "access_token": " ABC123", "token_type": "носителем", "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. В разделе "Истекает" он должен сказать "Никогда".

Ответ 2

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

  1. Graph API Explorer:
    • Выберите ваше приложение в правом верхнем раскрывающемся меню
    • В раскрывающемся списке "Получить токен доступа пользователя" (поле справа от маркера доступа) выберите необходимые разрешения.
    • Скопировать токен доступа пользователя
  2. Отладчик токена доступа:
    • Вставьте скопированный токен и нажмите "Отладка"
    • Нажмите "Расширить токен доступа" и скопируйте сгенерированный долгосрочный токен доступа пользователя.
  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)

Ответ 3

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

Ответ 4

Я сделал скрипт 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;
}

Ответ 5

Другой ответ 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 и Rob

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

При получении токена постоянного доступа я следовал за 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), тогда вы получить токен постоянного доступа (который никогда не истекает)

Ответ 9

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

Ответ 10

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

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

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

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

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

    Вам захочется взять ваш идентификатор приложения и ваш секрет приложения со страницы вашего приложения. Главная страница разработчиков приложений FB

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

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

    Где

    "app-id"
    и
    "app-token"
    будет вашим идентификатором приложения со страницы вашего приложения FB и сгенерированной вами HB App HASH.
  • Далее выполните проверку нового токена доступа APP: Тестер токена доступа FB

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

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

В нашем случае мы используем 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, чтобы подтвердить, что мы должны начать делать токенизированные запросы в FB api. В стороне я попросил, чтобы они (FB) добавили ключ к коду ошибки (# 4), в котором упоминается токенированный запрос.

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

Ответ 11

Следуйте https://www.youtube.com/watch?v=FtboHvg3HtY (который ссылается на этот вопрос) дословно. Используйте свой браузер, где он/она, используя только графический проводник, не даст вам постоянного токена.

Ответ 12

Многие из этих примеров не работают, не уверен, что из-за выхода 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;
}

Ответ 13

Благодаря @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))

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

Ответ 14

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

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

Ответ 15

Если у вас есть приложение для Facebook, вы можете попробовать использовать app-id & app-secret.

Подобно:

access_token={your-app_id}|{your-app_secret}

не требуется часто менять токен.