Figmaのファイルを一括でバックアップする

* 前提
    * 保険の意味で、Figmaのチーム内のデータをローカルにバックアップしたいと思いました
        * ファイル数が300以上あるため、バックアップするたびに、1ファイルずつ取得するのは手間がかかる
    * 私は、非プログラマーです
        * 下記のコードは、生成AIにて取得したものです
    * 環境情報は現在の私の現在のものです
        * 同様の環境であれば実行できると思います
* 環境（参考）
    * 端末
        * macOS
            * 13.6.8
    * ライブラリ
        * Python
            * 3.12.6
        * requests
            * 2.32.3

* 準備
    * Figma APIのアクセストークンを発行
        * 公式ガイド
            * https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens
        * 参考
            * https://qiita.com/_lemoo_/items/89cc34003847bdcf53e5
    * FigmaのチームIDを用意
        * 参考
            * https://watermint.org/2023/09/24/figma-export-cli/
* レシピ
    * Finder
        * 任意の場所にフォルダを作成
    * テキストエディタ
        * 下記のコードを、テキストエディターにペースト
        * ACCESS_TOKENとTEAM_ID部分を書き換える
        * 「figma_backup.py」などのファイル名で上記のフォルダに保存
    * ターミナル
        * ターミナルを開き上記のフォルダに移動（cd）
        * `python3 figma_backup.py`とタイプして実行
    * Finder
        * （ローカルに「.fig」ファイルがダウンロードされる。）


```python:figma_backup.py
import requests
import os

# Figma APIの認証トークンを設定します。
ACCESS_TOKEN = 'your_access_token_here'

# チームのIDを設定します。
TEAM_ID = 'your_team_id_here'

# ダウンロードするファイルを保存するディレクトリを設定します。
DOWNLOAD_DIR = 'downloads/'

# チームのプロジェクトのリストを取得する関数
def get_team_projects(team_id):
    headers = {
        'X-Figma-Token': ACCESS_TOKEN
    }
    url = f'https://api.figma.com/v1/teams/{team_id}/projects'
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.json().get('projects')
    else:
        print('Error:', response.status_code, response.text)
        return []

# プロジェクトに含まれるファイルのリストを取得する関数
def get_project_files(project_id):
    headers = {
        'X-Figma-Token': ACCESS_TOKEN
    }
    url = f'https://api.figma.com/v1/projects/{project_id}/files'
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.json().get('files')
    else:
        print('Error:', response.status_code, response.text)
        return []

# ファイルを.fig形式でダウンロードする関数
def download_file(file_key, file_name, project_name):
    headers = {
        'X-Figma-Token': ACCESS_TOKEN
    }
    url = f'https://api.figma.com/v1/files/{file_key}?format=fig'
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        project_dir = os.path.join(DOWNLOAD_DIR, project_name.replace('/', '_'))
        # プロジェクトディレクトリが存在しない場合は作成します。
        if not os.path.exists(project_dir):
            os.makedirs(project_dir)
        file_name = file_name.replace('/', '_') # スラッシュをアンダースコアに置き換える
        file_path = os.path.join(project_dir, file_name + '.fig')
        with open(file_path, 'wb') as file:
            file.write(response.content)
        print(f'File downloaded: {file_path}')
    else:
        print('Error:', response.status_code, response.text)

# メイン関数
def main():
    projects = get_team_projects(TEAM_ID)
    for project in projects:
        project_id = project['id']
        project_name = project['name']
        files = get_project_files(project_id)
        for file in files:
            file_key = file['key']
            file_name = file['name']
            download_file(file_key, file_name, project_name)

if __name__ == '__main__':
    main()
```