为Facebook页面生成“永不过期”的访问令牌

我设法通过API(C#)发布到Facebook页面,但是当页面的pipe理员注销时,出现以下错误:

“(OAuthException – #190)validation访问令牌时出错:由于用户注销,会话无效。

如何生成永不过期的访问令牌?

我需要一个不打开Facebooklogin对话框的解决scheme。

发现可以生成Facebook页面访问令牌不会过期(请参阅文档中的“扩展页面访问令牌”部分),对于所有寻求相同function的用户,以下是一个清晰的分步指南:

  1. 确保你是你希望从中获取信息的FB页面的pipe理员
  2. 创build一个FB应用程序(应该是与页面pipe理员相同的用户帐户)
  3. 转到Facebook Graph API Explorer
  4. 在右上angular,从“应用程序”下拉列表中select您创build的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. 使用graphicsAPI调用,使用新的长期访问令牌查看您的帐户: https://graph.facebook.com/me/accounts?access_token=<your long-lived access token> : https://graph.facebook.com/me/accounts?access_token=<your long-lived access token>
  10. 抓取您将从中拉取信息的页面的access_token
  11. 把这个标记看成是过期的:从不!

这应该做到这一点。 你现在应该有一个Facebook页面访问令牌不过期!

这是我使用PHP SDK生成“从不”过期访问令牌的代码 :

 $facebook = new \Facebook\Facebook([ 'app_id' => '{app-id}', 'app_secret' => '{app-secret}', 'default_graph_version' => 'v2.10', 'default_access_token' => '{access-token}' ]); // Exchange token $token = $facebook->post('/oauth/access_token', array( 'grant_type' => 'fb_exchange_token', 'client_id' => 'APP ID', 'client_secret' => 'APP Secret', 'fb_exchange_token' => 'access Token' ) ); $token = $token->getDecodedBody(); $token = $token['access_token']; echo $token; 

我回应访问令牌,然后使用访问令牌debugging器进行debugging 。 结果应该是: Expires: Never

参考文献:

  • 设置扩展令牌
  • 到期和扩展令牌
  • 扩展页面访问令牌
  1. 为粉丝页面的pipe理生成长寿命的标记http://appdevresources.blogspot.sg/2012/11/extend-facebook-access-token-make-it.html (与图像很好的解释)
  2. 为粉丝页面本身生成长期的令牌http://appdevresources.blogspot.sg/2012/11/retrieving-facebook-page-id-and.html
  3. 使用来自2)的令牌在粉丝页面的墙上张贴(不需要Facebooklogin对话框)
  4. 结果令牌永远不会过期(即使粉丝页面的pipe理员也没有注销)

您可以按照以下说明生成永不过期的访问令牌:

  1. 打开graphics浏览器: https : //developers.facebook.com/tools/explorer/ 。
  2. 从右下angular下拉菜单中select您的应用程序。
  3. 从“获取令牌”下拉列表中select您的粉丝页面。
  4. 点击提交button来生成令牌。
  5. 在“search字段”的左侧inputaccess_token,然后再次单击“提交”。 从主窗口复制这个令牌。
  6. 打开https://developers.facebook.com/tools/debug/accesstoken并在这里粘贴标记。; 点击“debugging”。
  7. 点击“扩展访问令牌”button。 这将生成永不过期的令牌。

您可以使用以下api从Facebook刷新令牌生活到60天,当令牌即将过期时,再次调用相同的API在60天内刷新其生命的时间从该点过期60天后,令牌过期存在于expires参数中,其值以秒为单位

将CLIENT_ID和CLIENT_SECRETreplace为其实际值

 https://graph.facebook.com/oauth/access_token?client_id=<CLIENT_ID> &client_secret=<CLIENT_SECRET>&grant_type=fb_exchange_token &fb_exchange_token=<ACCESS_TOKEN> 

在ACCESS_TOKEN中,放置实际的标记值而不添加“access_token =”

下面的方法为我工作,如果您使用4.x Facebook SDK:

  1. 第一次使用这里提到的方法创build临时用户访问令牌。
  2. 现在! 现在是时候使用PHP SDK 4.x将此令牌转换为长期令牌。 使用下面的代码,因为它为我工作:

//Class for Generating the Long Lived Token

 namespace App\Lib; use Facebook\FacebookApp; use Facebook\FacebookClient; use Facebook\Authentication\OAuth2Client; class FacebookLongLivedTokenGenerator { public $longLivedTokenGenerated = false; public function generateFacebookLongLivedToken($appId, $appSecret, $oldToken) { //request new access token $oauth2Fb = new OAuth2Client(new FacebookApp($appId, $appSecret), new FacebookClient()); $longLivedToken = $oauth2Fb->getLongLivedAccessToken($oldToken); if ($longLivedToken) { $this->longLivedTokenGenerated = true; $this->userAccessToken = $longLivedToken; } return trim($this->userAccessToken); } } 

你可以这样使用上面的类:

 $longToken = new FacebookLongLivedTokenGenerator(); echo $longToken->generateFacebookLongLivedToken($appId, $appSecret, $oldUserAccessToken); 

这个Makefile从2015-10-29开始工作。 步骤2和3只给出两个月的令牌,但最后一步中给出的页面访问令牌在debugging器中显示为“过期:从不”。 这个答案借鉴了其他几个人的工作,并希望它能够为开发人员简化事情,而不pipe他们喜欢的编程语言。

在使用之前,您需要按照以下顺序将您现有的页面ID,应用程序ID和应用程序密码按照以下顺序放入您的〜/ .netrc文件中: machine graph.facebook.com login 123456 account 234567 password 345678

在使用之前,用w3mlogin到Facebook,点击“保持login状态”。

 MACHINE := graph.facebook.com PAGE_ID := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$4}' $(HOME)/.netrc) APP_ID := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$6}' $(HOME)/.netrc) APP_SECRET := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$8}' $(HOME)/.netrc) PERMISSIONS := manage_pages,publish_actions,publish_pages FB := https://www.facebook.com GRAPH := https://$(MACHINE) CODE ?= TOKEN ?= TWOMONTHTOKEN ?= BROWSER ?= w3m -dump REDIRECT := http://jc.unternet.net/test.cgi CLIENT_SIDE := $(FB)/dialog/oauth?client_id=$(APP_ID)&redirect_uri=$(REDIRECT) CLIENT_SIDE := $(CLIENT_SIDE)&scope=$(PERMISSIONS)&response_type=code SERVER_SIDE := $(GRAPH)/oauth/access_token?client_id=$(APP_ID) SERVER_SIDE := $(SERVER_SIDE)&redirect_uri=$(REDIRECT) SERVER_SIDE := $(SERVER_SIDE)&client_secret=$(APP_SECRET)&code=$(CODE) LONG_LIVED := $(GRAPH)/oauth/access_token?client_id=$(APP_ID) LONG_LIVED := $(LONG_LIVED)&client_secret=$(APP_SECRET) LONG_LIVED := $(LONG_LIVED)&grant_type=fb_exchange_token LONG_LIVED := $(LONG_LIVED)&fb_exchange_token=$(TOKEN) ACCOUNTS := $(GRAPH)/me/accounts?access_token=$(TWOMONTHTOKEN) export env: env @echo Usage: make code @echo ' ' make CODE=codefrompreviousstep token @echo ' ' make TOKEN=tokenfrompreviousstep longterm @echo ' ' make TWOMONTHTOKEN=tokenfrompreviousstep accounts @echo Then edit '$$HOME/.netrc' replacing password with page token code: $(BROWSER) "$(CLIENT_SIDE)" token: $(BROWSER) "$(SERVER_SIDE)" longterm: $(BROWSER) "$(LONG_LIVED)" accounts: $(BROWSER) $(ACCOUNTS) 

结果在很多情况下,第一步失败了w3m。 在这种情况下,安装另一个浏览器,如Firefox; 如果脚本是远程托pipe的,则将ssh -X发送到服务器; 并改用make BROWSER=firefox code 。 如下所示,下面的步骤应该和w3m一起工作。

注意:如果要剪切并粘贴这个Makefile,请确保使用适当的选项卡replace4空格的缩进。

接受的答案不再正确。 现在这个工作。

打开图资源pipe理器: https : //developers.facebook.com

  • login并从右下angular下拉列表中select您的应用程序
  • login后,点击右上angular的“工具与支持”图标
  • 然后select应用程序名称下方右侧的访问令牌工具链接

在显示的用户令牌右侧>点击[Debug]button

这将把你带到访问令牌debugging器

  • 点击底部的蓝色button,说明扩展访问令牌
  • 这将会说:这个新的长期访问令牌永远不会过期
  • 将该令牌复制并粘贴到您的应用程序中,即; EAAYMFDuobYUBADtYjVDukwBGpwPHOCY0iYglYY3j3r200MzyBZB4 …..