长期持久的 FB 访问-令牌为服务器拉 FB 页面信息

我知道有很多关于 Facebook 访问权限的问题——令牌和它们造成的痛苦,但是尽管我做了很多实验,阅读了很多令人沮丧的模糊的博客文章(FB 和其他) ,我仍然在努力得到一个清晰的答案来满足我的需求。让我简明扼要地分析一下目前为止的进程:

  • 我正在创建一个网站,服务器端,需要从一个单一的 Facebook 页面提取文章/状态
  • 我是那个 Facebook 页面的管理员
  • 我创建了一个 Facebook 应用程序
  • 使用 Facebook 图形 API 浏览器,我生成了一个短命的密钥,连接到我的应用程序和我的帐户,它授予我的帐户查看页面访问令牌的权限
  • 我已经从 这个转换了短期密钥为长期密钥(60天) ala 场景4

这就是我的困境。我的60天密钥工作良好,我的服务器从网页上提取所需的信息,但就我所知,没有办法以编程方式扩展60天密钥。我也不知道有什么方法可以不用手动转到 Facebook Graph API Explorer 并创建一个新的短期密钥。

由于是我的服务器向 Facebook API 发出请求,而不是一个基于用户的系统(我可以很容易地请求用户再次授权 Facebook 应用程序) ,这就造成了一个非常笨重的系统。既然 Facebook 反对使用 offline_access,那么真的没有永久的方法让我的服务器从我自己的页面上获取信息吗?我真的需要手工创建一个新的密钥并且每60天手动更新一次我的服务器吗?

Or is there something I'm missing?

Update:

先前在这里找到的分步指南已经迁移到了它自己的 answer中。

48591 次浏览

这在 脱机访问不适用文档中有介绍

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

这些是之前提到的步骤——它们已经迁移到了这个答案中。

已经发现有可能生成一个不会过期的 Facebook 页面访问令牌(在@Igy 的帮助下) ,这里有一个清晰的,一步一步的为所有那些寻找相同:

  1. 确保你是管理员的 FB 页面,你希望从拉信息
  2. 创建一个 FB 应用程序(应使用相同的用户帐户是页面管理)
  3. Head over to the Facebook 图形 API 浏览器
  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. 使用新的长寿命访问令牌 https://graph.facebook.com/me/accounts?access_token=<your long-lived access token>进行 GraphAPI 调用以查看您的帐户
  10. Grab the access_token for the page you'll be pulling info from
  11. Lint 标记,查看它是否被设置为 Expires: Never

你现在应该有一个不会过期的 Facebook 页面访问令牌,除非:

  • 你更改了你的 Facebook 账号密码
  • 您将失去对目标页的管理访问权限
  • 你可以删除或者取消你的 Facebook 应用的授权

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

如果您得到的是 (#100) Tried accessing nonexisting field (accounts) on node type (Page),那么转到 访问令牌调试器,复制 User ID的值,并使用它替换步骤9中 URL 的“ me”部分。

Many thanks to @redhotvengeance for step-by-step guide.

过了一段时间,现在 Facebook 的文档中清楚地描述了:

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

扩展页访问令牌

应用程序可以从页面管理员用户检索页面访问令牌 使用 management _ pages 权限进行身份验证 用于检索此页访问令牌的 访问令牌也将是短命的。

若要获得较长期的页访问令牌,请交换 User 访问权限 令牌,然后请求 Page 访问 token. The resulting page access token will not have any expiry time.

You can also copy and past from the app dashboard on facebook. 步骤:

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

  2. 在页面的右上角选择你的应用程序 (照片的样子)

  3. 单击左侧选项中的 Messenger (它将自动进入设置) (照片的样子)
  4. Go to the "Token Generation" section in the page. Select what page you want to generate the token for. (那个部分的图片)
  5. 复制和过去您的页面令牌,在任何地方您需要它。

请记住,虽然在理论上你的令牌不会过期,它是直接绑定到任何脸谱帐户您登录。因此,如果你更改了密码或者删除了账户和应用程序之间的权限,那么你的令牌将不再有效。

这种方法在2019年行之有效

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

My use case

So, as I said already, my use case is very similar to the one described here; that is:

  • I'm doing some work for a school district.
  • 他们使用一个软件工具来管理几乎所有与学校交通有关的事情。
  • 这个工具允许他们在发布校车延误警报和学校关闭警报时发送电子邮件通知(给订阅者)。
  • 社区里很多人在他们的 Facebook 页面上关注这个组织,那是他们寻找这些提醒的唯一地方。
  • So an employee of the organization has to manually publish each notification on the Facebook page (in addition to creating it in the transportation software). Moreover, those notifications eventually expire (or are simply deleted before they expire), so the employee has to go back later on to delete them manually as well.
  • 这是一个漫长的过程,所以我们在这里要做的就是开发一个简单的系统,定期轮询软件工具的数据库,查找新的(和过期的)通知,并在 Facebook 页面上更新它们(即添加和删除)。

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

公认的答案

I followed the steps of the accepted answer and it worked, except that things appear to have changed: now, even though the generated page token does not expire, access to data does expire after around 60 days. You will see that as well if you follow the procedure and inspect the page token in the 令牌调试工具.

此外,将生成的页令牌绑定到用户帐户的事实也令人遗憾,因为如果用户更新了他/她的密码,那么页令牌也将失效。

如何在2019年做到这一点

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

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

下面是步骤和最重要的部分:

  • 你需要一个 业务经理帐户。
    • 需要进行核实,并签署一份数字合同。
  • 你需要将目标 Facebook 页面添加到该帐户中。
  • 您需要创建一个 Facebook 应用程序,并将该应用程序转移到同一个 Business Manager 帐户。
  • 该应用程序将必须通过 Facebook 的审查过程,因为以下权限将需要: manage_pagespublish_pages
    • 重要提示 对于使用生成页面令牌发布的帖子,除了应用程序管理员之外,其他用户都可以看到,这个应用程序需要已经发布和批准。
    • 你仍然可以在不提交审查的情况下尝试这个概念,但是这些帖子将不会公开可见。
  • 在 Business Manager 帐户中(只有在您的应用程序和页面添加到该帐户之后) ,您需要创建所谓的 系统用户,并将该用户管理员角色(或权限)赋予目标 Facebook 页面。
    • 系统用户由 BusinessManager 帐户拥有,并且不与特定用户绑定。我目前的理解是,系统用户的一个主要用例是对 Facebook 的 Graph API 的编程访问(正是我们所需要的)。
  • Then, for that system user, you need to generate a access token (which will be never-expiring). You will be prompted to select for which app. You will then select your target app.
  • 然后,您将需要使用生成的应用程序令牌来生成一个页面令牌,该令牌也将是永不过期的。该程序被描述为 在这篇文章中:
GET /<PAGE_ID>?fields=access_token&access_token=<SYSTEM_USER_ACCESS_TOKEN>
  • 就是这样。

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

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

I wanted to know for sure that I could rely on the above procedure to build something for my client without Facebook rejecting it in the end, so, beforehand (i.e. before starting to work on my client's project), I went through the whole process of creating a page, an app, a Business Manager account, etc. I verified my business. I submitted my app for review. In my request, I was very specific about my use case and emphasized that the app was for "self-use" (i.e. that the organization is developing an app for itself, not for other Facebook users). I got approved without less than 24 hours.

关于应用程序评审过程的一些其他说明:

  • 我必须为应用程序选择一个平台,所以我选择了 网站
  • 我必须指出为什么应用程序需要这两个权限,以及它将如何使用它们。
  • 我必须指出为什么评论者不能登录到我的应用程序并尝试它(也就是说,因为应用程序将被一个工作进程使用)。
  • 对于强制截屏,我只是在终端中使用 curl实用程序(生成页面令牌并向 Facebook 页面发布消息)展示了手动操作。我还展示了如何使用 Business Manager 将系统用户链接到页面并生成令牌,等等。
  • 同样,我对我的用例非常具体,我认为这有所帮助。

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