持久的FB访问令牌,用于服务器提取FB页面信息


114

我知道关于Facebook访问令牌及其引起的痛苦有很多问题,但是尽管进行了许多试验并阅读了许多令人沮丧的模糊博客文章(FB和其他方面),但我仍在努力寻找自己的明确答案。到目前为止,让我简要地分解我的过程:

  • 我正在创建一个服务器端需要从单个Facebook页面提取帖子/状态的网站
  • 我是该Facebook专页的管理员
  • 我已经创建了一个Facebook App
  • 使用Facebook Graph API Explorer,我生成了一个短期密钥,该密钥已连接到我的应用程序和我的帐户,该密钥授予我的帐户查看我的页面访问令牌的权限
  • 我已经从我的转换短暂关键,长寿命密钥(60天)ALA方案4

这就是我被困住的地方。我的60天密钥对我的服务器来说可以很好地从页面中提取所需的信息,但据我所知,无法以编程方式扩展该60天密钥。我还不知道一种无需手动转到Facebook Graph API Explorer并创建一个新密钥的方法。

由于是我的服务器向Facebook API发出请求,而不是基于用户的系统(我可以轻松地要求用户再次授权Facebook应用程序),因此这创建了一个非常笨拙的系统。自从Facebook弃用以来offline_access,真的没有永久性的方法让我的服务器从我自己的页面中提取信息吗?我真的需要手动创建一个新密钥并每60天手动更新一次服务器吗?

还是我想念的东西?

更新:

先前在此处找到的分步指南已迁移到自己的答案中


这太棒了。我处在相同的情况下,正在寻找有关此主题的一些信息。这个令牌不会破坏任何FB平台策略是否安全?只是要求确定。
onigunn 2012年

2
@asrijaal Facebook自己的文档(请看场景5)说这些页面访问令牌不会过期。我可以肯定地说他们遵守Facebook的政策。
redhotvengeance 2012年

“我认为最好留下一个清晰的分步过程”-天堂禁止:)感谢@redhotvengeance
Steve McGill

您的页面访问令牌网址有错字。应该是?不是后帐。花了一段时间试图弄清楚为什么它不起作用。:P
Joren

@Joren确实-现在已修复。谢谢!
redhotvengeance

Answers:


188

这些是先前问题中的步骤-它们已迁移到此答案。

发现可以生成一个不会过期的Facebook页面访问令牌(在@Igy的帮助下),对于所有寻求相同的用户,这是一个清晰的分步练习:

  1. 确保您是要从中提取信息的FB页面的管理员
  2. 创建一个FB应用程序(应该使用与页面管理员相同的用户帐户)
  3. 前往Facebook Graph API Explorer
  4. 在右上角,从“应用程序”下拉列表中选择您创建的FB应用程序
  5. 点击“获取访问令牌”
  6. 确保添加manage_pages权限
  7. 通过进行以下Graph API调用,可将这种短期访问令牌转换为长期访问令牌: https://graph.facebook.com/oauth/access_token?client_id=<your FB App ID >&client_secret=<your FB App secret>&grant_type=fb_exchange_token&fb_exchange_token=<your short-lived access token>
  8. 拿回返回的新的长期访问令牌
  9. 进行Graph API调用,以使用新的长期访问令牌查看您的帐户: https://graph.facebook.com/me/accounts?access_token=<your long-lived access token>
  10. 抓住access_token您将要从中获取信息的页面的
  11. 整理令牌以查看它是否已设置为Expires: Never

那应该做。现在,您应该拥有一个不会过期的Facebook页面访问令牌,除非:

  • 您更改您的Facebook帐户密码
  • 您失去目标页面的管理员访问权限
  • 您删除或取消授权您的Facebook应用

任何这些都会导致访问令牌无效。

如果要获取(#100) Tried accessing nonexisting field (accounts) on node type (Page),请访问Access Token Debugger,复制的值User ID,并在步骤9中使用它替换URL的“ me”部分。


2
第6步如何在哪里进行?
StefanMüller2014年

5
@StefanMüller在Graph API Explorer页面上单击“获取访问令牌”时,将弹出“选择权限”对话框。该manage_pages选项在Extended Permissions选项卡下。
redhotvengeance 2014年

2
大!这就像一个咒语一样,以PAGE(而不是用户)的形式发布。
本杰明·皮耶特

3
我相信这已经过时了。而且您只会获得一个访问令牌,该令牌将在大约两个月后过期。
Qaiser Wali 2014年

7
我现在已经完成了所有这些工作,并且可以正常工作,只是寿命长的令牌ID在2个月后到期并且不是无限的。另外,艾策斯令牌调试器具有在窗体底部的链接来扩展令牌一个长期访问令牌短暂的访问。
SlimIT

15

脱机访问弃用文档中对此进行了介绍。

使用页面管理员的60天令牌来检索页面访问令牌(通过/PAGE_ID?fields=access_token/me/accounts)-页面访问令牌将没有到期时间


5
叹。确实,这似乎是门票。我可能发誓我尝试了这些步骤的所有可能组合-显然我错过了实际可行的步骤。多么复杂的必需动作集。非常感谢您的帮助!
redhotvengeance 2012年

1
互联网上有如此多的作品,这实际上是可行的。
埃内斯托

有没有办法page_access_token通过javascript中的代码来获得60天?喜欢的获取方式user_access_token> FB.getAuthResponse()['accessToken'];谢谢!
Tulon

3

在2019年有效的方法

我最近试图实现类似的目的(与该线程中描述的用例相似),但是我想确保尊重Facebook当前的政策,因此我做了一些研究,在此我分享了我发现的内容。

我的用例

因此,正如我已经说过的,我的用例与此处描述的用例非常相似。那是:

  • 我正在为学区做一些工作。
  • 他们正在使用软件工具来管理几乎所有与学校交通有关的事物。
  • 该工具允许他们在发布公交车延迟警报和学校停课警报时发送电子邮件通知(给订户)。
  • 社区中有很多人在其Facebook页面上关注该组织,这是他们寻找这些警报的唯一地方。
  • 因此,该组织的员工必须手动在Facebook页面上发布每个通知(除了在运输软件中创建通知外)。此外,这些通知最终会过期(或在过期之前被删除),因此员工必须稍后再手动删除它们。
  • 这是很短的时间,所以我们在这里要做的是开发一个简单的系统,该系统定期轮询软件工具的数据库以获取新的(和过期的)通知,并在Facebook页面上更新(即添加和删除)通知。

在我看来,这是一个合法的用例,但我不确定如何以符合Facebook政策的方式实施它。

接受的答案

我按照接受的答案的步骤进行了工作,并且工作正常,只是情况似乎有所变化:现在,即使生成的页面令牌没有过期,access to data也将在60天后过期。如果您按照以下步骤操作并检查FB令牌调试器工具中的页面令牌,您也会看到这一点。

此外,不幸的是,生成的页面令牌与用户帐户绑定的事实也很不幸,因为如果用户更新他/她的密码,则页面令牌也会失效。

2019年如何做

经过几个小时的研究,我偶然发现了以下Facebook文档文章:直接业务的业务登录

事实证明,现在可以按照上述文章中描述的步骤来生成与任何特定Facebook用户帐户都没有关联并且不会过期的页面令牌(除非FB App被删除或基础应用程序令牌)被删除,你知道...)

因此,这里是步骤和最重要的部分:

  • 您需要一个业务经理帐户。
    • 需要进行验证,并且必须签署数字合同。
  • 您需要将目标Facebook页面添加到该帐户。
  • 您需要创建一个Facebook应用程序,并将该应用程序也转移到相同的Business Manager帐户。
  • 该应用程序必须经过Facebook的审核过程,因为需要以下权限:manage_pagespublish_pages
    • 重要的提示要使使用生成页面令牌发布的帖子对应用程序管理员以外的其他用户可见,则该应用程序必须已发布并得到批准。
    • 您仍然可以尝试对该概念进行试验而无需提交审阅,但这些帖子不会公开显示。
  • 在业务管理器帐户中(仅在将您的应用程序和页面添加到该帐户之后),您需要创建所谓的“ 系统用户”,并将该用户的管理员角色(或权限)授予目标Facebook页面。
    • 系统用户由业务经理帐户拥有,并且不与特定用户绑定。我目前的理解是,系统用户的一个主要用例是对Facebook的Graph API的编程访问(正是我们需要的)。
  • 然后,对于该系统用户,您需要生成一个访问令牌(该令牌将永不过期)。系统将提示您选择哪个应用程序。然后,您将选择目标应用程序。
  • 然后,您将需要使用生成的应用程序令牌来生成页面令牌,该令牌也将永不过期。程序中描述本文中为:
GET /<PAGE_ID>?fields=access_token&access_token=<SYSTEM_USER_ACCESS_TOKEN>
  • 而已。

该令牌永远不会过期,也不会与特定的Facebook用户绑定,因此这正是我们所需要的!

最后一部分是确保您的Facebook应用得到Facebook的批准。实际上,这是最重要的部分,因为如果人们看不到我们的帖子,那么整个过程就一文不值。

我想确定要依靠上述程序为我的客户构建一些东西,而Facebook最终不会拒绝它,因此,在事先(即在开始处理我的客户项目之前),我经历了整个过程创建页面,应用程序,业务经理帐户等。我验证了我的业务。我已提交我的应用程序以供审核。在我的要求中,我非常详细地说明了我的用例,并强调该应用程序是用于“自用”的(即该组织正在为自己而不是其他Facebook用户开发一个应用程序)。我获得批准的时间不少于24小时。

有关应用审核过程的其他一些注意事项:

  • 我必须为该应用选择平台,因此我选择了网站
  • 我必须指出为什么该应用程序需要两个权限以及如何使用它们。
  • 我必须指出为什么审阅者无法登录我的应用程序并尝试(即因为该应用程序将由工作进程使用)。
  • 对于强制性的截屏视频,我只是使用 curl实用程序(生成页面令牌并在Facebook页面上发帖)。我还展示了如何使用业务管理器将系统用户链接到页面并生成令牌,等等。
  • 同样,我对用例非常具体,我认为这很有用。

我希望这些信息对具有类似用例的人有用。


1

非常感谢@redhotvengeance提供的逐步指南。

一段时间后,现在在Facebook文档中已有明确描述:

https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension

扩展页面访问令牌

当他们通过manage_pages权限进行身份验证时,应用程序可以从Page admin用户中检索页面访问令牌。如果用于检索此页面访问令牌的用户访问令牌是短暂的,则页面访问令牌也将短暂存在。

要获得寿命更长的页面访问令牌,请如上所述将用户访问令牌换成寿命长的页面访问令牌,然后请求页面访问令牌。生成的页面访问令牌将没有任何到期时间。


0

您也可以从Facebook上的应用程序仪表板复制和过去。步骤:

  1. 转到https://developers.facebook.com

  2. 在页面的右上角选择您的应用 (显示外观)

  3. 单击左侧选项中的Messenger(它将自动进入设置)(外观类似)
  4. 转到页面中的“令牌生成”部分。选择您要为其生成令牌的页面。(该部分的外观图片)
  5. 复制并粘贴到您需要的页面令牌中。

请记住,虽然理论上您的令牌不会过期,但它直接与您登录的Facebook帐户绑定。因此,假设您更改密码或从帐户和应用程序之间删除权限,则令牌将不再有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.