自动注释Cron作业不再工作:致命错误:未捕获OAuthException:错误签名


Automated Comment Cron Job No Longer Working: Fatal error: Uncaught OAuthException: Bad signature

几个月前,我写了一个小应用程序,可以解析客户博客页面上的一个字符串,并将其作为评论发布到他们的Facebook墙上,我有资格管理它。

客户端只需对我的应用程序进行一次身份验证,然后,通过现在被取消的"offline_access"权限,我就可以代表他们在墙上发帖。

无论我使用的是旧的SDK还是最新的SDK,代码都不再有效。我试图将我的代码(如下)迁移到最新版本的SDK和最新的协议中以处理身份验证,但没有成功。我还让客户端使用"manage_pages"作用域(我从第一天起就使用了该作用域)重新验证我的应用程序,没有任何区别。

我得到的错误是Fatal error: Uncaught OAuthException: Bad signature

我一直在Facebook的文档和Stack Overflow的智者之间徘徊,我已经无计可施了。我认为我的问题在于无法生成"长寿命"访问令牌,但我必须能够做到这一点,而不需要客户端每次都登录Facebook(或者根本不登录)。那么,其他应用程序,比如那些将用户的推特状态镜像到Facebook的应用程序,如何在没有后续用户登录/身份验证的情况下处理离线发布呢?

我注意到,如果我使用Facebook的Graph API资源管理器,我的代码就可以工作。但这需要我看一场对话,而这对我的客户来说是行不通的。(几个月前从未需要登录/重新验证。)

在过去的一周里,我一直在努力寻找答案,但我一直在兜圈子:

https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens

https://developers.facebook.com/roadmap/offline-access-removal

Facebook API:如何在不登录的情况下发布到自己的应用程序墙

http://facebook.stackoverflow.com/questions/11839544/how-to-avoid-fatal-error-uncaught-oauthexception-when-using-cron-job

仅举几个例子。我感觉自己像只被困在浴缸里的蜘蛛。

如果有人能分享一个适合我特定情况的实用代码示例,我将不胜感激,谢谢。以下是我试图适应最新的Facebook PHP SDK和协议的代码:

<?php
require_once 'facebook.php';
$facebook_access_token_url = "https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id=" . FACEBOOK_APP_ID . "&client_secret=" . FACEBOOK_APP_SECRET;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $facebook_access_token_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$facebook_access_token = curl_exec($ch); 
curl_close($ch);
$config['appId'] = FACEBOOK_APP_ID;
$config['secret'] = FACEBOOK_APP_SECRET;
$config['fileUpload'] = false; // optional
$facebook = new Facebook($config);
$facebook->setAccessToken($facebook_access_token);
$page_id = FACEBOOK_APP_PAGE_ID;
$facebook_access_token = "";
$result = $facebook->api('/' . FACEBOOK_ACCOUNT_ADMIN_ID . '/accounts');
foreach($result['data'] as $page){
    if($page['id'] == $page_id) {
        $facebook_access_token = $page['access_token'];
        break;
    }
}
$facebook->setAccessToken($facebook_access_token);
$attachment = array(
    'access_token' => $facebook_access_token,
    'message' => 'Test message',
    'scope' => 'manage_pages,publish_stream,publish_actions'
);
$result = $facebook->api('/' . $_GET['post_id'] . '/comments', 'post', $attachment);
?>

如果使用长期用户访问令牌获取页面访问令牌,则默认情况下页面令牌不会过期,因此offline_access弃用在这种情况下并不是实际问题。