-
前提
- 保険の意味で、Figmaのチーム内のデータをローカルにバックアップしたいと思いました
- ファイル数が300以上あるため、バックアップするたびに、1ファイルずつ取得するのは手間がかかる
- 私は、非プログラマーです
- 下記のコードは、生成AIにて取得したものです
- 環境情報は現在の私の現在のものです
- 同様の環境であれば実行できると思います
- 保険の意味で、Figmaのチーム内のデータをローカルにバックアップしたいと思いました
-
環境(参考)
- 端末
- macOS
- 13.6.8
- macOS
- ライブラリ
- Python
- 3.12.6
- requests
- 2.32.3
- Python
- 端末
-
準備
- Figma APIのアクセストークンを発行
- FigmaのチームIDを用意
-
レシピ
- Finder
- 任意の場所にフォルダを作成
- テキストエディタ
- 下記のコードを、テキストエディターにペースト
- ACCESS_TOKENとTEAM_ID部分を書き換える
- 「figma_backup.py」などのファイル名で上記のフォルダに保存
- ターミナル
- ターミナルを開き上記のフォルダに移動(cd)
-
python3 figma_backup.py
とタイプして実行
- Finder
- (ローカルに「.fig」ファイルがダウンロードされる。)
- Finder
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()