初めてのFlickr API
「表示 」な画像が欲しい
仕事で画像が沢山必要になりました.それも表示というCC区分な物.Flickr APIを使えばきっと取れるに違いないと思って試してみたのが今回のスクリプトです.参考にしたのはゆーすけべー日記で,違っているのは,XML::Parser::Lite::XPathを使っているところ,licenseでフィルターしているところ,ページをたぐってurlを全部取得しているところ,ぐらいです.
スクリプト
使っているFlickr APIはflickr.photos.searchです.
$res = $$arg{api}->execute_method( 'flickr.photos.search', { text => $$arg{text}, license => 4, page => $$arg{page} } );
licenseのパラメータについての説明はflickr.photos.licenses.getInfoに載っていました.4が「表示」ライセンスになります.
for my $node (@nodes) { my $attrs = $$node{attributes}; printf "http://farm%s.static.flickr.com/%s/%s_%s.jpg\n", $$attrs{farm}, $$attrs{server}, $$attrs{id}, $$attrs{secret}; }
受け取ったパラメータから画像を組み立てるルールはPhoto Source URLsに説明があります.基本的なパターンで作ってみました.
やってみてわかったこと
スクリプト全体
#!/usr/local/bin/perl use Flickr::API; use XML::Parser::Lite::Tree::XPath; use strict; use warnings; sub getXpath { my $arg = shift; my ( $res, $xpath ); $$arg{page} ||= 1; $res = $$arg{api}->execute_method( 'flickr.photos.search', { text => $$arg{text}, license => 4, page => $$arg{page} } ); $xpath = new XML::Parser::Lite::Tree::XPath( $res->{tree} ); return $xpath; } sub getInfo { my $arg = shift; my ( $xpath, @info, %ret ); $xpath = getXpath( { api => $$arg{api}, text => $$arg{text} } ); @info = $xpath->select_nodes('/photos'); %ret = ( total => $info[0]->{attributes}->{total}, pages => $info[0]->{attributes}->{pages} ); return %ret; } sub getUrl { my $arg = shift; for my $page ( $$arg{start} .. $$arg{end} ) { my ( $xpath, @nodes ); $xpath = getXpath( { api => $$arg{api}, text => $$arg{text}, page => $page } ); @nodes = $xpath->select_nodes('/photos/photo'); for my $node (@nodes) { my $attrs = $$node{attributes}; printf "http://farm%s.static.flickr.com/%s/%s_%s.jpg\n", $$attrs{farm}, $$attrs{server}, $$attrs{id}, $$attrs{secret}; } } } my $text = shift || die "Usage: $0 TEXT\n"; my $api = new Flickr::API( { key => 'FLICKR APIで使うKEY', } ); my %info = getInfo( { api => $api, text => $text } ); printf "Found %d photos\n", $info{total}; getUrl( { api => $api, text => $text, start => 1, end => $info{pages} } );