php – 无法通过授予manage_pages权限的应用获取页面访问令牌
我正在尝试开发一个
PHP应用程序,它允许我通过cronjob自动在我的页面上发布新帖子,而我在线下并且根本没有登录Facebook.我知道offline_access权限早已不复存在,但
Removal of 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); ?> …返回以下错误:
我究竟做错了什么? 更令人困惑的是 – 在同一时间,这段代码,在没有问题的情况下将状态更新发布到我的墙上(我还没有登录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); ……相反,我得到:
解决方案 在穆罕默德·阿拉巴里先生的亲切帮助下,我能够在这个问题上取得合理的进展,并最终找到了解决方案. 正如他所建议的,我需要先生成一个用户访问令牌,发出如下请求:
为了检索实际的页面访问令牌并发布到页面.所以我意识到,当我通过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 问候, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |