akuyan to

イベント/旅行/デザイン/おいしいもの...

【決定版】Flickrにアップされていた写真をラクに全部ダウンロードするまで

使わなくなったFlickrの有料プランを解約すべく、大量にアップしている写真を一括ダウンロードしたい。
その悩みをClaudeに相談したところ「Flickr APIとPythonでダウンロードすればいい」ということで、これがとてもうまくいったので、残しておく。

Flickr写真ダウンロード手順

STEP 1:必要なライブラリをインストール

ターミナルで以下を実行:

pip3 install flickrapi requests

STEP 2:Flickrのメニューを取得

  1. The App Garden on Flickr にアクセス
  2. 「Request an API Key」をクリック
  3. 「Apply for a non-commercial key」を選択
  4. アプリ名と説明を入力
  5. アプリケーションタイプを「デスクトップアプリケーション」に設定(← ここ重要!)
  6. 利用規約に同意して Submit
  7. 表示された APIキーAPIシークレットをメモしておく

STEP 3:スクリプトを作成

  1. テキストエディタで新規ファイルを作成
  2. ファイル名をflickr_albums_download.pyとして保存
  3. 以下のコードを貼り付け、API_KEY / API_SECRET を自分のものに書き換える
import os
import requests
import flickapi

# 設定(ここを編集)
API_KEY = '【FlickrのAPIキー】'
API_SECRET = '【FlickrのAPIシークレット】'
DOWNLOAD_FOLDER = 'flickr_photos'  # ダウンロード先フォルダ名

def main():
    print("Flickr写真をアルバム別にダウンロードします")

    if not os.path.exists(DOWNLOAD_FOLDER):
        os.makedirs(DOWNLOAD_FOLDER)

    # 認証(デスクトップアプリとして)
    flickr = flickrapi.FlickrAPI(API_KEY, API_SECRET, format='parsed-json')
    flickr.authenticate_via_browser(perms='read')

    # ユーザーIDを取得
    user = flickr.test.login()
    user_id = user['user']['id']
    print(f"ユーザーID: {user_id}")

    # アルバム一覧を取得
    photosets = flickr.photosets.getList(user_id=user_id)
    albums = photosets['photosets']['photoset']
    print(f"アルバム数: {len(albums)}")

    for album in albums:
        album_title = album['title']['_content']
        album_id = album['id']
        album_folder = os.path.join(DOWNLOAD_FOLDER, album_title)

        if not os.path.exists(album_folder):
            os.makedirs(album_folder)
        print(f"\nアルバム: {album_title}")

        page = 1
        while True:
            try:
                photos_data = flickr.photosets.getPhotos(
                    photoset_id=album_id,
                    user_id=user_id,
                    extras='url_o',
                    page=page,
                    per_page=100
                )
                photos = photos_data['photoset']['photo']
                if not photos:
                    break

                for i, photo in enumerate(photos, 1):
                    photo_id = photo['id']
                    title = photo.get('title', photo_id)
                    photo_url = photo.get('url_o')

                    if not photo_url:
                        sizes = flickr.photos.getSizes(photo_id=photo_id)
                        photo_url = sizes['sizes']['size'][-1]['source']

                    file_name = f"{photo_id}_{title}.jpg"
                    file_path = os.path.join(album_folder, file_name)

                    if os.path.exists(file_path):
                        print(f"  [{i}] スキップ(既存): {file_name}")
                        continue

                    try:
                        response = requests.get(photo_url)
                        with open(file_path, 'wb') as f:
                            f.write(response.content)
                        print(f"  [{i}] ダウンロード完了: {file_name}")
                    except Exception as e:
                        print(f"  [{i}] エラー: {e}")

                page += 1
            except Exception as e:
                print(f"ページ {page} エラー: {e}")
                break

    print("\n全ての処理が完了しました!")

if __name__ == '__main__':
    main()

STEP 4:スクリプトを実行

  1. ターミナルでスクリプトのあるフォルダに移動
  2. 以下を実行:
python3 flickr_albums_download.py
  1. ブラウザが開いてFlickrの認証画面が出たら許可する
  2. ターミナルに進捗が表示されながらダウンロードが始まる

ずっとモヤモヤしてた悩みが解決

有料契約をして長年、写真のアップ先として活用していたFlickr。
しかし時とともに使い勝手がよろしくなくなり、使うことがなくなったものの、有料プラン分の大量の写真をまとめてダウンロードするというのが中々できていなかった。

実は以前にとあるアプリを使ってダウンロードするという方法を自分で紹介して書いたのだが、データが多かったので、これは結局かなり手間がかかってしまい、全部ダウンロードするまでに至らなかった。


今回のClaudeに相談してFlickr APIとPythonを使う方法だと、一度DLを始めたら放置しておけるし、途中で中断しても中断したところからDL始めてくれるしでものすごくラクだった。

はぁこれでやっとFlickr解約できた。