タグ「api」が付けられているもの

Google AJAX Search API ってその名の通り JavaScript から利用することを前提に作られているんだけど、 先ほどドキュメンテーションに「Flash and other Non-Javascript Environments」という項目が追加されました。 JavaScript 以外の環境から Google AJAX Search API をこんな風に使えますよと書かれているようです。 今まで、例えば Perl から Web ページを検索する時には、Google のそれは「JS からしか使えないんでしょ」とあきらめて、Yahoo! の検索 API をよく使っていたところ、これで Google の検索結果も利用できるようになります。 JavaScript のレイヤーより一つ下くらいのところで、API が使えるとなると可能性も広がるかと思います。 ということで、早速、WebService::Simple を使って、Perl から Google AJAX Search API を使ってみたよ。

サンプルを紹介する前にこの API の仕様について軽く解説。 ベースURL は

http://ajax.googleapis.com/ajax/services/search/web

で、それに以下のようなパラメータを渡すと結果が JSON 形式で返ってくる。

q : 検索クエリー
v : API のヴァージョン、現時点でのデフォルトは 1.0
rsz : 検索結果をどのサイズで返して欲しいか、デフォルトは small の4件、large を指定すると8件
hl : 何語のウェブから検索したいか、日本語の場合だと ja
start : 検索結果を何番目から取得したいか、デフォルトは 0、おそらく最大で 24 っぽい

詳しくはここを参照→Class Reference - Google AJAX Search API - Google Code

取得できる JSON の形式はこちらを参考に→Developer's Guide - Google AJAX Search API - Google Code

では、WebService::Simple を使ったサンプルを紹介。 WebService::Simple には JSON のパーサーもあるので検索結果を Dump するだけのスクリプトだったらこんな簡単に書けちゃいます。

my $google = WebService::Simple->new(
    base_url        => "http://ajax.googleapis.com/ajax/services/search/web",
    response_parser => "JSON",
    params          => { v => "1.0", rsz=> "large" }
);

my $response =  $google->get( { q => "cat" , start=> 0 } );
print Dump $response->parse_response;

次に、検索クエリーを入れるとその結果が表示されるだけの簡単な Web ページを作ってみます。 パースしたコンテンツをそのまま Template::Toolkit のテンプレートに渡すという方針です。 ただ、これを実現するにはちょっとしたハックが必要になりました。 JSON のモジュールを使ってパースされたオブジェクトには utf8 フラグが立ってないっぽいんですよ。 utf8 flagged な値も、TT に渡したいので、混在しちゃうと文字化けしちゃいます(その値を uri フィルターかけたいから、フラグを落としたくないのです、なんか間違ってたらツッコミください)。 そこで、以下のハックで JSON モジュールが返してくれるオブジェクトに utf8 フラグを立ててます。

use WebService::Simple;
use WebService::Simple::Parser::JSON;

my $parser = WebService::Simple::Parser::JSON->new; # パーサーを作る
$parser->{json}->utf8(1); # utf8 フラグが立ったオブジェクトを返してもらう
my $google = WebService::Simple->new(
    base_url        => "http://ajax.googleapis.com/ajax/services/search/web",
    response_parser => $parser, # パーサーオブジェクトを指定する
    params          => { v => "1.0", rsz => "large", hl => "ja" }
);

つまづいたのはこのくらい。完成版のPerl のコードと テンプレートは以下の通りです。

search.cgi

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use Template;
use WebService::Simple;
use WebService::Simple::Parser::JSON;

my $q     = CGI->new;
my $query = $q->param('query');
utf8::decode($query);
my $start = $q->param('start') || 0;

my $parser = WebService::Simple::Parser::JSON->new;
$parser->{json}->utf8(1);
my $google = WebService::Simple->new(
    base_url        => "http://ajax.googleapis.com/ajax/services/search/web",
    response_parser => $parser,
    params          => { v => "1.0", rsz => "large", hl => "ja" }
);
my $response = $google->get( { q => $query, start => $start } );

my $tt = Template->new();
my $html;

$tt->process(
    "search.tt",
    {
        query    => $query,
        response => $response->parse_response
    },
    \$html
);

print $q->header( -type => "text/html", -charset => "utf-8" );
print $html;

search.tt


<html>
<body>
<h1><a href="search.cgi">Google Search</a></h1>
<form action="" method="get">
<p>
<input type="text" name="query" value="[% query %]" />
<input type="submit" value="Google Search" />
</p>
</form>
<p>
[% SET count = response.responseData.cursor.estimatedResultCount -%]
[% IF count -%][% count %] pages[% END -%]
</p>
<dl>
[% FOREACH item = response.responseData.results -%]
  <dt><a href="[% item.unescapedUrl %]">[% item.title %]</a></dt>
  <dd>[% item.content %]</dd>
[% END -%]
</dl>
<div>
  [% FOREACH page = response.responseData.cursor.pages -%]
  <a href="?query=[% query | uri %]&amp;start=[% page.start %]">[% page.label %]</a>
  [% END -%]
</div>
</body>
</html>

ということで、Google AJAX Search API を WebService::Simple 使って利用してみました。 取得できる件数に制限があるのがちょっと残念ですが、この API なかなか重宝しそうです。

1

プロフィール

yusukebe

ゆーすけべー / yusukebe
Yusuke Wada
1981/12/23 生
天然パーマ Erogeek
HP Twitter mixi はてブ
yusuke (at) kamawada.com
more...

最近10件のアクション

最近のブログ記事

  • PerlでWeb API入門/Web APIでPerl入門 - PerlCasual#3より

    先日7月23日(金)に株式会社ネイバーさんのご協力で行われたYokohama.pm#6 x PerlCasual#3。 イベント自体のまとめはアンケートの様子をみて後ほどさせていただくとして、 僕が発表を担当したPerlCasualセッションのことを少々。 PerlCasualのセッションは僕の割と独断で「どういう内容/スタイルが誰に求められているのか」を毎回試行錯誤で 探っている状況です。 この度は自分の原点に戻る感じでテーマを「Web API」としました。 というのも僕の最初のCPANモジュールはまさしく「WebService::Simple」ですし、 このPerl/Webの世界に入ってきたのも様々なWeb APIがキッカケだったからです。 また、対象のスキルレベルをかなり低いものと設定してみました。 何か新しいことを試す時には「極端なこと」をしてみて様子を探るっていうのは実は有効な手段だからです (これは学生時代にPHSを作ったとも言われる「小檜山賢二」教授に教えてもらったことです)。 で、そういうたくらみがあって、 sugyanによる「全裸ボットの作り方」というライブコーディングを中心に構成を組みました。 前半20分僕の「PerlでWeb API入門/Web APIでPerl入門」という発表、 後半30分はsugyanのライブコーディングです。 ライブコーディングの方、 結構無茶ぶり気味だったにもかかわらずsugyanはキョドリつつも引き受けてくれて、 直前の週のskype打ち合わせでガーっと内容固めていく感じでした。...

  • 今日(7/23金)はYokohama.pm#6 x PerlCasual#3だよ!/アンケート/スタッフ若干募集

    今日、23日(金曜日)はいよいよPerlのイベント「Yokohama.pm#6 x PerlCasual#3」です! 最終確認のエントリーを書きます。 ATNDで参加希望を出した方は必ず以下を確認してください。 Yokohama.pm#6 x PerlCasual#3 : ATND 必ずATNDで自分が出席可能かどうかを確認してください どうしても行けないという方は必ずATNDでキャンセルをお願いします イベントは18時開場です! 今後の活動の参考にするためWebアンケートを用意しました。「イベント終了後に記入」ということなんで、 まだ記入しちゃだめだよ!って感じですが、URLは以下ですので、是非「イベント終了後に」ご回答ください! http://bit.ly/perlcasual03 また、イベント中に若干のお手伝いをしていただくスタッフを募集しています。 15分ほど一部セッションみれなくなっちゃうかもしれませんが>< 人員が足りないので、もしご協力してくれる方がいたら18時開場時点で僕かclouderさんに声をかけてください。 もしくは事前に @yusukebe へ向ってつぶやいてもらえると助かります! さて、PerlCasualのセッション「初心者向け勉強会 テーマ:...

  • 明日(7/23金)はYokohama.pm#6 x PerlCasual#3だよ!

    明日、23日(金曜日)は100人規模の(ビッグ)イベント「Yokohama.pm#6 x PerlCasual#3」です! 待ちに待ったというよりか「え!もう?明日なの?」って感じかもしれないので、 参加予定者の方は以下ご確認お願いします。 Yokohama.pm#6 x PerlCasual#3 : ATND 必ずATNDで自分が出席可能かどうかを確認してください どうしても行けないという方は必ずATNDでキャンセルをお願いします スタートの時間は18:25分ですが、開場は18時からなので来れる方はその時間を狙って来てください 懇親会の会場として五反田の居酒屋を予約しました、会場から徒歩10分ほどらしいです 参加していただいた方にはもれなくWeb上でのアンケートに答えてもらおうと思います。 URLは後ほどお伝えいたしますのでよろしくお願いします Ustream中継あります。URLは http://www.ustream.tv/channel/yokohama-pm、ハッシュタグは #yokohamapm の予定です 以下、ほぼfixのプログラムになります! 日時: 2010/7/23(金) 18:25...

  • 本日(21日) twittie(携帯Twitterアプリ)のイベントに出ます

    twittieというすごい使いやすい携帯用Twitterクライアントアプリの人達が企画するイベントが明日開催されます。 そこで、Twitterサービス開発者ということで招かれて参加することになりました。 Twibの発表してきます。 普通のお方の現地参加は無理ぽいのですが、Ustream配信をするようなんで、 よかったら見てください!他の某有名Twitterサービスの開発者の方もたくさん来るみたいです。 イベントは19時から開始です! Ustream URL:http://ustre.am/kVRk ハッシュタグ: #twittie0721 twittie...

  • コードとかをブログで晒す意味 - dankogaiと私

    Perlやり始めて4年くらい経つんでもう初心者ってほどではないという立場から言ってみます。 「コードとかプログラミングに関することをブログに晒すってすごくいい」と思います。 最近Twitterがあるもんで、情報の発信の力をそちらに取られている感があって若干悲しいので、 もっとブログ使った方がいいと考えるのです。 で、コードを晒したりすると何が嬉しいって、とにかく自分が成長できます。 そしてお友達が増えます。ただそれだけだけどすっごく重要。 俺はそれで成長できたし、あの!dankogaiさんとお友達?になって雑誌での対談まではたしちゃいました。 というエピソードを例に挙げるんで参考にしてくださいね。 # まぁ、dankogaiさんと言ってもただのエロ親父なんですけどね^^; 本人には内緒だよ! 2007/8/3 ニコニコ動画をダウンロードするPerlスクリプトのコードをブログに書く Perl、割とかじり始めの俺がニコニコ動画のflvをダウンロードしちゃうイケナイスクリプトをブログに晒す。 正直今見るとひどいコードだ。 Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech) 2007/8/4 dankogaiさんに添削される、コード量半分くらいになる ニコ厨のdankogaiさんが即座に反応。 「勝手に添削」シリーズとして添削され、コード量が半分くらいになったし、少なくなっただけじゃなく スマート!ぶっちゃけると一瞬、怒られた感じがして腹が立ったが、ちょっとするとすげー!こんな風に書けるんだ!すげー!ってなり感動する。 404 Blog...

閉じる