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

时间:2013-04-19 20:24:40

标签: php facebook-graph-api facebook-php-sdk facebook-apps facebook-access-token

我正在尝试开发一个PHP应用程序,它允许我通过cronjob自动在我的页面上发布新帖子,而我离线并且根本没有登录Facebook。我知道 offline_access 权限早已不复存在,但Removal of offline_access permission文章明确说明了以下内容:

  

场景5:页面访问令牌

     

当用户授予应用 manage_pages 权限时,该应用就可以了   获取用户管理的页面的页面访问令牌   查询[用户ID] /帐户图谱API端点。随着迁移   启用时,使用短期用户访问令牌进行查询   端点,获得的页面访问令牌也是短暂的。

     

交换短期用户访问令牌以进行长期访问   使用端点的令牌和前面解释的步骤。通过使用   长期用户访问令牌,查询 [用户ID] /帐户端点   现在将提供页面访问令牌,这些令牌不会过期   用户管理。查询非过期时也适用   通过已弃用的 offline_access 获取的用户访问令牌   权限。

...这让我觉得像我想到的那样自动化的PHP解决方案确实可以设计。所以我继续创建了一个新的应用程序,并授予了 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);
?>

...返回以下错误:

  

致命错误:未捕获OAuthException:需要用户访问令牌   请求此资源。

我做错了什么?

更令人困惑的是 - 同时,这段代码在我的墙上发布状态更新没有问题(我还没有登录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", "post", $args);

......相反,我得到了:

  

致命错误:未捕获OAuthException:(#200)用户没有   授权应用程序执行此操作

解决方案

先生的帮助下。 Mohammed Alaghbari ,我在这个问题上取得了合理的进展,并最终找到了解决方案。

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

  

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

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

但是,然后我退出并发出session_destroy();令我惊讶的是,在我这样做的那一刻,我的代码又开始抛出A user access token is required to request this resource.异常。我非常沮丧。

然后,我决定手动请求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();发表评论时,我的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", "post", $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'));

2 个答案:

答案 0 :(得分:1)

maringtr,

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

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

可以使用以下图形生成:

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

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

您可以测试网页访问令牌以使用图表获取您的网页Feed(将Page_ID替换为您的网页ID,将PAGE_ACCESS_TOKEN替换为上图中生成的网页访问令牌)

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

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

此致

答案 1 :(得分:0)

请批准 status_update ,正如我在此处所解释的那样why does posting to facebook page yield "user hasn't authorized the application"