PerlでWeb API入門

23
PerlWeb API入門 Web APIPerl入門 yusukebe 2010/07/23 Yokohama.pm#6 x PerlCasual#3

Transcript of PerlでWeb API入門

PerlでWeb API入門Web APIでPerl入門

yusukebe 2010/07/23

Yokohama.pm#6 x PerlCasual#3

概要 •  Perl初心者向け •  Web APIを学ぶ&&Perlを学ぶ •  アンケート/スキルレベルを計る – LWP::* を使ったことがある方

•  形式 – 20分: Web APIの基礎←今ココ – 30分: sugyanがライブコーディング

•  某雑誌の原稿ベース(後述)

Web APIとは? •  API = Application Programming Interface – 「やり取り/取り決め」によりインターフェースを定めている

•  Web APIは大きなサービスやプラットフォームを外部から利用するためのAPI

Web APIの例 •  Twitter API •  Google Ajax API •  YouTube API •  Flickr API •  mixiアプリ API •  モバゲー API •  etc…

前提知識/補習項目 •  Webのアーキテクチャに関する概念 – HTTP – URI – GET/POST – JSON/XML etc.

3つの基本的な流れ(GETメソッド)

1. リクエストURIの構築 2.  GETメソッドでのリクエスト 3. レスポンスの検証及びパース

イメージ •  Twitterで「perl」と検索、つぶやきを取得 –  http://search.twitter.com/search.json?q=perl

•  GETメソッドでアクセス •  JSON形式で情報を取得 •  パースする

Twitter Search API •  Twitterのつぶやきをキーワードで検索取得 •  http://dev.twitter.com/doc/get/search •  ドキュメントを読むことは重要!

APIを使う上でのチェックポイント •  リクエストURI – http://search.twitter.com/search.json

•  サポートするレスポンスフォーマット – JSON/atom

•  リクエストメソッド – GET

•  クエリパラメータ – q=perl

Webブラウザを使った検証

リクエストURIを構築する •  日本語などASCII文字以外は使えない •  URIエスケープ •  http://search.twitter.com/search.json?q=

%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86

URIモジュール use URI; use utf8; my $query  = 'おはよう'; my $uri    = URI‐>new('http://search.twitter.com/search.json'); my $params = {     q           => $query,     result_type => 'popular', }; $uri‐>query_form(%$params); print "$uri\n"; 

http://search.twitter.com/search.json? result_type=popular&q=%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86

Web APIにアクセスする •  LWP::UserAgentを使用 – Others: LWP::Simple, URI::Fetch

•  HTTP::Requestオブジェクトを作成 •  メソッド発行 – GET/POST/PUT/DELETE/HEAD

•  HTTP::Responseオブジェクトを返却

LWP::UserAgentモジュール

use URI; use LWP::UserAgent; 

my $uri = URI‐>new('http://search.twitter.com/search.json?q=perl'); my $ua  = LWP::UserAgent‐>new(); my $res = $ua‐>get( $uri ); die $res‐>status_line if $res‐>is_error; print $res‐>content . "\n"; 

結果をパースする •  cpanm JSON -> JSON::XS or JSON::PP •  JSONにおける日本語 –  \uXXXX というUnicodeベースのascii文字へのエスケープ

– おはよう –  \u304a\u306f\u3088\u3046

JSONモジュール use JSON qw( decode_json ); use Encode qw( encode_utf8 ); 

my $json_text =  

'{"user":"yusukebe","message":"\u304a\u306f\u3088\u3046"}'; my $ref = decode_json($json_text); print encode_utf8("$ref‐>{user} : $ref‐>{message}\n"); 

yusukebe : おはよう 

おさらい •  URIモジュールでリクエストURIの構築 •  LWP::UserAgentモジュールでURIへのリクエスト/レスポンスの取得

•  JSONモジュールでレスポンスコンテンツのパース

サンプルアプリケーション •  「#yokohamapm」という言葉が含まれたつぶやきを表示するコマンドラインスクリプト

use LWP::UserAgent; 

use URI; 

use JSON qw(decode_json); 

use Encode qw(encode_utf8); 

my $query  = '#yokohamapm'; 

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"); 

結果

$ perl twitter_search.pl 

@mazkeng: 今回もustで拝聴します、明日が楽しみ! #yokohamapm 

@hokke_mirin: 明日は、タグ2つですねー。楽しみー#perlcasual #yokohamapm 

@yusukebe: このハッシュタグはどうだ! #yokohamapm 

WebService::Simple use WebService::Simple; 

use Data::Dumper; 

my $query  = '#yokohamapm'; 

my $service = WebService::Simple‐>new( 

    base_url  => 'http://search.twitter.com/search.json', 

    response_parser => 'JSON', 

); 

my $res  = $service‐>get( { q => $query }); 

my $ref = $res‐>parse_response(); 

print Dumper $ref; 

まとめとして •  Web API = 「巨人の肩に立つ」ことができるかもしれない

•  「Standing on the shoulders of giants」- もし私が他の人たちよりも遠くを見ていたとしたら、それは、巨人たちの肩に私が立っていたからだ。- アイザックニュートン

提供? WEB+DB PRESS vol.58

2010年8月末発売予定 Perl Hackers Hub