119

我知道有很多关于 Facebook 访问令牌及其造成的悲痛的问题,但尽管进行了大量实验并阅读了许多令人沮丧的模糊博客文章(FB 和其他),但我仍在努力为我的需求找到一个明确的答案. 到目前为止,让我简要地分解一下我的过程:

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

这就是我卡住的地方。我的 60 天密钥适用于我的服务器从页面中提取所需信息,但据我所知,没有办法以编程方式扩展该 60 天密钥。我也不知道如何生成一个新的短期密钥,而无需手动转到 Facebook Graph API Explorer 并创建一个。

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

还是我缺少什么?

更新:

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

4

5 回答 5

194

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

发现可以生成一个不会过期的 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. 对令牌进行Lint以查看它是否设置为Expires: Never!

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

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

其中任何一项都会导致访问令牌无效。

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

于 2014-02-21T07:11:49.677 回答
16

这在离线访问弃用文档中进行了介绍

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

于 2012-08-28T22:49:11.483 回答
10

2019 年行之有效的方法

我最近试图实现类似的东西(类似于这个线程中描述的用例),但我想确保尊重 Facebook 的当前政策,所以我做了一些研究,在这里我分享我的发现。

我的用例

所以,正如我已经说过的,我的用例与这里描述的非常相似;那是:

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

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

接受的答案

我按照接受的答案的步骤进行操作,但情况似乎发生了变化:现在,即使生成的页面令牌没有过期,也会access to data在大约 60 天后过期。如果您按照该过程并在FB Token Debugger Tool中检查页面令牌,您也会看到这一点。

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

如何在 2019 年做到这一点

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

事实证明,现在可以按照上述文章中描述的步骤生成一个与任何特定 Facebook 用户帐户无关且不会过期的页面令牌(除非 FB 应用程序被删除或底层应用程序令牌被删除了,你知道...)

所以这里是步骤和最重要的部分:

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

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

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

我想确定我可以依靠上述过程为我的客户构建一些东西,而最终 Facebook 不会拒绝它,所以,事先(即在开始处理我客户的项目之前),我经历了整个过程创建一个页面、一个应用程序、一个商务管理平台帐户等。我验证了我的业务。我提交了我的应用程序以供审核。在我的请求中,我对我的用例非常具体,并强调该应用程序是“自用”的(即该组织正在为自己开发应用程序,而不是为其他 Facebook 用户)。我在不到 24 小时内就获得了批准。

关于应用审核流程的其他一些说明:

  • 我必须为应用程序选择一个平台,所以我选择了website
  • 我必须说明为什么应用程序需要这两个权限以及它将如何使用它们。
  • 我必须说明为什么审阅者无法登录我的应用程序并尝试它(即因为该应用程序将由工作进程使用)。
  • 对于强制截屏,我只是使用curl实用程序在终端中进行手动操作(生成页面令牌并在 Facebook 页面上发布帖子)。我还展示了如何使用 Business Manager 将系统用户链接到页面并生成令牌,等等。
  • 同样,我对我的用例非常具体,我认为这很有帮助。

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

于 2019-11-15T13:39:13.730 回答
1

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

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

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

扩展页面访问令牌

当应用程序使用 manage_pages 权限进行身份验证时,应用程序可以从页面管理员用户那里检索页面访问令牌。如果用于检索此页面访问令牌的用户访问令牌是短暂的,则页面访问令牌也将是短暂的。

要获得一个长期存在的页面访问令牌,请将用户访问令牌交换为一个长期存在的令牌,如上所述,然后请求页面访问令牌。生成的页面访问令牌将没有任何到期时间。

于 2017-08-25T19:34:31.947 回答
0

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

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

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

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

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

于 2017-10-27T16:40:48.793 回答