ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

全体表示

[ リスト ]

Yahoo!ウェブ検索APIのライブラリをつくってみる



前回はAPIのパースに「正規表現」を使うやり方を書きましたが、もう少し進めてYahoo!の検索APIを利用するためのライブラリを作ってみることにします。

ところでYahoo! JAPAN主催のWEB APIコンテストが開催されるようです。グランプリは賞金30万円。個人的にはWEB+DB PRESS賞(「WEB+DB PRESS」年間購読権)が欲しいです。締切は4月30日。

応募条件にYahoo!APIを使うこと!とあるので検索APIの使い方は押えておきたいところです。


まずは既存のライブラリを探してみる


「yahoo api ライブラリ」といった単語で検索しても案外見つかりません。公式に出ているSDK(ソフトウエア開発キット)にもPHPのプログラムが入っていますが再利用しやすいように作られていません。

PEARというPHPの標準ライブラリから「yahoo」を検索すると1つ見つかります。
PEAR :: Package :: Services_Yahoo
が、これはPHP5専用なのでいまいち。PHP5用ならZend_Frameworkというライブラリにも含まれています。
Zend Framework

PHP4でも動く、簡単なライブラリはどうやらなさそうなのでさくっと作ってみることにしました。ウェブ検索以外にもオークション等々、APIはたくさん出ていますが、ここではウェブ検索だけ動けばいいことにします。

APIの利用にはアプリケーションIDの登録なる処理が必要なのでYahoo! JAPANのIDでログインして登録してください。

骨組みを決める


さて、今まさにこの記事を書きながらどう作るか考えているのですが、、理想的にはライブラリを使うときは1行ですませたいものです。今までに出てきたsimplexml_load_fileやunserialize関数と同じように。

$data = yahoo_web_api_parser(あれこれ指定);

まずはAPIの仕様を眺めます。


「リクエストパラメータ」、APIへの入力は1つずつ関数への引数で指定することにしましょう。

$data = yahoo_web_api_parser('アプリケーションID', '検索語', 云々);

こんな感じに。で、早速このyahoo_web_api_parserという独自の関数を定義。何度も繰り返し使いたい処理は関数にしてひとまとめにしておきます。

<?php
/**
* Yahoo!ウェブ検索APIのパーサ
*
* @since 2007.3.17
*/
function yahoo_web_api_parser($appid,
$query,
$type = 'all',
$results = 10,
$start = 1,
$format = 'any',
$adult_ok = "",
$similar_ok = "",
$language = 'ja',
$country = "",
$site = array()
)
{
}

あとでわからなくなると困るのでAPIの仕様と引数の変数名は同じ順番、同じ名前にしておきました。引数にもデフォルトの値を入れておけるので、APIの仕様にデフォルト値があるものはそれに従っています。

注意が必要なのは$siteでしょうか。ここには検索対象にするドメインを複数個指定できるので、複数の文字列を扱いやすい配列にしました。

最初にコメントを入れるのは念のためです。

さて、入力が決まったので次は出力。ここはやはり配列で。

function yahoo_web_api_parser(略)
{
$results = array();
return $results;
}

「初期化」、と言いますが最初に変数にデフォルトになる値を入れておくとわかりやすいです。returnで関数の返り値、ここでは$resultsを指定します。

中身の実装


骨組みはできたので中身を作っていきます。
function yahoo_web_api_parser(略)
{
$data = array();
$request_url = 'http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch';
$request_parameters = sprintf('?appid=%s&query=%s&type=%s&results=%d
&start=%d&format=%s&adult_ok=%s&similar_ok=%s&
language=%s&country=%s',
$appid, urlencode($query), $type, $results, $start, $format,
$adult_ok, $similar_ok, $language, $country, vsprintf('&site=%s', $site));
$url = $request_url . $request_parameters;
echo $url . "<br>";
return $data;
}
yahoo_web_api_parser('zuzara', '今日は何の日?');

テストしながら作るのがいいので、printデバッグ用に随時echoしています。
$request_urlは仕様に書いてあるもので、$request_parametersにリクエストパラメータを入れています。RESTのAPIの場合は、URLの?マーク以降に***=***とキーと値を&マークで繋げていく形式です。

sprintfとvsprintfについてはマニュアル参照。ややこしいかもしれないので飛ばしてもいいかもしれません。
PHP: sprintf - Manual

で、$request_urlと$request_parametersをくっつけてようやく、実際にアクセスするURLの出来上がりです。最後の行で作った関数を早速呼び出しています。1番目の引数が登録したアプリケーションID、2番目が検索語、3番目以降の引数は書かなくてもデフォルト値が入ります。

ちなみに
yahoo_web_api_parser('今日は何の日?');
と必須の引数が2つのところを1つにしてしまうと、、
PHP Warning: Missing argument 2 for yahoo_web_api_parser(), called in /home/funaki/public_html/holip/yahoo_web_api_parser.php on line 25 and defined in /home/funaki/public_html/holip/yahoo_web_api_parser.php on line 6

といった具合にエラーが出るので引数が足りないことに気付けます。

さて、出力されたURLをコピー&ペーストしてブラウザでアクセスしてみてください。何やら結果らしきものが表示されるでしょうか。
http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=zuzara&query=以下略

うまくいかないケースとしては、作ったプログラムのファイルのエンコードをShift_JISで保存してしまっているとき。APIの仕様にもある通り、$queryはUTF-8である必要があるので、ファイル自体をUTF-8で保存する必要があります。その辺りはあれこれ検索してみてください。

ひとまずここまでで明日続きを書く予定です。

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(1)


.


みんなの更新記事