Flickrから自分のアップロードした写真を全部ダウンロードする

ふと思い立ってやってみようとしたけれど、これが結構大変。一括してダウンロードする方法がFlickrの機能としては見当たらない。
誰か他の人の写真じゃなくて自分のアップロードした写真ぐらい、機能があってもよさそうだけれど。
検索してみると、いくつかソフトウエアがあって、2つ試してみたけれど、認証に失敗して先に進めないのがひとつと、そもそもインストールできないのがひとつ(.Net Frameworkを使うやつ)。
意地になってしまって、flickr.pyを使ったPythonスクリプトを書いてみた。
Pythonとflickr.pyがあれば使えます。ユーザID(ユーザ名じゃない)、API KeyとかSecretとか難しいのが必要。やっぱり、Flickr自身で実装しないと普通の人には難しいんじゃないか。

下のスクリプトをローカルに保存して、設定を3ヶ所書き換えて(ユーザID、API Key、API Secret)、flickr.pyを同じディレクトリにおいて、実行するとサブディレクトリを作成してその中にズンズンダウンロードします。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""flickr.pyの利用サンプル。 http://code.google.com/p/flickrpy/
Flickrから指定したユーザの全ての写真を取得してローカルディスクに保存する。
自分の写真をダウンロードするために作ったので、他人の写真でも使えるかどうかは未確認。
"""
import os
import time
import flickr
import urllib


#######################################################
# ここから設定変更
#######################################################

#ユーザID
#これ変更必須。自分のアカウントページでURLをひょいと見ると書いてあった。@を含んだ12文字。
user_id = "XXXXXXXX@YYY"

#Flickr API Key + Secret
#これ必須。自分のアカウントのページで確認。
flickr.API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
flickr.API_SECRET = "XXXXXXXXXXXXXXXX"

#これはオプション。
#取得する画像のサイズ。Large=オリジナル。 http://www.flickr.com/services/api/flickr.photos.getSizes.html
#Originalでもいけそうだけど、何故かダメだった。
size = 'Large'

#######################################################
# ここまで設定変更
#######################################################


#ダウンロード写真を保持するディレクトリの作成
MY_DIR = os.path.dirname(os.path.abspath(__file__))
IMAGE_DIR = os.path.join(MY_DIR, 'image_%s' % size)
if os.path.exists(IMAGE_DIR):
    os.rename(IMAGE_DIR, "%s.bak-%s" % (IMAGE_DIR, time.strftime('%Y%m%d%H%M%S')))
os.makedirs(IMAGE_DIR)


if __name__=='__main__':
    user = flickr.User(user_id)
    photo_count = int(user.photos_count)
    print("%s has %d photos." % (user.username, photo_count))

    retr_count = 0
    page = 1

    while retr_count < photo_count:
        photos = flickr.people_getPublicPhotos(user_id, per_page = 500, page = page)
        for photo in photos:
            url = photo.getURL(size = size, urlType = 'source')
            filename = os.path.join(IMAGE_DIR, '%s.jpg' % (photo.title))
            file(filename, "wb+").write(urllib.urlopen(url).read())
            retr_count += 1
            print("%d/%d: %s retrieved." % (retr_count, photo_count, os.path.basename(filename)))
        page += 1

スクリプトはGistにも置いてあります。 Gist:237451