1

私は広範囲に検索してきましたが、私の問題に本当に関連するトピックを見つけることができなかったので、新しい質問をすることにしました...

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.) ターミナルで実行すると、多数のヘッダーが返され、ボディ セクションに名前が 4 回表示されます (JSON エンコード)。

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

前もって感謝します!

編集:( 一時的な)回避策を見つけました。これは機能します(もちろん、シェルスクリプトを使用しているため):

<?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 でシェル スクリプトを使用してはいけないとどこかで読みましたが、その理由はわかりません...

ありがとう!

4

1 に答える 1