Facebook:永久页面访问令牌?
我在一个有Facebook页面作为其数据源之一的项目上工作。 它会定期从其中导入一些数据,而不涉及GUI。 然后我们使用一个Web应用程序来显示我们已有的数据。
并非所有的信息都是公开的。 这意味着我必须访问一次数据,然后保存它。 但是,我不知道这个过程,我还没有找到一个很好的教程。 我想我需要一个access_token
,我怎么能从用户,一步一步得到它? 用户是一个Facebook页面的管理员,他将不得不添加我们的一些FB应用程序的页面?
编辑:谢谢@phwd的提示。 我做了一个教程如何获得永久页面访问令牌,即使offline_access
不再存在。
编辑:我只是发现它在这里回答: 持久的FB访问令牌服务器拉FB页面信息
按照Facebook 扩展页面标记文档中的说明,我可以获得一个不会过期的页面访问标记。
除非另有说明,否则我建议使用Graph API Explorer进行所有这些步骤。
0.创建Facebook应用程序
如果您已经有应用程序 ,请跳至步骤1。
- 转到我的应用程序 。
- 点击“+添加新的应用程序”。
- 设置一个网站应用程序
你不需要改变其权限或任何东西。 你只需要一个应用程序不会离开你的访问令牌之前。
1.获取用户短暂访问令牌
- 转到图形API资源管理器 。
- 选择要获取访问令牌的应用程序(在“应用程序”下拉菜单中,而不是“我的应用程序”菜单中)。
- 点击“获取令牌”>“获取用户访问令牌”。
- 在弹出的“扩展权限”选项卡下,选中“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}
输入您的应用程序的ID和密码以及上一步中生成的短期标记。
您不能使用图形API资源管理器 。 出于某种原因,它卡在这个请求。 我认为这是因为响应不是JSON,而是一个查询字符串。 由于这是一个GET请求,你可以直接进入浏览器的URL。
回应应该是这样的:
{“access_token”:“ ABC123 ”,“token_type”:“承载者”,“expires_in”:5183791}
“ABC123”将是您长期存取的令牌。 您可以将其放入访问令牌调试器进行验证。 在“过期”之下,应该有“2个月”之类的东西。
3.获取用户ID
使用长期访问令牌,发出GET请求
https://graph.facebook.com/v2.10/me?access_token= {long_lived_access_token}
id
字段是您的帐户ID。 你会需要它的下一步。
4.获取永久页面访问令牌
请求一个GET请求
https://graph.facebook.com/v2.10/ {account_id} / accounts?access_token = {long_lived_access_token}
JSON响应应该有一个data
字段,其中是用户有权访问的项目数组。 找到想要永久访问令牌的页面的项目。 access_token
字段应该有永久访问令牌。 复制它并在访问令牌调试器中进行测试。 在“过期”之下,应该说“从不”。
这里是我的解决方案只使用图形API资源管理器和访问令牌调试器 :
- 图表API浏览器:
- 从右上角的下拉菜单中选择您的应用程序
- 从下拉列表中选择“获取用户访问令牌”(访问令牌字段右侧),然后选择所需的权限
- 复制用户访问令牌
- 访问令牌调试器:
- 粘贴复制的标记,然后按“调试”
- 按“扩展访问令牌”并复制生成的长期用户访问令牌
- 图表API浏览器:
- 将复制的标记粘贴到“访问令牌”字段中
- 通过“PAGE_ID?fields = access_token”进行GET请求
- 在响应中找到永久页面访问令牌(节点“access_token”)
- (可选)访问令牌调试器:
- 粘贴永久令牌,然后按“调试”
- “过期”应该是“从不”
(API版本2.9)
除了Vlasec答案中的建议步骤外 ,您还可以使用:
- 使用API API浏览器进行查询,例如
/{pageId}?fields=access_token&access_token=THE_ACCESS_TOKEN_PROVIDED_BY_GRAPH_EXPLORER
- 访问令牌调试器获取有关访问令牌的信息。
我做了一个PHP脚本,使其更容易。 创建一个应用 。 在图表API浏览器中选择您的应用程序,并获得具有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; }
另一个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工具底部的Extend Access Token ,即可跳过获取长访问令牌的麻烦。 用关于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
如果您只请求页面数据,则可以使用页面访问令牌。 您只需授权用户一次获得用户访问令牌; 将其延长至两个月的有效期,然后为页面请求令牌。 情况5中对此进行了解释。 请注意,获取的页面访问令牌只在用户访问令牌有效时才有效。
当获得永久访问令牌时,我按照Donut提到的5个步骤进行操作。 然而,在第五步生成永久访问令牌时,它将返回长期访问令牌(有效期为2个月)而不是永久访问令牌(永不过期)。 我注意到当前版本的Graph API是V2.5。 如果你试图获得V2.5的永久访问令牌,它提供了长期访问token.Try使用V2.2进行API调用(如果你不能在图形API浏览器中更改版本,请点击API调用https:在V2.2的新选项卡中使用//graph.facebook.com/v2.2/ {account_id} / accounts?access_token = {long_lived_access_token} ),您将获得永久访问令牌(永不过期)
除了上面提到的方法之外,值得一提的是,对于服务器到服务器应用程序,您也可以使用这种形式的永久访问令牌:app_id | app_secret这种类型的访问令牌称为App令牌。 它通常可以用来调用Graph API并查询应用程序后端的公共节点。 这里提到: https : //developers.facebook.com/docs/facebook-login/access-tokens
我尝试了这些步骤: https : //developers.facebook.com/docs/marketing-api/access#graph-api-explorer
获取永久页面访问令牌
- 转到图形API资源管理器
- 在应用 程序中选择你的应用
- 将长期访问令牌粘贴到Access令牌中
- 访问令牌旁边,选择您想要访问令牌的页面。 访问令牌显示为一个新的字符串。
- 点击我查看此访问令牌的属性
- 点击“在访问令牌工具中打开”按钮打开“访问令牌调试器”工具来检查属性
一个提示,它只适用于当页面语言是英语的时候 。
已达到应用程序请求限制(#4) – FB API v2.1及更高版本
这个答案使我成为“我们的最终答案”,所以它是非常相关的,所以我把它附加在这里。 虽然它与上述有关它是不同的,似乎FB已经简化了一些过程。
当FB将api转到v 2.1时,我们的网站上的分享计数停止工作。 在我们的情况下,我们已经有一个FB应用程序,我们没有使用FB登录。 所以我们需要做的是获得一个FB APP令牌来发出新的请求。 这是截至2016年8月23日。
- 转到: https : //developers.facebook.com/tools/explorer
-
选择api版本,然后使用GET并粘贴以下内容:
/oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
你会想要从你的应用程序页面抓取你的应用程序ID和你的应用程序的秘密 。 主要的FB Apps开发者页面
-
运行图形查询,你会看到:
{ "access_token": "app-id|app-token", "token_type": "bearer" }
哪里
“APP-ID”
和
“应用程序令牌”
将成为您的FB应用程序页面中的应用程序ID以及刚刚收到的生成的FB应用程序HASH。
-
然后去测试你的新APP访问令牌: FB访问令牌测试器
-
你应该看到,通过粘贴
“应用程序令牌”
进入令牌测试器,一个没有过期日期/时间的基于应用程序的令牌。
在我们的情况下,我们正在使用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评论数量也被打破了,因为需要标记化的请求,所以我会相应地更新。
按照https://www.youtube.com/watch?v=FtboHvg3HtY (它引用这个问题)逐字。 使用你的浏览器,只使用图表浏览器不会给你永久的令牌。
这些例子中的很多都不起作用,不知道是不是因为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; }
- 如何从JavaScript SDK中的FB.login方法获取访问令牌
- 检索Facebook粉丝名称
- 有没有办法检查Facebook访问令牌是否仍然有效?
- 在“使用Facebooklogin示例”中编译错误
- Facebook的Friends.getAppUsers使用Graph API
- Java示例如何使用OAuth在GAE上使用Facebook帐户login
- Facebook SDK 4.10上的NPE:尝试调用空对象引用上的接口方法java.lang.Object com.facebook.inject.Lazy.get()
- 把omniauth facebooklogin成一个popup窗口
- 如何识别一个网页是否正在加载一个iframe或直接进入浏览器窗口?