我在一个将facebook页面作为其数据源之一的项目上工作。它定期从中导入一些数据,不涉及GUI。然后我们使用网络应用程序显示我们已有的数据。
并非所有信息都是公开的。这意味着我必须访问一次数据然后保留它。但是,我不知道这个过程,我还没有找到一个很好的教程。我想我需要一个access_token
,如何逐步从用户那里得到它?用户是Facebook页面的管理员,他是否必须在页面中添加一些我们的FB应用程序?
offline_access
不再存在。
编辑:我刚刚发现它在这里得到了解答:Long-lasting FB access-token for server to pull FB page info
答案 0 :(得分:594)
按照Facebook extending page tokens documentation中的说明,我能够获得一个未过期的页面访问令牌。
我建议将Graph API Explorer用于所有这些步骤,除非另有说明。
如果您已有应用,请跳至步骤1.
您不需要更改其权限或任何内容。您只需要一个在使用访问令牌之前不会消失的应用程序。
出现在"访问令牌"中的令牌field是您的短期访问令牌。
在Facebook文档中关注these instructions后,向
发出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} 强>
输入您应用的ID和密码以及上一步中生成的短期令牌。
您无法使用Graph API Explorer 。由于某种原因,它会受到这个请求的困扰。我认为这是因为响应不是JSON,而是查询字符串。由于它是GET请求,您只需转到浏览器中的网址即可。
响应应如下所示:
{&#34;的access_token&#34;:&#34;的 ABC123 强>&#34;&#34; token_type&#34;:&#34;承载&#34;&# 34; expires_in&#34;:5183791}
&#34; ABC123&#34;将是您的长期访问令牌。您可以将其放入Access Token Debugger进行验证。在&#34; Expires&#34;它应该有类似的&#34; 2个月&#34;。
使用长期访问令牌,向
发出GET请求https://graph.facebook.com/v2.10/me?access_token=的 {long_lived_access_token} 强>
id
字段是您的帐户ID。你下一步就需要它。
向
发出GET请求https://graph.facebook.com/v2.10/的 {ACCOUNT_ID} 强> /帐户?=的access_token的 {long_lived_access_token} 强>
JSON响应应该有一个data
字段,在该字段下是用户有权访问的项目数组。找到您想要永久访问令牌的页面的项目。 access_token
字段应具有永久访问令牌。复制它并在Access Token Debugger中测试它。在&#34; Expires&#34;它应该说&#34;从不&#34;。
答案 1 :(得分:74)
这是我的解决方案仅使用Graph API Explorer&amp; Access Token Debugger:
(使用API Version 2.9-2.11,3.0-3.1测试)
答案 2 :(得分:11)
除了Vlasec答案中的建议步骤外,您还可以使用:
/{pageId}?fields=access_token&access_token=THE_ACCESS_TOKEN_PROVIDED_BY_GRAPH_EXPLORER
答案 3 :(得分:9)
我制作了一个PHP脚本,使其更容易。 Create an app。在Graph API Explorer中选择您的应用并获取具有manage_pages和publish_pages权限的用户令牌。在“关于”页面底部找到您的页面ID。填写配置变量并运行脚本。
<?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;
}
答案 4 :(得分:8)
另一个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以后,您可以在调试短访问后,只需点击Access Token Debugger tool底部的扩展访问令牌,就可以避免获取长访问令牌的麻烦令牌。有关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。如果您错误地选择用户令牌,第二个代码将不会结束。
答案 5 :(得分:6)
我尝试了以下步骤: https://developers.facebook.com/docs/marketing-api/access#graph-api-explorer
获取永久页面访问令牌
一个提示,当页面语言为英语时,它只适用于我。
答案 6 :(得分:4)
获取永久访问令牌时,我按照甜甜圈提到的5个步骤进行了操作。然而,在生成永久访问令牌的第5步中,它返回长期访问令牌(有效期为2个月)而不是永久访问令牌(永不过期)。我注意到的是当前版本的Graph API是V2.5。如果您尝试使用V2.5获取永久访问令牌,则会提供长期访问令牌。尝试使用V2.2进行API调用(如果您无法在图形api资源管理器中更改版本,请点击API调用 https://graph.facebook.com/v2.2/ {account_id} / accounts?access_token = {long_lived_access_token} ,然后您将获得永久访问令牌(永不过期)
答案 7 :(得分:4)
如果您只请求页面数据,则可以使用页面访问令牌。您只需要授权用户一次获取用户访问令牌;将其延长至两个月的有效期,然后请求页面的令牌。这在Scenario 5中都有解释。请注意,只要用户访问令牌有效,所获取的页面访问令牌才有效。
答案 8 :(得分:3)
除了提到的方法之外,值得一提的是,对于服务器到服务器应用程序,您还可以使用这种形式的永久访问令牌: APP_ID | app_secret 这种类型的访问令牌称为App Token。它通常可用于调用Graph API并查询应用程序后端中的公共节点。 这里提到:https://developers.facebook.com/docs/facebook-login/access-tokens
答案 9 :(得分:2)
由于所有较早的答案都比较旧,并且由于来自facebook的政策不断变化,因此其他提及的答案可能不适用于永久令牌。
经过大量调试后,我可以使用以下步骤获取永不过期令牌:
图形API资源管理器:
就这样
答案 10 :(得分:1)
达到了应用程序请求限制(#4) - FB API v2.1及更高版本
这个答案让我得到了对我们的最终答案&#34;所以它非常相关所以我在这里附加它。虽然它与上述有关但它有所不同,似乎FB已经简化了一些过程。
我们的网站上的共享计数在FB将API转到v 2.1时停止工作。在我们的例子中,我们已经有了一个FB APP,我们没有使用FB登录。所以我们需要做的是获得 FB APP Token 来发出新请求。这是截至2016年8月23日。
选择api版本,然后使用GET并粘贴以下内容:
/oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
您需要从应用页面抓取应用ID 和应用密钥。 Main FB Apps developer page
运行图表查询,您会看到:
{
"access_token": "app-id|app-token",
"token_type": "bearer"
}
"app-id"和
"app-token"将成为您的FB应用页面中的应用ID以及您刚刚收到的生成的FB App HASH。
接下来测试您的新APP访问令牌:FB Access Token tester
您应该通过将
"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 :(得分:1)
这些例子中的许多都不起作用,不确定是不是因为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;
}
答案 12 :(得分:1)
由于@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))
我希望有人可以修剪此代码,因为它有点混乱,但这是我唯一想到的方法。
答案 13 :(得分:0)
我发现this answer指的是this tool,它确实帮助了很多。
我希望你读这篇文章时这个答案仍然有效。
答案 14 :(得分:0)
如果您拥有facebook的应用程序,则可以尝试使用app-id和app-secret。
赞:
access_token={your-app_id}|{your-app_secret}
不需要频繁更改令牌。
答案 15 :(得分:0)
从2020年4月开始,我以前永久使用的页面令牌开始在1到12个小时之间失效。我开始使用具有manage_pages
权限的用户令牌来实现先前的目标(轮询页面的事件)。这些令牌似乎是永久性的。
我根据此帖子中的信息创建了一个python脚本,该脚本托管在github.com/k-funk/facebook_permanent_token上,以跟踪所需的参数,以及获取永久令牌的方法正在起作用。
答案 16 :(得分:0)
我根据甜甜圈的答案创建了一个小的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
运行脚本后,会在浏览器中打开一个页面,显示该令牌及其有效期。
答案 17 :(得分:0)
上面的大多数答案现在都没有给出永久令牌,它们只将其延长到 2 个月。这是我得到它的方式: