我已经设法通过 API (C#) 发布到 Facebook 页面,但是当页面管理员注销时,会发生以下错误:
“(OAuthException - #190)验证访问令牌时出错:会话无效,因为用户已注销。”
如何生成永不过期的访问令牌?
我需要一个不打开 Facebook 登录对话框的解决方案。
我已经设法通过 API (C#) 发布到 Facebook 页面,但是当页面管理员注销时,会发生以下错误:
“(OAuthException - #190)验证访问令牌时出错:会话无效,因为用户已注销。”
如何生成永不过期的访问令牌?
我需要一个不打开 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;
我回显访问令牌,然后使用访问令牌调试器对其进行调试。结果应该是:Expires: Never
.
来自文档的参考:
您可以使用来自 facebook 的以下 api 将令牌寿命刷新到 60 天,并且就在令牌即将到期时,在 60 天内再次调用相同的 api 以从该时间点将其寿命刷新回 60 天令牌过期是存在于 expires 参数中,其值以秒为单位
将 CLIENT_ID 和 CLIENT_SECRET 替换为其实际值
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=”
选择您在上面创建的应用,然后选择“在下拉菜单中获取用户访问令牌”</p>
在弹出的用户访问令牌中,您可以为令牌选择一些权限。对于非到期页面访问令牌,您需要选择“发布页面”和“管理页面”
转到https://developers.facebook.com/tools/accesstoken/。在那里,您将找到您拥有的所有应用程序的短期用户访问令牌和应用程序访问令牌
按上面创建的应用程序的用户访问令牌的调试选项。这将带您进入调试工具。您可以在哪里找到短期用户访问令牌的所有信息。
在底部,可以选择为这个短期用户访问令牌生成长期(60 天)用户访问令牌。通过选择“扩展访问令牌”生成长期用户访问令牌</p>
一种。转到图形资源管理器 - https://developers.facebook.com/tools/explorer/。
湾。将上一步中生成的长期用户访问令牌粘贴到“访问令牌”字段中。
C。访问“/me?fields=access_token” api。这将产生页面访问令牌和与之相关的页面。这些页面访问令牌永远不会过期(直到用户更改密码/用户撤销应用程序)
一种。转到https://developers.facebook.com/tools/debug/accesstoken/
湾。将上述步骤检索到的页面访问令牌添加到“访问令牌”字段并调试
你会得到从不过期
在这里发现的变化很小: https ://medium.com/@Jenananthan/how-to-create-non-expiry-facebook-page-token-6505c642d0b1
现在是 2018 年 11 月,这对我有用!
<?php
$args=[
'usertoken'=>'xxx',
'appid'=>'xxx',
'appsecret'=>'xxx',
'pageid'=>'xxx'
];
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/{$args['pageid']}?fields=access_token&access_token={$longtoken}")); // get user id
$finaltoken=$r->access_token;
return $finaltoken;
}
echo "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']}";
echo '<br><br>Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';
接受的答案不再正确。这现在有效。
打开图形资源管理器:https ://developers.facebook.com
在显示的用户令牌的右侧 > 单击 [调试] 按钮
这将带您进入访问令牌调试器
您需要通过具有 manage_pages、pages_show_list 和其他范围权限的 FB.login() 获取用户访问令牌。然后,执行 FB.api("/{user-app-id}/accounts", fields: ...) 以获取页面列表及其各自的信息,包括 access_token。在这里,您会获得一个短暂的令牌,但使用此令牌,您可以将其过期时间延长为“从不”。
FB.login(function (response){
if(response.status!=="connected"){
return;
}
FB.api('/'+USER_APP_ID+'/accounts',{fields: 'id, name, access_token,category, picture'},
function(d){
console.log(d) // Here you get access_token (short-lived-token)
});
},{scope: 'manage_pages, pages_show_list', auth_type: 'rerequest'});
使用最后一个访问令牌并从服务器端调用 API Graph,使用应用程序的应用程序 ID 和应用程序密钥来获取管理页面的权限。
GET /oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token}
响应为您提供了一个访问令牌,其过期时间为“从不”。
参考: API Graph Accounts , Expiration and Extends Access Tokens
如果您使用的是4.x
Facebook SDK,以下方法对我有用:
//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 步只给出了两个月的令牌,但在最后一步中给出的页面访问令牌在调试器中显示为“Expires: Never”。这个答案借鉴了其他几个人的工作,并希望它能为开发人员简化事情,而不管他们喜欢哪种编程语言。
在使用它之前,您需要将现有的页面 ID、应用程序 ID 和应用程序密码按顺序放入 ~/.netrc 文件中,如下所示:machine graph.facebook.com login 123456 account 234567 password 345678
同样在使用此功能之前,请使用 w3m 登录 Facebook,单击“保持登录状态”。
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;ssh -X
如果脚本是远程托管的,则发送到您的服务器;并make BROWSER=firefox code
改用。如图所示,以下步骤应适用于 w3m。
注意:如果剪切和粘贴此 Makefile,请确保将 4 空格缩进替换为适当的制表符。
使用 Facebook API v3.1 - 上面的答案都不适合我。相反,我不得不:
1)创建“系统用户”
2)授予他访问我需要的属性(在我的情况下是一个应用程序)
3) 为该应用程序和系统用户生成一个新令牌
我使用的说明可以在这里找到
podrias intentar algo como esto
Administrar Paginas
<a href="#" class="btn" onclick="token_live()" >url</a>
<script type="text/javascript">
function token_live(){
var token_app = "";
$.ajax({
url: "https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id=598062314053459&client_secret='client_secret'&fb_exchange_token=access_token",
type: 'POST',
dataType: 'HTML',
data: {api_public: 'AP-42b3a8aab70',
},
})
.done(function(data) {
var txt = data
var obj = JSON.parse(txt);
var token_live = obj.access_token
var url_infinit = "https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id='remplaza_cliente_id'&client_secret='client_secret'&fb_exchange_token="+token_live;
alert(url_infinit);
```