2013-08-06 38 views
1

我一直在廣泛搜索,但找不到任何與我的問題真正相關的主題,所以我決定提出一個新問題...CURL調用在終端,但它不會在PHP

我試圖使用捲曲,工作在終端精細發出批量請求到Facebook的圖形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)在終端執行它! ,它應該返回大量的頭文件,並且在正文部分使用4次你的名字(JSON編碼)。

4.)到現在爲止,一切都應該工作。這裏談到壞的部分,在4個佔位符在下面的PHP腳本重新粘貼您的令牌:

<?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 .... \」}]「,」type「:」OAuthException「,」code「: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

我忘了在Facebook上添加一個鏈接到文檔:https://developers.facebook。com/docs/reference/api/batch/ –

+0

您可以編輯您的答案:) – Freelancer

+0

如何從批處理中刪除所有存取令牌,因爲您發送的是整體存取令牌?或者你是否在實際批量查詢單獨的用戶? –

回答

0

我跑了你的代碼的前半部分,看看$fields_string的內容在啓動任何curl命令之前會是什麼。出於某種原因,rtrim並沒有爲我刪除字符串中的最後一個&符號。也許用這個代替刪除最後一個字符:

$fields_string = substr($fields_string, 0, -1); 
+0

試過了,沒有工作,不幸的是,同樣的錯誤:(但謝謝你的提示! –

相關問題