我一直在广泛搜索,但找不到与我的问题真正相关的任何主题,所以我决定提出一个新问题......
我正在尝试使用CURL向Facebook Graph API发出批量请求,这在终端中运行良好,但它根本不会在PHP中...
重现的步骤:
1。)从Graph API资源管理器中获取自己的访问令牌(无需权限,只需一个有效令牌)链接: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”:“格式错误的访问令牌ACCESS_TOKEN_HERE .... \ “}]”, “类型”: “OAuthException”, “代码”:190}} 1'
我猜Facebook认为JSON关闭括号是访问令牌的一部分,因此它会返回此错误。我尝试从$ fields ['batch']的末尾删除转义的双引号和大括号,但随后又抛出另一个错误,指出批处理参数必须是JSON字符串(显然......)
我错过了什么或是Facebook的错(如果是这样,我不明白为什么终端解决方案有效......)?
以下是官方Facebook文档BTW: 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脚本,我不知道为什么......
谢谢!
答案 0 :(得分:0)
我运行代码的前半部分只是为了在启动任何curl命令之前查看$fields_string
的内容。出于某种原因,rtrim并没有为我删除字符串中的最后一个&符号。也许用它代替删除最后一个字符:
$fields_string = substr($fields_string, 0, -1);