この記事では、PythonでAPIを使うときに、APIキーやアクセストークンをコードへ直接書かず、外部ファイルで管理する方法をまとめます。
YouTube Data API、Steam Web API、各種クラウドAPIなどを使う場合、APIキーは接続に必要な認証情報です。サンプルコードに直接書くと動作確認は簡単ですが、そのままGitHubやブログ記事、共有フォルダに置くと漏えいにつながります。
この記事でできること
- APIキーをコードから分離する理由を整理する
.envファイルでAPIキーを管理するconfig.iniで通常設定と秘密情報を分けて扱う.gitignoreで誤コミットを防ぐ- APIキーを使う記事やノートブックで再利用しやすい形にする
APIキーをコードに直接書かない理由
APIキーは、サービスによっては利用量や課金、クォータ、アカウント制限と結びつきます。公開リポジトリや記事内に残すと、第三者に使われる可能性があります。
# 避けたい例
API_KEY = "AIzaSyxxxxxxxxxxxxxxxxxxxxxxxxxxxx"個人の学習用コードでも、後からGitHubに上げる、ノートブックを共有する、記事用にコードを貼る、といった場面があります。最初から外部ファイルに分けておくほうが安全です。
.envとconfig.iniの使い分け
| ファイル | 向いている内容 | 公開可否 |
|---|---|---|
.env | APIキー、トークン、パスワードなどの秘密情報 | 公開しない |
config.ini | 出力先、取得件数、対象チャンネルIDなどの通常設定 | 秘密情報がなければ公開しやすい |
.env.example | 必要な環境変数名の見本 | 公開してよい |
判断基準は単純です。漏れたら困るものは .env、漏れても問題ない実行設定は config.ini に置きます。
.envでAPIキーを管理する
まず、プロジェクト直下に .env を作成します。
YOUTUBE_API_KEY=ここにAPIキーを書く
STEAM_API_KEY=ここにAPIキーを書く値をダブルクォートで囲む必要はありません。スペースや特殊文字を含む場合は、読み込み側のライブラリ仕様に合わせて調整します。
Pythonでは python-dotenv を使うと扱いやすいです。
pip install python-dotenvimport os
from dotenv import load_dotenv
load_dotenv()
youtube_api_key = os.getenv("YOUTUBE_API_KEY")
if not youtube_api_key:
raise RuntimeError("YOUTUBE_API_KEY が設定されていません")
print("APIキーを読み込みました")実際のキーは出力しないようにします。確認用に表示する場合でも、先頭数文字だけに留めます。
.env.exampleを用意する
.env は公開しませんが、どの環境変数が必要かは共有したいことがあります。その場合は .env.example を用意します。
YOUTUBE_API_KEY=
STEAM_API_KEY=実際の値は空欄にします。これなら、記事やリポジトリに載せても秘密情報は含まれません。
.gitignoreで誤コミットを防ぐ
Gitを使う場合は、.env を必ず .gitignore に追加します。
.env
.env.*
!.env.exampleこの設定では、実際の .env は無視し、見本用の .env.example だけ管理対象にできます。
すでにGitに追加してしまった場合は、.gitignore に書くだけでは履歴から消えません。キーを無効化・再発行し、必要に応じて履歴から削除する対応が必要です。
config.iniで通常設定を管理する
取得対象や出力先など、秘密ではない設定は config.ini に分けると見通しがよくなります。
[youtube_api]
channel_id = UCxxxxxxxxxxxxxxxxxxxxxx
max_results = 50
[output]
csv_path = outputs/videos.csvPythonでは標準ライブラリの configparser で読み込めます。
import configparser
config = configparser.ConfigParser()
config.read("config.ini", encoding="utf-8")
channel_id = config["youtube_api"]["channel_id"]
max_results = config["youtube_api"].getint("max_results")
csv_path = config["output"]["csv_path"]
print(channel_id, max_results, csv_path)config.ini にAPIキーを入れることも技術的には可能ですが、公開しやすい通常設定と秘密情報が混ざります。基本は、秘密情報は .env、通常設定は config.ini に分けるほうが管理しやすいです。
YouTube Data APIで使う例
YouTube Data APIの記事では、APIキーを次のように読み込みます。
import os
import requests
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("YOUTUBE_API_KEY")
if not API_KEY:
raise RuntimeError("YOUTUBE_API_KEY が設定されていません")
url = "https://www.googleapis.com/youtube/v3/videos"
params = {
"part": "snippet,statistics",
"id": "dQw4w9WgXcQ",
"key": API_KEY,
}
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
data = response.json()
print(data["items"][0]["snippet"]["title"])記事やサンプルコードでは、実際のAPIキーを載せず、YOUTUBE_API_KEY のような環境変数名だけを示します。
公開用コードで注意すること
- APIキーをコードに直接書かない
- APIキーをスクリーンショットに写さない
- Notebookの出力セルにAPIキーを残さない
- ブラウザで実行されるJavaScriptに秘密キーを埋め込まない
- 漏えいした可能性がある場合は、キーを再発行する
特にブラウザで動くコードは、利用者から中身が見えます。秘密にしたいキーは、サーバー側やローカル環境で扱う前提にします。
管理方法の目安
| 状況 | おすすめ |
|---|---|
| 個人PCでPythonを実行 | .env + python-dotenv |
| 取得対象や出力先も変えたい | .env + config.ini |
| GitHubにサンプルを置く | .env.example を公開し、.env は除外 |
| 複数人で共有する | 各自でAPIキーを発行し、共有フォルダに秘密情報を置かない |
関連記事
- YouTube Data API v3入門|APIキー発行からPythonで動画情報を取得するまで
- YouTube Data APIでチャンネルの動画一覧を取得してCSV保存する方法|Python
- Steam Web APIキーの取得方法|登録・保管・Pythonでの接続確認
まとめ
APIキーは、コードに直接書かず、.env などの外部ファイルで管理します。秘密情報は .env、通常設定は config.ini、共有用の見本は .env.example に分けると、記事用コードや分析用ノートブックでも扱いやすくなります。
最初は少し手間に見えますが、YouTube Data APIやSteam APIなど複数の記事で同じ形式を使えるため、後からの管理が楽になります。