Perl Hackers Hub

第4回Twitterから学ぶ、Web APIのキホン(3)

サンプルアプリケーションを動かしてみよう

さて、ここまでで次の3つの肝を押さえました。

  • URIモジュールでリクエストURIの構築
  • LWP::UserAgent モジュールでURI へのリクエスト/レスポンスの取得
  • JSONモジュールでレスポンスコンテンツのパース

これらの流れを追えばTwitter Search APIを使ったアプリケーションの構築が可能です。Twitter Search APIを利用したシンプルなアプリケーションとして、⁠おはよう」という言葉が含まれた最近のツイートを取得し表示するだけのコマンドラインスクリプトを作ってみましょう。

use LWP::UserAgent;
use URI;
use JSON qw(decode_json);
use Encode qw(encode_utf8);
use utf8;

my $query = 'おはよう';
my $uri =
URI->new('http://search.twitter.com/search.json');
my $params = {
q => $query,
result_type => 'recent',
};

$uri->query_form(%$params);
my $ua = LWP::UserAgent->new;
my $res = $ua->get($uri);
die "Error: ". $res->status_line if $res->is_error;

my $json = $res->content;
my $ref = decode_json($json);
for my $tweet ( @{ $ref->{results} } ) {
print
encode_utf8("\@$tweet->{from_user}: $tweet->{text}\n");
}

今までの組み合わせだけでできましたね。

クエリやパースのしかたを工夫したり、Webアプリケーションに組み込んだりすれば、さまざまな応用の可能性があります。Web APIを用いたあなただけのアプリケーションができあがるのです。

さらに楽をしたい人は……

さて、今回は「どんな」Web APIにもある程度対応できる基本を解説してきたわけですが、いくつかのWeb APIに対しては抽象化された個別のWeb API 専用のCPANモジュールがあり、もっとラクチンにアクセスできたりもします。たとえば、Twitter API を扱うNet::Twitterや、Amazon Product Adver tising APIに対応するNet::Amazonなどがあります。必要なモジュールを探すには「WebService::*」⁠WWW::*」⁠Net::」といった名前空間を漁るといいでしょう(アダルトなサービスにこっそりアクセスするためのモジュールもあったりして……。むふふ⁠⁠。

ただ、Web APIは日々仕様に更新があったり、パーサに何を使うかといった個人の趣味趣向もあったりするので、中にはあまり使えないなと思うモジュールもあります。ですので、そのAPIに特化したモジュールを使うか、今回説明してきたような方法で行うかはみなさんにお任せしたいと思います。

WebService::Simpleモジュール

手前味噌になってしまいますが、できるだけ多くのWeb APIに対応し、かつ個人の趣向に合わせつつより楽をできるモジュールを、本連載第2回を執筆した牧大輔さんと筆者で作っているので、少しだけ紹介します。WebService::Simpleというモジュールです。

何度も言いますが、Web APIを使うには、

  • (1)リクエストURIを構築する
  • (2)Web APIにリクエストする
  • (3)結果をパースする

という作業がつきまといます。筆者はこの作業を毎度行うのに疲れてしまったので、この部分だけを抽象化したモジュールを作りました。そして牧さんに大幅に直してもらったのがWebService::Simpleです。

たとえばTwitter Search APIを利用するサンプルコードは次のようになります。

use WebService::Simple;
use Data::Dumper;
use utf8;
my $query = 'おはよう';
my $service = WebService::Simple->new(
base_url => 'http://search.twitter.com/search.json', …(1)
response_parser => 'JSON',  …(2)
);
my $res = $service->get( { q => $query });  …(3)
my $json = $res->parse_response();
print Dumper $json;

ここでは最低限必要な次の情報だけを渡しつつ、今まで解説したもろもろの処理を内部的に行っています。

  • (1)ベースとなるリクエストURI
  • (2)パーサオブジェクト
  • (3)クエリパラメータ

使い方は、まずオプションを渡してWebService::Simpleオブジェクトをインスタンス化し、getメソッドでレスポンスを取得します。次にそのレスポンスのparse_responseメソッドを実行すれば、指定したJSONオブジェクトでのパースが済んだデータを得ることができます。

WebService::Simpleでは、(1)のベースとなるリクエストURIを使いたいWeb APIに合わせて変更するだけで、それぞれに対応します。また、(2)のレスポンスパーサではJSONモジュール以外にもXML::Simpleなどを使用することができます。このことで多くのWeb APIをサポートし、使う人の趣向に合わせることを可能にしています。

筆者がWeb APIを触るときにはWebService::Simpleをよく使いますし、今後もメンテナンスを続けるのでよろしければお試しください。

まとめ

以上、基礎的なWeb APIのPerlでの扱い方を取り上げてきました。Hackers Hubっぽくない話題かもしれませんし、筆者がハッカーかどうかは判断しかねますが、Web APIを使ってアプリケーションを作りたいという方にお役に立てれば幸いです。Web APIという巨人の肩に乗り、遠くを見てみましょう!

さて、次回のPerl Hackerはgfxこと藤吾郎さんで、テーマは次世代テンプレートエンジンXslateです。筆者もXslateに興味があるので今から楽しみです!

おすすめ記事

記事・ニュース一覧