Facebook:永久页面访问令牌?

221

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

并非所有信息都是公开的。这意味着我必须先获取数据访问权限,然后保留它。但是,我不知道这个过程,也还没有找到一个好的教程。我猜我需要一个access_token,如何逐步从用户那里获得它?用户是Facebook页面的管理员,他是否需要将我们的FB应用添加到该页面?

编辑:感谢@phwd的提示。我制作了一个教程,介绍如何获取永久的页面访问令牌,即使offline_access已不再存在。

编辑:我刚刚发现答案在这里:Long-lasting FB access-token for server to pull FB page info


2
可能是[长期有效的FB访问令牌,供服务器拉取FB页面信息]的重复问题。(https://dev59.com/p2ct5IYBdhLWcg3wV7-k) - Gajus
看起来是这样。我有更好的标题,他有更详细的问题,我们两个都大致上得到了相同的答案认可。 - Vlasec
18个回答

678

根据 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}

输入您的应用程序ID和密钥以及在上一步骤中生成的短期令牌。

不能使用Graph API Explorer,因为该请求会卡住。我认为原因是响应不是JSON格式,而是查询字符串。由于这是一个GET请求,您可以在浏览器中打开URL。

响应应如下所示:

{"access_token":"ABC123","token_type":"bearer","expires_in":5183791}

"ABC123"将是您的长期访问令牌。您可以将其放入Access Token Debugger进行验证。在“Expires”下面,它应该有类似“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字段应具有您的永久访问令牌。复制它并在Access Token Debugger中进行测试。在“到期时间”下面应显示“Never”。

5
第四步是不必要的,您可以直接使用长期用户访问令牌查询“/me/accounts”。 - CBroe
15
Facebook 搞砸了,所以它不再起作用了 :-( 在上面的1.5步骤(点击“获取访问令牌”按钮)之后,出现了一个红色警告对话框,其中指出:“提交登录审查-以下某些权限未经 Facebook 批准使用”,同时下面还出现了一把挂锁,带有文本“这不会让应用程序发布到 Facebook”。因此,在上面的1.5步骤和1.6步骤之间应该插入一个新步骤,内容为“与你的应用程序做很多乏味的蠢事,然后提交审核,然后祈祷并等待。” :-( 有人知道如何避开这个问题吗,只为测试应用程序? - QuestionOverflow
10
如果你在进行操作的最后一步时,浏览器返回以下信息:message: "(#100) Tried accessing nonexisting field (accounts) on node type (Page)", type: "OAuthException", code: 100,请前往FB访问令牌调试器并测试你的长期访问令牌。一般来说,我发现在几分钟之后,如果你返回并重新检查长期访问令牌,FB访问令牌调试器将会指示该令牌是永久的(过期时间为never)。 - AdjunctProfessorFalcon
14
我保证,如果我没有读到这个答案,我仍然会为一个短期token而头痛不已...遗憾的是最后一部分没有生效...我收到了(#100) Tried accessing nonexisting field (accounts) on node type (Page)错误...无法执行第5步...还是要谢谢您...附注:请查看@Vlasec提供的答案最后部分,您可以通过查询/{pageId}?fields=access_token&access_token={long_lived_access_token}来获取永久访问令牌,所以问题解决了。 - Mujnoi Gyula Tamas
15
为了获得我的永久访问令牌,我不得不使用这个方法,因为它说“账户”不存在,即使对于v2.7也是如此: https://graph.facebook.com/v2.7/{page_id}?fields=access_token&access_token={long_lived_access_token} - Reado
显示剩余69条评论

99
以下是我使用只有 Graph API ExplorerAccess Token Debugger 的解决方案:
  1. Graph API Explorer:
    • 从右上角的下拉菜单中选择您的应用程序
    • 从下拉菜单中选择“获取用户访问令牌”(位于访问令牌字段右侧),并选择所需的权限
    • 复制用户访问令牌
  2. Access Token Debugger:
    • 粘贴复制的令牌,然后按“调试”
    • 点击“延长访问令牌”并复制生成的长期用户访问令牌
  3. Graph API Explorer:
    • 将复制的令牌粘贴到“访问令牌”字段中
    • 使用“PAGE_ID?fields=access_token”进行 GET 请求
    • 在响应中查找永久页面访问令牌(节点“access_token”)
  4. (可选) Access Token Debugger:
    • 粘贴永久令牌,然后按“调试”
    • “过期时间”应为“从不”
(已测试通过 API 版本 2.9-2.11、3.0-3.1)

3
没有“延长访问令牌”按钮可以点击。也许他们已经取消了这个功能。 - Cesar Bielich
4
我看到了“扩展”按钮。 - Eduardo
2
延长访问令牌(步骤2)并再次进行调试后,它应该永不过期。您可以跳过步骤3和4。 - Daniel Serretti
3
数据访问是否有过期时间? - turtlepower
3
“数据访问过期”是什么?尽管令牌上写着“过期时间:永不过期”,但“数据访问过期”会在大约3个月后到期。 - notQ
显示剩余13条评论

12

除了Vlasec回答中的建议步骤外,您还可以使用以下方法:


3
这不再起作用了。令牌只能持续一个小时。 - flashsnake
@flashsnake,你真的在v2.8上测试过吗?令牌调试器显示“永不过期”。 - Bizmate
我不记得了。可能我测试过了。 - flashsnake

12

我编写了一个 PHP 脚本,以使它更容易。 创建应用。在 Graph API Explorer 中选择您的应用程序并获取具有管理页面和发布页面权限的用户令牌。在页面的“关于”部分底部找到页面的 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;
}

1
+1 刚试了一下,在所有这些部分降值的答案中,它表现得非常出色!我喜欢这个答案,因为稍加编辑就可以轻松进行未来的修改。 - Siddhant Rimal
抱歉,我没有被允许编辑这个答案。因此,针对Graph API 2.9,我写了另一个答案 - Siddhant Rimal
似乎他们在2.9中更改了一些东西,因为这些示例都不再起作用了。 - Cesar Bielich
这不会返回永久令牌,对吧?只是一个60天的令牌?看起来你需要在60天内再次运行该函数以获取更新的令牌? - Simon East

11

另一个能够让生活更轻松的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代码,因为它会交叉检查页面ID和用户ID。如果您错误地选择了用户令牌,则第二个代码将无法正常工作。

感谢 dw1Rob


延长访问令牌按钮不在那里,我有什么遗漏吗? - Cesar Bielich
@CesarBielich: 首先你需要调试一个短期访问令牌。当你调试一个短期应用程序令牌时,它会出现在以下结果中。如果你不能看到它,那么你可能已经调试了一个用户访问令牌。请注意,此答案不适用于用户访问令牌;只有应用程序访问令牌可以使用。用户访问令牌不能是永久的。它们最多只能生成长期令牌。 - Siddhant Rimal
1
@CesarBielich 我认为你在这里有些混淆了。您可以为用户、应用程序和页面创建访问令牌。在请求令牌之前,您需要选择一个您创建的应用程序,而不是“Graph API Explorer”在应用程序字段中。请参考此处 - Siddhant Rimal
@CesarBielich:如果第二种方法对你来说太难理解了,那就使用第一种方法。在第一种方法中,你只需填写输入字段,一切都会自动完成 :) - Siddhant Rimal
抱歉,我是在评论昨晚发布的另一篇文章。我无法让您的代码起作用并生成一个永不过期的令牌,不知道为什么。但我删除了第二个调用中的 v2.9,这样就可以运行了。很奇怪。 - Cesar Bielich

7
我尝试了以下步骤: https://developers.facebook.com/docs/marketing-api/access#graph-api-explorer 获取永久页面访问令牌:
1. 进入Graph API Explorer 2. 在“应用程序”中选择您的“应用程序” 3. 将长期访问令牌粘贴到“访问令牌”中 4. 在“访问令牌”旁边,选择要获取访问令牌的页面。访问令牌会出现为一个新字符串。 5. 单击“i”以查看此访问令牌的属性 6. 再次单击“打开Access Token Tool”按钮以打开“Access Token Debugger”工具来检查属性
提示:它仅适用于页面语言为英语的情况。

1
这个家伙!!!5 杯虚拟啤酒。这个可以替换已批准答案的第五步。图形版本 2.8。 - Root -
2
我浪费了几周的时间才能使用Facebook API。迄今为止,这是我遇到的最混乱和不一致的令牌。 这个解决方案仍然完美地运作着.. 2017年10月 - tinonetic

7

大多数上面的答案现在不提供永久令牌,他们只将它延长到2个月。以下是我得到它的方法:

  1. Graph Explorer工具中选择相关权限并获取短期页面访问令牌。
  2. 进入debugger工具并粘贴您的访问令牌。然后,在页面底部点击“Extend Token”按钮。
  3. 复制扩展令牌并在此API中使用:
  4. https://graph.facebook.com/v2.10/me?fields=access_token&access_token=<extended_access_token>
  5. 这应该会返回您的永久访问令牌。您可以在debugger工具中验证它,过期时间字段应该说“Never”。

第四步似乎对我不起作用。我得到了“(#100)在节点类型(用户)上尝试访问不存在的字段(access_token)”的错误。 - brz
1
你的 extended_access_token 需要页面访问令牌而不是用户访问令牌。在第一步中,当你选择权限时,你将需要使用 Graph Explorer 提供的下拉菜单将令牌类型更改为页面。此外,在第4步中,如果你查询 fields=name,应该获取到页面名称而不是用户名称以进行验证。 - krsoni
不错的发现。谢谢 :) - Neeraj
1
在调试器中它显示:“过期时间:永不”和“数据访问过期时间:1681385400(大约3个月后)”。那么它会在3个月后停止工作吗? - Simon East

6

由于早期的所有答案都已过时,而且由于Facebook的政策不断变化,其他提到的答案可能无法用于永久令牌。

经过大量调试,我成功地使用以下步骤获取了永不过期的令牌:

Graph API Explorer:

  1. 打开图形API资源管理器,在右侧下拉框中选择要获取访问令牌的页面,点击发送按钮并复制生成的访问令牌,该令牌将是短期令牌
  2. 复制该令牌并粘贴到访问令牌调试器中,点击调试按钮,在页面底部点击扩展令牌链接,这将延长您的令牌过期时间为两个月。
  3. 复制该扩展令牌并将其与您的页面ID一起粘贴到下面的网址中,并在浏览器URL中输入: https://graph.facebook.com/{page_id}?fields=access_token&access_token={long_lived_token}
  4. 您可以使用访问令牌调试器工具检查该令牌并验证Expires字段,该字段将显示从未过期。

就是这样


你好,感谢你的回答。看起来很简单。也许你可以提供一个使用Facebook API URL而不是他们的用户界面的答案?例如,我7年前开发的软件应该在客户允许应用程序访问页面时自动完成所有操作。 - Vlasec
目前我已经不再积极地与Facebook有任何关联。但是如果你确信你的答案是解决方案,我可以将其标记为这样,并检查赞数,如果对其他人有效,就保留它。 - Vlasec
@Vlasec的回答是正确的,并且在生产中使用相同的令牌。 - kamal sehrawat
这个方法对我非常有效(2022年2月)。我已经拥有了长期的令牌,并且能够通过连接到第三步中的URL来获取永久令牌(在我的PHP代码中)。 - joncampbell

4
在获取永久访问令牌时,我按照Donut提到的上述5个步骤进行了操作。但是在第5步生成永久访问令牌时,它返回的是长期访问令牌(有效期为2个月),而不是永久访问令牌(永不过期)。我注意到当前版本的Graph API是V2.5。如果您尝试使用V2.5获取永久访问令牌,它会返回长期访问令牌。请尝试使用V2.2进行API调用(如果您无法在Graph API浏览器中更改版本,请在新标签页中使用以下API调用:https://graph.facebook.com/v2.2/{account_id}/accounts?access_token={long_lived_access_token}),然后您将获得永久访问令牌(永不过期)。

回退 API 版本来实现结果只会导致更多的工作,特别是因为 API 版本在一定时间后会过期。 - SlickRemix
它返回 null :( 我们如何获取页面访问令牌? - Nancy thakkar

4
如果您只请求页面数据,则可以使用页面访问令牌。您只需要一次授权用户以获取用户访问令牌;将其延长至两个月的有效期,然后请求页面的令牌。这在方案5中都有详细解释。请注意,所获得的页面访问令牌只在用户访问令牌有效期内有效。

抱歉,也许我没有表达清楚。我已经了解了令牌的相关知识,我只需要学习如何请求用户授权并将令牌传输到我的应用程序中。看起来我需要创建一个 Facebook“应用程序”,其唯一目的是请求权限,是这样吗? - Vlasec
1
@Viasec 正确的获取访问令牌的唯一方式是通过应用程序,如此处所述 https://developers.facebook.com/docs/facebook-login/ - phwd
谢谢,我一定不小心忽略了它,我以为它在API部分,但是我错了。我会看看那个,希望它能回答我的问题。 - Vlasec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接