1

我一直在广泛搜索,但找不到任何与我的问题真正相关的主题,所以我决定提出一个新问题......

我正在尝试使用 CURL 向 Facebook Graph API 发出批处理请求,该请求在终端中运行良好,但在 PHP 中根本不行......

重现步骤:

1.) 从 Graph API Explorer 为自己获取访问令牌(无需权限,只需一个有效令牌)链接:http: //developers.facebook.com/tools/explorer

2.)将其粘贴到以下终端命令中:(请注意,您需要将其粘贴在总共 4 个占位符中才能正常工作!)

curl \
-F 'access_token=PASTE_ACCESS_TOKEN_HERE' \
-F 'batch=[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]' \
https://graph.facebook.com

3.)在终端中执行它,它应该返回很多标题,并且你的名字在正文部分(JSON 编码)中返回 4 次。

4.) 到现在为止,一切都应该正常工作。不好的部分来了,将您的令牌再次粘贴到以下 PHP 脚本的 4 个占位符中:

<?php
$url = 'https://graph.facebook.com';
$fields = array(
                        'access_token' => 'PASTE_ACCESS_TOKEN_HERE',
                        'batch' =>
'[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]'
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

print_r($result);
?>

6.) 运行代码,你应该(至少我这样做......)从 Facebook 收到以下错误消息:'{"error":{"message":"Malformed access token ACCESS_TOKEN_HERE....\"} ]","type":"OAuthException","code":190}}1'

我猜 Facebook 认为 JSON 右括号是访问令牌的一部分,因此它会返回此错误。我尝试从 $fields['batch'] 末尾删除转义的双引号和大括号,但随后它引发另一个错误,指出批处理参数必须是 JSON 字符串(显然......)

我是否遗漏了什么或者这是 Facebook 的错(如果是这样,我不明白终端解决方案为什么有效......)?

以下是官方 Facebook 文档顺便说一句:http: //developers.facebook.com/docs/reference/api/batch

提前致谢!

编辑: 我找到了一个(临时)解决方法,这将起作用(当然,因为它使用 shell 脚本):

<?php
$result = shell_exec('curl \
-F \'access_token=PASTE_ACCESS_TOKEN_HERE\' \
-F \'batch=[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]\' \
https://graph.facebook.com');

print_r(json_decode($result),true);
?>

有人知道为什么这是一个比使用 PHP-cURL 更糟糕的解决方案(我想是这样)吗?我在某处读到你不应该在 PHP 中使用 shell 脚本,但我不知道为什么......

谢谢!

4

1 回答 1

0

$fields_string我运行了您的代码的前半部分,只是为了在启动任何 curl 命令之前查看其内容。出于某种原因,rtrim 没有为我删除字符串中的最后一个 & 符号。也许使用它来删除最后一个字符:

$fields_string = substr($fields_string, 0, -1);
于 2013-08-06T15:28:39.800 回答