Facebook:永久页面访问令牌?

我在一个有Facebook页面作为其数据源之一的项目上工作。 它会定期从其中导入一些数据,而不涉及GUI。 然后我们使用一个Web应用程序来显示我们已有的数据。

并非所有的信息都是公开的。 这意味着我必须访问一次数据,然后保存它。 但是,我不知道这个过程,我还没有找到一个很好的教程。 我想我需要一个access_token ,我怎么能从用户,一步一步得到它? 用户是一个Facebook页面的管理员,他将不得不添加我们的一些FB应用程序的页面?

编辑:谢谢@phwd的提示。 我做了一个教程如何获得永久页面访问令牌,即使offline_access不再存在。

编辑:我只是发现它在这里回答: 持久的FB访问令牌服务器拉FB页面信息

按照Facebook 扩展页面标记文档中的说明,我可以获得一个不会过期的页面访问标记。

除非另有说明,否则我建议使用Graph API Explorer进行所有这些步骤。

0.创建Facebook应用程序

如果您已经有应用程序 ,请跳至步骤1。

  1. 转到我的应用程序 。
  2. 点击“+添加新的应用程序”。
  3. 设置一个网站应用程序

你不需要改变其权限或任何东西。 你只需要一个应用程序不会离开你的访问令牌之前。

1.获取用户短暂访问令牌

  1. 转到图形API资源管理器 。
  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}

输入您的应用程序的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资源管理器和访问令牌调试器 :

  1. 图表API浏览器:
    • 从右上角的下拉菜单中选择您的应用程序
    • 从下拉列表中选择“获取用户访问令牌”(访问令牌字段右侧),然后选择所需的权限
    • 复制用户访问令牌
  2. 访问令牌调试器:
    • 粘贴复制的标记,然后按“调试”
    • 按“扩展访问令牌”并复制生成的长期用户访问令牌
  3. 图表API浏览器:
    • 将复制的标记粘贴到“访问令牌”字段中
    • 通过“PAGE_ID?fields = access_token”进行GET请求
    • 在响应中找到永久页面访问令牌(节点“access_token”)
  4. (可选)访问令牌调试器:
    • 粘贴永久令牌,然后按“调试”
    • “过期”应该是“从不”

(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 ,即可跳过获取长访问令牌的麻烦。 用关于pageidlonglivedtoken信息武装,运行下面的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日。

  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 

    你会想要从你的应用程序页面抓取你的应用程序ID和你的应用程序的秘密 。 主要的FB Apps开发者页面

  3. 运行图形查询,你会看到:

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

    哪里

      “APP-ID” 

      “应用程序令牌” 

    将成为您的FB应用程序页面中的应用程序ID以及刚刚收到的生成的FB应用程序HASH。

  4. 然后去测试你的新APP访问令牌: FB访问令牌测试器

  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进行了大量的搜索和官方的错误报告,以确认我们必须开始向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; }