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がごっそりおとされているので、オリジナルがある画像だけを選んでいますが、その分ダウンロードに時間がかかります。