flickr API 再び

わけあって、指定したタグがマッチする画像をflickrからダウンロードしてくれるプログラムが必要になったわけですが、以前書いたスクリプトがうまく動きません。以前のエントリーで、

FlickrClientのウェブページによると、もうメンテしてないのでBeej's Python Flickr APIを使ってくれと書かれているのですが、Beej's Python Flickr APIよりJames Clarkeのflickr.pyの方がシンプルで使いやすそうに見えるので、flickr.pyを使って、...

と書きましたが、見事はまってしまいました。というわけで、素直にBeej's Python Flickr APIへ乗り換え...
あまり変わってませんが、レスポンスがElementTreeというオブジェクトで返るのがよさそうです。何やら汎用的な感じ...

#!/usr/bin/env python

import flickrapi
import sys
import xml.etree.ElementTree
import urllib
from optparse import OptionParser

api_key  = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
url_template = "http://farm%s.static.flickr.com/%s/%s_%s_o.jpg"
fname_template = "%s_%s.jpg"

def search_photos(tag, num):
	flickr = flickrapi.FlickrAPI(api_key, format='etree')
	result = flickr.photos_search(tags=tag, per_page=num, extras='original_format')
	xml.etree.ElementTree.dump(result)
	photos = result.find("photos").findall("photo")
	return photos

def get_photo(photo):
	if photo.get("originalsecret"):
		url = url_template % ( \
			photo.attrib["farm"], \
				photo.attrib["server"], \
				photo.attrib["id"], \
				photo.attrib["originalsecret"])
		fname = fname_template % (photo.attrib["id"], photo.attrib["originalsecret"])
		urllib.urlretrieve(url, fname)
		return True
	else:
		return False
	
def main():
	# parse options
	usage = "usage: %prog [options]"
	parser = OptionParser(usage=usage)
	parser.add_option("-n", type="int", dest="num_photos", default="10", 
			  help="Number of photos")
	(options, args) = parser.parse_args()
	photos = search_photos(args, options.num_photos)
	for photo in photos:
		get_photo(photo)

if __name__ == "__main__":
	main()

オリジナルの画像を取得しないと、EXIFがごっそりおとされているので、オリジナルがある画像だけを選んでいますが、その分ダウンロードに時間がかかります。