facebook: постоянный токен доступа к странице?
Я работаю над проектом, в котором одним из источников данных являются страницы на Facebook. Он импортирует некоторые данные из него периодически, без участия GUI. Затем мы используем веб-приложение, чтобы показать данные, которые у нас уже есть.
Не вся информация является публичной. Это означает, что я должен получить доступ к данным один раз, а затем сохранить их. Тем не менее, я не знаю процесс, и я еще не нашел хороший учебник по этому вопросу. Я думаю, мне нужно access_token
как я могу получить его от пользователя, шаг за шагом? Пользователь является администратором страницы Facebook, должен ли он добавить какое-нибудь наше приложение FB на страницу?
РЕДАКТИРОВАТЬ: Спасибо @phwd за совет. Я сделал учебник, как получить маркер постоянного доступа к странице, даже с offline_access
больше не существует
РЕДАКТИРОВАТЬ: Я только что узнал, что здесь ответили: долгосрочный токен доступа FB для сервера, чтобы получить информацию о странице FB
19 ответов
Следуя инструкциям, изложенным в документации по расширению маркеров страниц Facebook, я смог получить токен доступа к странице, срок действия которого не истек.
Я предлагаю использовать 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}
ввод идентификатора и секрета вашего приложения, а также кратковременного токена, созданного на предыдущем шаге.
Вы не можете использовать 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:
- Graph API Explorer:
- Выберите ваше приложение в правом верхнем раскрывающемся меню
- В раскрывающемся списке "Получить токен доступа пользователя" (поле справа от маркера доступа) выберите необходимые разрешения.
- Скопировать токен доступа пользователя
- Отладчик токенов доступа:
- Вставьте скопированный токен и нажмите "Отладка"
- Нажмите "Расширить токен доступа" и скопируйте сгенерированный долгосрочный токен доступа пользователя.
- Graph API Explorer:
- Вставьте скопированный токен в поле "Токен доступа"
- Сделайте запрос GET с "PAGE_ID? Fields = access_token"
- Найти постоянный токен доступа к странице в ответе (узел "access_token")
- (Необязательно) 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. Второй код не сработает, если вы ошибочно выберете токен пользователя.
Большинство ответов выше теперь не дают постоянного токена, они продлевают его только до 2 месяцев. Вот как у меня это получилось:
- В инструменте Graph Explorer выберите соответствующие разрешения и получите кратковременный токен доступа к странице.
- Перейдите в инструмент отладчика и вставьте свой токен доступа. Затем нажмите кнопку «Продлить токен» внизу страницы.
- Скопируйте расширенный токен и используйте его в этом API:
- https://graph.facebook.com/v2.10/me?fields=access_token&amp;access_token=<extended_access_token>
- Это должно вернуть вам токен постоянного доступа. Вы можете проверить это в инструменте отладчика, в поле истекает срок действия должно быть указано «Никогда».
Я попробовал эти шаги: https://developers.facebook.com/docs/marketing-api/access
Получить постоянный токен доступа к странице
- Перейти к Graph API Explorer
- Выберите приложение в приложении
- Вставьте долгосрочный токен доступа в Access Token
- Рядом с токеном доступа выберите страницу, для которой требуется токен доступа. Маркер доступа отображается в виде новой строки.
- Нажмите i, чтобы увидеть свойства этого токена доступа
- Нажмите кнопку "Открыть в Access Token Tool" еще раз, чтобы открыть "Access Token Debugger", чтобы проверить свойства
Один совет, он работал только для меня, когда язык страницы английский.
Поскольку все предыдущие ответы устарели, и из-за постоянно меняющихся политик из facebook, другие упомянутые ответы могут не работать для постоянных токенов.
После долгой отладки я могу получить токен с неограниченным сроком действия, выполнив следующие действия:
Graph API Explorer:
- Откройте graph api explorer и выберите страницу, для которой вы хотите получить токен доступа, в правом раскрывающемся списке, нажмите кнопку Отправить и скопируйте полученный access_token, который будет недолговечным токеном.
- Скопируйте этот токен и вставьте его в отладчик токена доступа и нажмите кнопку отладки, в нижней части страницы нажмите на ссылку продления токена, которая продлит срок действия вашего токена до двух месяцев.
- Скопируйте этот расширенный токен и вставьте его в URL-адрес ниже со своим pageId и нажмите в URL-адресе браузера https://graph.facebook.com/{page_id}?fields=access_token&access_token={long_lived_token}.
- 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 года.
- Перейдите по адресу: https://developers.facebook.com/tools/explorer
Выберите версию API, а затем используйте GET и вставьте следующее:
/oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
Вы захотите взять свой идентификатор приложения и секрет приложения со страницы своего приложения. Главная страница разработчиков FB Apps
Запустите запрос графа, и вы увидите:
{ "access_token": "app-id|app-token", "token_type": "bearer" }
куда
"Приложение-идентификатор"
а также"Приложение-маркер"
будет идентификатором вашего приложения на странице приложения FB и сгенерированным хешем приложения FB, который вы только что получили.Затем проверьте ваш новый токен доступа APP: FB Access Token tester
Вы должны увидеть, вставив
"Приложение-маркер"
в тестер токенов, один токен на основе приложения без даты / времени истечения срока действия.
В нашем случае мы используем 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, чтобы отслеживать, какие параметры требуются и какие методы получения постоянного токена работают.
Я нашел этот ответ, который относится к этому инструменту, который действительно очень помог.
Я надеюсь, что этот ответ остается в силе, когда вы читаете это.