加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 无法通过授予manage_pages权限的应用获取页面访问令牌

发布时间:2020-12-13 22:48:21 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试开发一个 PHP应用程序,它允许我通过cronjob自动在我的页面上发布新帖子,而我在线下并且根本没有登录Facebook.我知道offline_access权限早已不复存在,但 Removal of offline_access permission文章清楚地说明了以下内容: Scenario 5: Page Access
我正在尝试开发一个 PHP应用程序,它允许我通过cronjob自动在我的页面上发布新帖子,而我在线下并且根本没有登录Facebook.我知道offline_access权限早已不复存在,但 Removal of offline_access permission文章清楚地说明了以下内容:

Scenario 5: Page Access Tokens

When a user grants an app the manage_pages permission,the app is able
to obtain page access tokens for pages that the user administers by
querying the [User ID]/accounts Graph API endpoint. With the migration
enabled,when using a short-lived user access token to query this
endpoint,the page access tokens obtained are short-lived as well.

Exchange the short-lived user access token for a long-lived access
token using the endpoint and steps explained earlier. By using a
long-lived user access token,querying the [User ID]/accounts endpoint
will now provide page access tokens that do not expire for pages that
a user manages. This will also apply when querying with a non-expiring
user access token obtained through the deprecated offline_access
permission.

…这让我觉得像我想到的那样自动化的PHP解决方案确实可以设计.所以我继续创建了一个新的Application并授予了manage_pages权限以及publish_actions权限.

不过我的代码:

<?php
require_once("sdk/facebook.php");

$config = array();
$config['appId'] = MY_APP_ID;
$config['secret'] = MY_APP_SECRET;
$config['fileUpload'] = false; // optional

$facebook = new Facebook($config);

$accountID = MY_ACCOUNT_ID;
$pages = $facebook->api("/$accountID/accounts/");
var_dump($pages);
?>

…返回以下错误:

Fatal error: Uncaught OAuthException: A user access token is required
to request this resource.

我究竟做错了什么?

更令人困惑的是 – 在同一时间,这段代码,在没有问题的情况下将状态更新发布到我的墙上(我还没有登录Facebook或其他任何东西)

<?php
require_once("sdk/facebook.php");

$config = array();
$config['appId'] = MY_APP_ID;
$config['secret'] = MY_APP_SECRET;
$config['fileUpload'] = false; // optional

$token_url =    "https://graph.facebook.com/oauth/access_token?" .
                "client_id=" . $config['appId'] .
                "&client_secret=" . $config['secret'] .
                "&grant_type=client_credentials";
$app_token = str_replace('access_token=','',file_get_contents($token_url));


$facebook = new Facebook($config);

$args = array(
    'access_token'  => $app_token,'message'       => 'test post via app access token'
);
$accountID = MY_ACCOUNT_ID;
$post_id = $facebook->api("/$accountID/feed","post",$args);
?>

……如果我这样做的话

$post_id = $facebook->api("/$myPageID/feed",$args);

……相反,我得到:

Fatal error: Uncaught OAuthException: (#200) The user hasn’t
authorized the application to perform this action

解决方案

在穆罕默德·阿拉巴里先生的亲切帮助下,我能够在这个问题上取得合理的进展,并最终找到了解决方案.

正如他所建议的,我需要先生成一个用户访问令牌,发出如下请求:

07001

为了检索实际的页面访问令牌并发布到页面.所以我意识到,当我通过PHP SDK生成的登录链接登录时,在$_SESSION变量中为我存储了USER_ACCESS_TOKEN.我拿了那个令牌,向https://graph.facebook.com/me/accounts?access_token=USER_ACCESS_TOKEN发出请求,检索了PAGE_ACCESS_TOKEN并使用它来成功将测试消息发布到我的页面.

但是,然后我退出并发出了session_destroy();令我惊讶的是,当我这么做时,我的代码开始抛出一个用户访问令牌,需要请求此资源.例外.我非常沮丧.

然后,我决定手动请求https://graph.facebook.com/MY_ACCOUNT_ID/accounts/?MY_USER_ACCESS_TOKEN,看看会发生什么.令我更大的惊喜 – GRAPH API接受了USER_ACCESS_TOKEN并返回了所有有效的页面标记.我非常沮丧为什么我在SDK中获得异常,但是当我直接向GRAPH API发出请求时没有错误,所以我决定开始调试base_facebook.php.我正在使用的PHP SDK是版本3.2.2.

经过几个小时的搜索,结果发现位于base_facebook.php第899行的代码抛出异常而没有理由(有点)

if (!isset($params['access_token'])) {
  $params['access_token'] = $this->getAccessToken();
}

当我评论$params [‘access_token’] = $this-> getAccessToken(); out,我的PHP SDK请求再次开始返回有效令牌.

奇怪的.我想知道这是PHP SDK中的错误,还是我的代码有问题.我的最终代码大致如下:

<?php
require_once("sdk/facebook.php");

$config = array();
$config['appId'] = MY_APP_ID;
$config['secret'] = MY_APP_SECRET;
$config['fileUpload'] = false; // optional

$facebook = new Facebook($config);

$token = MY_USER_TOKEN; // extracted from $_SESSION

$response = $facebook->api("/MY_ACCOUNT_ID/accounts/?access_token=$token");

// code that extracts the page token from $response goes here

$args = array(
    'access_token'  => MY_PAGE_TOKEN,'message'       => 'test post via app access token'
);

$post_id = $facebook->api("/MY_PAGE_ID/feed",$args); // It works!!
?>

编辑#2

经过一些进一步的测试后,事实证明,你可以修改,而不是评论第899行

$facebook->api("/MY_ACCOUNT_ID/accounts/?access_token=MY_ACCESS_TOKEN');

$facebook->api("/MY_ACCOUNT_ID/accounts/",'get',array('access_token' => 'MY_ACCESS_TOKEN'));

解决方法

maringtr,

要与页面交互,您需要使用页面访问令牌(检查访问令牌类型:Access Token Types)

类型有:用户访问令牌,页面访问令牌,应用访问令牌

可以使用以下图形生成:

https://graph.facebook.com/me/accounts?access_token=USER_ACCESS_TOKEN

上图将为您提供您管理的页面列表,其中包含详细信息(页面名称,ID,访问令牌)

您可以测试页面访问令牌以使用图形获取页面源(使用您的页面ID替换Page_ID,使用上面的图形生成的页面访问令牌替换PAGE_ACCESS_TOKEN)

https://graph.facebook.com/PAGE_ID/feed?access_token=PAGE_ACCESS_TOKEN&message=Testing

有关更多信息和示例:Log In as Page

问候,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读