2009/12/21

[php][Google Ajax Search API]画像(imgae)を検索する方法とcurl関数群について

今回は、若干、タイトルが長いのですが。

googleの画像(image)検索をajaxではなくサーバー上で検索を行いたい場合について調査を行いました。

Google AJAX Search APIのFlash and other Non-Javascript Environmentsというセクションを読むと、Code Snippetsとして以下のPHPプログラムが紹介されていました。

以下、ちょっと紹介(転載)します。

$url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton";

// sendRequest
// note how referer is set manually
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, /* Enter the URL of your site here */);
$body = curl_exec($ch);
curl_close($ch);

// now, process the JSON string
$json = json_decode($body);
// now have some fun with the results...

via:Php Access

ここで初めてでてきたのが、curl関数群なのですが、どうして、前回紹介したgetメソッドを利用したhttpリクエストを使用していないのかというと(ここからは考察です。)、

1:リファレンスがcurlを推奨していた
2:http referer headerを必ずチェックしなければならない
3:サンプルソースが元々そうなっているから!!(かなり無理やり感がありますが。。。)

が原因なのではないかと。

後、リファレンスでは、PHPのバージョンを5.2以降を推奨していましたが、この理由として、jsonをサーバー上でパースすることができるためです。
jsonをPHPでパースすための方法については、また改めて書こうと思っております。

curl関数群について初めて知ったのでそれについてちょっと解説します。

まず、

1:curl_initで初期化
2:curl_setopt($ch, CURLOPT_URL, $url);で取得するurlを設定
3:curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);でcurl_exec関数の返り値を文字列で取得する。
4:curl_setopt($ch, CURLOPT_REFERER, /* Enter the URL of your site here */);でリファラーを設定
5:curl_exec($ch);で問い合わせの実行

という流れになっています。

これを書いていて思ったのですが、/* Enter the URL of your site here */の部分を適当な名前に変えればリファラー詐称できちゃんじゃないのか??
試してないので適当です。

後、通信プロトコルってどうなっているんだろう?

PHPのマニュアルのcurl_setoptを読むと、CURLOPT_HTTPGETの値がデフォルトでtrueになっているので、とりあえずhttp通信のgetメソッドをしているのだと納得します。

話を元に戻して、上は、パリスヒルトンで検索していますが、ジェシカアルバでしかも画像の検索を行いたかったので、下記のようにプログラムの修正を行い、実行してみました。
//検索文字列の設定
$url_string = "ジェシカ アルバ";
//urlエンコード
$url_string = urlencode($url_string);
$url = "http://ajax.googleapis.com/ajax/services/search/images";
$url = $url."?v=1.0";
$url = $url."&key=取得したapi-key";
$url = $url."&rsz=large";
$url = $url."&q=".$url_string;

// sendRequest
// note how referer is set manually
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://・・・.php");
$body = curl_exec($ch);
curl_close($ch);

// now, process the JSON string
$json = json_decode($body);


url変数については、こちらを参考にしてください。

結果としては、うまくいき、きちんと画像を表示することができました。

今回は、だいぶ長くなってしまったため、戻り値について書くことができませんでしたが、後日時間が取れれば書いていきたいと思います。

0 コメント:

コメントを投稿