VB.NETでLive Search APIの利用について書きました。が、VB.NETは良いとして(?)Windowsアプリケーションで使えても全然おもんないよと。Web検索なんだからWebで使えないと……。でも、ASP.NETで作ったとしてもサーバどうするんだよって感じなのでPHPでLive Search APIを使ってみたいと思います。
PHPでSOAP
PHP5からはSOAP関数が用意されています。これを利用できる人はこれを利用した方が良いと思いますが、今回はPEARのSOAPを使いました。SOAP関数の方はインストール時にSOAP拡張モジュールが指定されていないと使えませんので使用できる人が限られそうです(つまり私だ)。対してPEARはファイルのコピーで済ますことも可能です。現時点でバージョンは0.11.0(beta)です。ベータバージョンのためPEARコマンドを使用してインストールする場合はバージョンを指定する必要があります。
pear install soap-0.11.0
PHPからLive Search APIを呼ぶ
こんなコードになりました。1件画像検索してサムネイルを表示しています。
<?php
require_once 'SOAP/Client.php';
$wsdl = new SOAP_WSDL('http://soap.search.msn.com/webservices.asmx?wsdl', array('timeout' => 30));
//echo '<pre>' . $wsdl->generateAllProxies() . '</pre>' . "\n";
$proxy = $wsdl->getProxy();
$proxy->setEncoding('UTF-8');
$appId = 'Your AppID';
$query = '初音ミク';
$cultureInfo = 'ja-JP';
$tns = 'http://schemas.microsoft.com/MSNSearch/2005/09/fex1';
$sourceRequest = array(
new SOAP_Value('{' . $tns . '}Source', 'string', 'Image'),
new SOAP_Value('{' . $tns . '}Offset', 'int', 0),
new SOAP_Value('{' . $tns . '}Count', 'int', 1),
new SOAP_Value('{' . $tns . '}ResultFields', 'string', 'Image'));
$requests = array(
new SOAP_Value('{' . $tns . '}SourceRequest', '', $sourceRequest));
$request = array(
new SOAP_Value('{' . $tns . '}AppID', 'string', $appId),
new SOAP_Value('{' . $tns . '}Query', 'string', $query),
new SOAP_Value('{' . $tns . '}CultureInfo', 'string', $cultureInfo),
new SOAP_Value('{' . $tns . '}SafeSearch', 'string', 'Moderate'),
new SOAP_Value('{' . $tns . '}Flags', 'string', 'None'),
new SOAP_Value('{' . $tns . '}Requests', '', $requests));
$result = $proxy->Search(new SOAP_Value('{' . $tns . '}Request', '', $request));
foreach ($result->Responses as $response) {
foreach ($response->Results as $result) {
echo '<img src="' . $result->Image->ThumbnailURL . '" /><br />' . "\n";
}
}
?>
SOAP_WSDLの情報少ないよ……。実際にネットワークを流れるデータやPEAR SOAP自体のコードを見ながら作りました。上記コードのコメント部分をはずすとLive Search APIのため実際にどのようなコードが生成されているのかが分かります。難解にしているのは、Live Search APIのSearchメソッドが引数に単純に文字列を指定するだけでは使えないってとこですね。SOAP_WSDLから使うにはとりあえず上記のようにSOAP_Valueオブジェクトを作らないとダメみたいです。
問題点
めでたくWebからも初音ミクの画像がゲットできましたが、問題が出てきました。このPEAR SOAPがバグってるようです。今回のケースで検索件数を複数にするとLive Search APIからはきちんと指定した件数を受信できているのですが、受信したデータをPHP用に変換する際に数件結果が抜けてしまっています。SOAP_Base_Objectクラスのfunction &_decode(&$soapval)で戻り値がおかしくなっているとこまで突き止めましたが後は誰かお願いします……。
Other Information
PEAR SOAP + Google Searchは、以下が参考になります。
また、ネットワークモニタはWiresharkを利用しました。初めて使いましたがこれ良いですね。HTTPのContent-Typeがtext/xmlだとXMLを解釈して表示してくれるし、データ部分をテキストのみのコピーが可能です。Etherealの後継みたいです。