我正在尝试开发一个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'));
答案 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"