flickr APIの試用

今さらですが、flickr APIを使ってみました。研究の都合上、あるテーマにそった画像をかき集めてくる必要があったのですが、まさにぴったりなサービス。以前からデジカメで撮った写真を共有するのにflickrを使ってましたが、他人の写真をダウンロードする事になるなんて思っても見ませんでした。flickrにアップロードした写真には、マニュアルでタグを付加することができて、このタグを使って写真を検索し、片っ端からダウンロードすると指定したタグが付加されている写真が集められるわけです。
マニュアルによると、REST, XML-RPC, SOAPがサポートされているのですが、適当なライブラリを使って半自力でメッセージを構築するなんてことはすっ飛ばして、flickr APIを呼び出してくれるライブラリが山ほどあるので、これを利用させてもらうことにしました。最近はもっぱらpythonを使用しているので、python用のライブラリを探すと、とりあえず、以下の3つ。

  1. Beej's Python Flickr API
  2. FlickrClient
  3. flickr.py

FlickrClientのウェブページによると、もうメンテしてないのでBeej's Python Flickr APIを使ってくれと書かれているのですが、Beej's Python Flickr APIよりJames Clarkeのflickr.pyの方がシンプルで使いやすそうに見えるので、flickr.pyを使って、指定したキーワードをタグに持つ写真を指定枚数ダウンロードし、各々の画像に付加されているタグを全て標準出力に出力するスクリプトを書いてみました。

#!/usr/bin/env python

import sys
import os
import flickr
import urllib
from optparse import OptionParser

flickr.API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

def getPhotoWithTag(tag, maxnum):
        if not os.path.isdir(tag):
                os.mkdir(tag)
        os.chdir(tag)
        photos = flickr.photos_search(tags=tag, per_page=maxnum)
        for i in range(len(photos)):
                urllib.urlretrieve(photos[i].getURL(urlType='source'), str(i) + ".jpg")
                print ",".join(map(lambda x: x.text.encode('utf-8'), photos[i].tags))
        os.chdir('..')
        return


parser = OptionParser()
parser.add_option("-n", type="int", dest="maxnum", default=10,
                                        help="number of images to retrieve")
(options, args) = parser.parse_args()

for tag in args:
        getPhotoWithTag(tag, options.maxnum)

ラクチン!ただし、これをやるにはというか、Flickr APIを使用するには、Flickr APIのKEYをあらかじめ取得しておく必要があります。

もちろんタグで検索する以外にも、日付の指定などもできます。プロ顔負けの写真もけっこうあるので、ホゲホゲして得られたキーワードをもとにFlickrから写真をダウンロードして、それを適当にポリゴンに張りつけてグリグリまわすと安直なアートになるかもしれない。Flickr APIを使用したアプリ例が既に多数あるので、すでにそんなものもありそうな気もしますが...