PHPで「Wikipedia API」を利用する

(1/1)
フリーの百科事典として有名な「Wikipedia」にも WebAPI が用意されている。見出し語のダイジェストを返してくれるサービスで、もちろん無料だ。
そこで今回は、「Wikipedia API」を利用するプログラムを紹介する。
さらに、KAKASI を使った単語分解処理と組み合わせることで、用語の解説として Wikipedia のハイパーリンクを張ったようなサイトを構築することもできるだろう。

サンプル・プログラムの実行例

PHPで「Wikipedia API」を利用する

サンプル・プログラム

WebAPI:Wikipedia API

WebAPIのURL
URL
http://wikipedia.simpleapi.net/api

入力パラメータ
項目名 フィールド名 内  容
見出し語 keyword string 検索したい見出し語。必須。
出力形式 output string xml, rss, json,html, javascript, php, tsv から選択。必須。
json名称 callback string 出力形式がjsonの時の名称。省略可能。
言語 lang string 現時点では未実装。
検索方法 search string 現時点では未実装。
応答データ構造(xml) results result language 言語;ja固定 id Wikipediaの管理ID url Wikipedia本文のURL title 見出し語 body ダイジェスト文 length ダイジェスト文の長さ redirect 別のキーワードへのリダイレクトの有無 strict 1:見出し語と完全一致,2:部分一致 datetime 更新日時

サンプル・プログラムの解説:WebAPI部分

0132: /**
0133:  * Wikipedia APIから必要な情報を配列に格納する
0134:  * @param array  $items   情報を格納する配列
0135:  * @param array  $query   検索語
0136:  * @return int ヒット数
0137: */
0138: function getResults(&$items$query) {
0139: //受信データの要素名
0140: $tbl = array(
0141:     'language',        //言語;現在は'ja'固定
0142:     'id',            //Wikipediaの管理ID
0143:     'url',            //Wikipedia本文のURL
0144:     'title',        //見出し語
0145:     'body',            //ダイジェスト文の長さ
0146:     'length',        //ダイジェスト文の長さ
0147:     'redirect',        //別のキーワードへのリダイレクトがあるか
0148:     'strict',        //1:見出し語と完全一致,0:部分一致
0149:     'datetime'     //更新日時
0150: );
0151: 
0152:     $url = getURL_wikipediaAPI($query);      //リクエストURL
0153: 
0154: //PHP4用; DOM XML利用
0155:     if (isphp5over() == FALSE) {
0156:         if (($dom = read_xml($url)) == NULL)    return FALSE;
0157:         $resultset = $dom->get_elements_by_tagname("results");
0158:         $results = $resultset[0]->get_elements_by_tagname("result");
0159:         //検索結果取りだし
0160:         $cnt = 1;
0161:         foreach ($results as $element) {
0162:             foreach ($tbl as $name) {
0163:                 $node = $element->get_elements_by_tagname($name);
0164:                 if ($node != NULL) {
0165:                     $items[$cnt][$name] = $node[0]->get_content();
0166:                 }
0167:             }
0168:             $cnt++;
0169:         }
0170: 
0171: //PHP5用; SimpleXML利用
0172:     } else {
0173:         $results = simplexml_load_file($url);
0174:         //レスポンス・チェック
0175:         if (isset($results->result) == FALSE)    return FALSE;
0176:         //検索結果取りだし
0177:         $cnt = 1;
0178:         foreach ($results->result as $element) {
0179:             foreach ($tbl as $name) {
0180:                 if (isset($element->$name)) {
0181:                     $items[$cnt][$name] = $element->$name;
0182:                 }
0183:             }
0184:             $cnt++;
0185:         }
0186:     }
0187: 
0188:     return ($cnt - 1);
0189: }

プログラムの流れは、前回の「Yahoo! ウェブ検索Web サービス」プログラムとほぼ同じ。
Wikipedia API」の OUT に合わせ、ユーザー関数 getResult の要素名テーブル $tbl の内容を変更してある。
また、検索に成功したかどうかのステータスがないので、その部分のエラーチェックは省略した。

サンプル・プログラムの解説:表示処理

0191: /**
0192:  * HTML BODYを作成する
0193:  * @param string $query 検索キーワード
0194:  * @param array  $items 検索結果
0195:  * @return string HTML BODY
0196: */
0197: function makeCommonBody($query$items) {
0198:     global $Flag_release;
0199:     $myself = MYSELF;
0200:     $refere = REFERENCE;
0201: 
0202:     $p_title = TITLE;
0203:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
0204: 
0205:     if (! $Flag_release) {
0206:         $phpver = phpversion();
0207:         if (! isphp5over()) {
0208:             $enable = 'DOM XML : ';
0209:             $enable .= function_exists('domxml_open_mem') ? 'enabled' : 'disable';
0210:         } else {
0211:             $enable = 'SimpleXML : ';
0212:             $enable .= function_exists('simplexml_load_file') ? 'enabled' : 'disable';
0213:         }
0214:         $url = getURL_wikipediaAPI($query);
0215: $msg =<<< EOT
0216: PHPver : {$phpver}<br />
0217: {$enable}<br />
0218: WebAPI : <a href="{$url}">{$url}</a><br />
0219: <dl>
0220: 
0221: EOT;
0222:     } else {
0223:         $msg = '';
0224:     }
0225: 
0226:     $i = 1;
0227:     $res = '';
0228:     foreach ($items as $item) {
0229: $res .=<<< EOT
0230: <dt>{$i} : <a href="{$item['url']}">{$item['title']}</a>
0231: &nbsp;({$item['datetime']} 更新)</dt>
0232: <dd>{$item['body']}</dd>
0233: 
0234: EOT;
0235:         $i++;
0236:     }
0237: 
0238: $body =<<< EOT
0239: <body>
0240: <h2>{$p_title} {$version}</h2>
0241: <form name="myform" method="post" action="{$myself}" enctype="multipart/form-data">
0242: キーワード:<input tyle="text" name="query" id="query" size="60" value="{$query}" />
0243: <input type="submit" name="execute" value="検索" />
0244: </form>
0245: 
0246: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:600px; font-size:small;">
0247: <h3>使い方</h3>
0248: <ol>
0249: <li>[<span style="font-weight:bold;">キーワード</span>]に検索キーワードを入力し、[<span style="font-weight:bold;">検索</span>] ボタンを押してください。</li>
0250: <li>検索結果が表示されます。</li>
0251: </ol>
0252: ※参考サイト:<a href="{$refere}">{$refere}</a>
0253: <p>{$msg}</p>
0254: </div>
0255: <hr />
0256: {$res}
0257: </body>
0258: 
0259: EOT;
0260:     return $body;
0261: }

表示処理も前回とほとんど同じだ。

参考サイト

(この項おわり)
header