我需要从Facebook页面上删除一些帖子并将其显示在我的网站上。我正在考虑使用Facebook Graph API,但我有点挣扎,文档和各种教程似乎假设我将设置一个登录流程,首先要求用户登录我的网站。但那不是我需要的。我需要我的服务器端应用程序(保持)与Facebook进行身份验证,并定期获取任何新帖子。
我发现应该可以通过使用页面令牌获得一个长期存在的令牌,但是现在我甚至无法弄清楚如何使用常规的短期令牌进行身份验证。
因此,我设置了一个测试应用程序以获取应用程序ID和密码,然后转到Facebook Graph API Explorer以获取我用于创建应用程序的用户的身份验证令牌。
这是我用来测试连接Graph Api的基本代码:
(...)
$fb = new \Facebook\Facebook([
'app_id' => $app_id,
'app_secret' => $app_secret,
'default_graph_version' => '2.8',
'default_access_token' => $app_access_token
]);
try {
$response = $fb->get('/me');
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$me = $response->getGraphUser();
当我运行我的代码时,我收到此消息:
图表返回错误:API参数中提供的appsecret_proof无效
我已经三次检查$app_id
和$app_secret
是我创建应用程序时给出的值,并且我已经三次检查了我的访问令牌(尝试使用我的个人用户令牌以及我能够通过图表获得的页面令牌API Explorer)。
我发现另一个SO线程建议我应该手动生成一个appsecret证明,所以我这样做:
$appsecret_proof= hash_hmac('sha256', $app_access_token, $app_secret);
$fb = new \Facebook\Facebook([
'app_id' => $app_id,
'app_secret' => $appsecret_proof,
'default_graph_version' => '2.8',
'default_access_token' => $app_access_token
]);
我不确定我是否应该将$appsecret_proof
传递给app_secret
或者我应该如何使用它。我仍然在上面的代码中得到了同样的错误。
get facebook mutual friend with app user or non app user
$access_token = "facebook user token";
$facebook_id = "friend id";
$app_secret = "facebook secret";
$appsecret_proof = hash_hmac('sha256', $access_token,
$app_secret);
$graph_url = "https://graph.facebook.com/" . $facebook_id . "?fields=context.fields(all_mutual_friends.fields(id,name,picture.width(200).height(200)))" . "&access_token=" . $access_token . "&appsecret_proof=" . $appsecret_proof;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $graph_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$output = curl_exec($ch);
return $response_mutual = json_decode($output, true);
curl_close($ch);