初めてのFlickr API

「表示 」な画像が欲しい

仕事で画像が沢山必要になりました.それも表示というCC区分な物.Flickr APIを使えばきっと取れるに違いないと思って試してみたのが今回のスクリプトです.参考にしたのはゆーすけべー日記で,違っているのは,XML::Parser::Lite::XPathを使っているところ,licenseでフィルターしているところ,ページをたぐってurlを全部取得しているところ,ぐらいです.

スクリプト

使っているFlickr APIflickr.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に説明があります.基本的なパターンで作ってみました.

やってみてわかったこと

  • 文字列で指定してみると予想外な映像がひっかかります.catで検索したらラグビーチームの映像がでてきました.catchなのかな?
  • 著作権者のクレジットを入れないといけないんだけど,まだそれがどこにあるのかわかりません.
  • XML::Parser::Lite::Tree::XPath 0.02がperl5.10 でテストに失敗しました.ってことで一からやり直しですよ.><

スクリプト全体

#!/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} } );