使わなくなったFlickrの有料プランを解約すべく、大量にアップしている写真を一括ダウンロードしたい。
その悩みをClaudeに相談したところ「Flickr APIとPythonでダウンロードすればいい」ということで、これがとてもうまくいったので、残しておく。
Flickr写真ダウンロード手順
STEP 1:必要なライブラリをインストール
ターミナルで以下を実行:
pip3 install flickrapi requests
STEP 2:Flickrのメニューを取得
- The App Garden on Flickr にアクセス
- 「Request an API Key」をクリック
- 「Apply for a non-commercial key」を選択
- アプリ名と説明を入力
- アプリケーションタイプを「デスクトップアプリケーション」に設定(← ここ重要!)
- 利用規約に同意して Submit
- 表示された APIキーとAPIシークレットをメモしておく
STEP 3:スクリプトを作成
- テキストエディタで新規ファイルを作成
- ファイル名をflickr_albums_download.pyとして保存
- 以下のコードを貼り付け、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:スクリプトを実行
- ターミナルでスクリプトのあるフォルダに移動
- 以下を実行:
python3 flickr_albums_download.py
- ブラウザが開いてFlickrの認証画面が出たら許可する
- ターミナルに進捗が表示されながらダウンロードが始まる
ずっとモヤモヤしてた悩みが解決
有料契約をして長年、写真のアップ先として活用していたFlickr。
しかし時とともに使い勝手がよろしくなくなり、使うことがなくなったものの、有料プラン分の大量の写真をまとめてダウンロードするというのが中々できていなかった。
実は以前にとあるアプリを使ってダウンロードするという方法を自分で紹介して書いたのだが、データが多かったので、これは結局かなり手間がかかってしまい、全部ダウンロードするまでに至らなかった。
今回のClaudeに相談してFlickr APIとPythonを使う方法だと、一度DLを始めたら放置しておけるし、途中で中断しても中断したところからDL始めてくれるしでものすごくラクだった。
はぁこれでやっとFlickr解約できた。
