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

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

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

РЕДАКТИРОВАТЬ: Спасибо @phwd за совет. Я сделал учебник, как получить маркер постоянного доступа к странице, даже с offline_access больше не существует

РЕДАКТИРОВАТЬ: Я только что узнал, что здесь ответили: долгосрочный токен доступа FB для сервера, чтобы получить информацию о странице FB

19 ответов

Решение

Следуя инструкциям, изложенным в документации по расширению маркеров страниц 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}/ account? access_token ={long_lived_access_token}

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

Вот мое решение, использующее только 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)

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

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

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

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

Большинство ответов выше теперь не дают постоянного токена, они продлевают его только до 2 месяцев. Вот как у меня это получилось:

  1. В инструменте Graph Explorer выберите соответствующие разрешения и получите кратковременный токен доступа к странице.
  2. Перейдите в инструмент отладчика и вставьте свой токен доступа. Затем нажмите кнопку «Продлить токен» внизу страницы.
  3. Скопируйте расширенный токен и используйте его в этом API:
  4. https://graph.facebook.com/v2.10/me?fields=access_token&amp;amp;access_token=<extended_access_token>
  5. Это должно вернуть вам токен постоянного доступа. Вы можете проверить это в инструменте отладчика, в поле истекает срок действия должно быть указано «Никогда».

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

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

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

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

Поскольку все предыдущие ответы устарели, и из-за постоянно меняющихся политик из facebook, другие упомянутые ответы могут не работать для постоянных токенов.

После долгой отладки я могу получить токен с неограниченным сроком действия, выполнив следующие действия:

Graph API Explorer:

  1. Откройте graph api explorer и выберите страницу, для которой вы хотите получить токен доступа, в правом раскрывающемся списке, нажмите кнопку Отправить и скопируйте полученный access_token, который будет недолговечным токеном.
  2. Скопируйте этот токен и вставьте его в отладчик токена доступа и нажмите кнопку отладки, в нижней части страницы нажмите на ссылку продления токена, которая продлит срок действия вашего токена до двух месяцев.
  3. Скопируйте этот расширенный токен и вставьте его в URL-адрес ниже со своим pageId и нажмите в URL-адресе браузера https://graph.facebook.com/{page_id}?fields=access_token&access_token={long_lived_token}.
  4. U может проверить этот токен в инструменте отладчика токенов доступа и проверить поле Expires, которое никогда не будет отображаться.

Это оно

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

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

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

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

Подобно:

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

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

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

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

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

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

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

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

Наш счет обмена на нашем сайте перестал работать, когда FB перевернул api до v 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
    

    Вы захотите взять свой идентификатор приложения и секрет приложения со страницы своего приложения. Главная страница разработчиков 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 также нарушен из-за новой потребности в токенизированных запросах, поэтому я обновлю это соответственно.

Я создал небольшой скрипт NodeJS на основе ответа пончика. Сохраните следующее в файле с именем get-facebook-access-token.js:

const fetch = require('node-fetch');
const open = require('open');

const api_version = 'v9.0';
const app_id = '';
const app_secret = '';
const short_lived_token = '';
const page_name = '';

const getPermanentAccessToken = async () => {
  try {
    const long_lived_access_token = await getLongLivedAccessToken();
    const account_id = await getAccountId(long_lived_access_token);
    const permanent_page_access_token = await getPermanentPageAccessToken(
      long_lived_access_token,
      account_id
    );
    checkExpiration(permanent_page_access_token);
  } catch (reason) {
    console.error(reason);
  }
};

const getLongLivedAccessToken = async () => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/oauth/access_token?grant_type=fb_exchange_token&client_id=${app_id}&client_secret=${app_secret}&fb_exchange_token=${short_lived_token}`
  );
  const body = await response.json();
  return body.access_token;
};

const getAccountId = async (long_lived_access_token) => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/me?access_token=${long_lived_access_token}`
  );
  const body = await response.json();
  return body.id;
};

const getPermanentPageAccessToken = async (
  long_lived_access_token,
  account_id
) => {
  const response = await fetch(
    `https://graph.facebook.com/${api_version}/${account_id}/accounts?access_token=${long_lived_access_token}`
  );
  const body = await response.json();
  const page_item = body.data.find(item => item.name === page_name);  
  return page_item.access_token;
};

const checkExpiration = (access_token) => {
  open(`https://developers.facebook.com/tools/debug/accesstoken/?access_token=${access_token}&version=${api_version}`);
}

getPermanentAccessToken();

Введите константы и запустите:

npm install node-fetch
npm install open
node get-facebook-access-token.js

После запуска скрипта в браузере открывается страница, на которой отображается токен и срок его действия.

По состоянию на апрель 2020 года срок действия моих ранее постоянных токенов страницы истек примерно между 1 и 12 часами. Я начал использовать токены пользователей сmanage_pagesразрешение на достижение предыдущей цели (опрос событий страницы). Эти жетоны кажутся постоянными.

Я создал скрипт python на основе информации, содержащейся в этом посте, размещенной на https://github.com/k-funk/facebook_permanent_token, чтобы отслеживать, какие параметры требуются и какие методы получения постоянного токена работают.

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

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

Другие вопросы по тегам