Gemini APIキー取得支援ツール(ソースコードと実行結果)

Python開発環境,ライブラリ類

ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。

Python 3.12 のインストール

インストール済みの場合は実行不要。

管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。

REM Python をシステム領域にインストール
winget install --scope machine --id Python.Python.3.12 -e --silent
REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts"
echo "%PATH%" | find /i "%PYTHON_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_PATH%" /M >nul
echo "%PATH%" | find /i "%PYTHON_SCRIPTS_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_SCRIPTS_PATH%" /M >nul

関連する外部ページ

Python の公式ページ: https://www.python.org/

AI エディタ Windsurf のインストール

Pythonプログラムの編集・実行には、AI エディタの利用を推奨する。ここでは,Windsurfのインストールを説明する。

管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行して、Windsurfをシステム全体にインストールする。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要となる。

winget install --scope machine Codeium.Windsurf -e --silent

関連する外部ページ

Windsurf の公式ページ: https://windsurf.com/

Gemini APIキー取得支援ツール

このプログラムは、Gemini APIキーの取得と管理の支援ツールである。ユーザーがGoogle のAI APIを利用するために必要なAPIキーを取得・保存できる。なお,Gemini APIキーには,各自,OpenAI アカウントが必要である.

ソースコード


"""
Gemini APIキー取得支援ツール

特徴技術名: webbrowserモジュール
出典: Python Software Foundation. (2025). webbrowser — Convenient web-browser controller. Python 3.13.5 documentation. https://docs.python.org/3/library/webbrowser.html

特徴機能: プラットフォーム独立のブラウザ制御
webbrowserモジュールは、Unix、Windows、macOS、iOSなど様々なプラットフォームで動作し、各プラットフォームのデフォルトブラウザを自動的に検出して使用する機能を提供する。

学習済みモデル: 使用していない

方式設計:
- 関連利用技術:
  - getpassモジュール: パスワード入力時のエコー無効化によるセキュアな入力機能
  - pathlibモジュール: オブジェクト指向ファイルパス操作とファイル読み書き機能
- 入力と出力:
  入力: ユーザーによる選択操作(ブラウザでのAPIキー取得、コンソールでのAPIキー入力)
  出力: ブラウザでのGemini APIキーページ表示、APIキーの.envファイル保存
- 処理手順:
  1. 既存APIキーの確認と選択肢提示
  2. ブラウザでGemini APIキーページを開く
  3. ユーザーによる手動でのAPIキー取得
  4. getpassを使用したセキュアなAPIキー入力
  5. APIキーの.envファイルへの保存
- 前処理: 既存.envファイルの読み込みとAPIキー存在確認
- 後処理: APIキー保存後の確認メッセージ表示
- 追加処理: APIキーの部分マスク表示によるセキュリティ配慮

- 調整を必要とする設定値:
  - filename: APIキーを保存するファイル名(デフォルト: .env)

将来方策: 既存の.envファイルを読み込み、同一APIキーの存在確認を行う機能を実装済み

その他の重要事項: getpassモジュールによりAPIキー入力時の画面表示を防止

前準備: なし(標準ライブラリのみ使用)
"""

import webbrowser
from pathlib import Path
import getpass

# 設定定数
DEFAULT_ENV_FILE = '.env'
GEMINI_API_URL = 'https://aistudio.google.com/app/apikey'
API_KEY_PREFIX = 'GEMINI_API_KEY='


def check_api_key(filename=DEFAULT_ENV_FILE):
    '''既存のAPIキーを確認'''
    file_path = Path(filename)
    if not file_path.exists():
        return None

    try:
        content = file_path.read_text()
        lines = content.splitlines()

        for line in lines:
            line = line.strip()
            if line.startswith(API_KEY_PREFIX):
                api_key = line.split('=', 1)[1]
                if api_key:
                    return api_key
        return None
    except Exception as e:
        print(f'ファイル読み込みエラー: {e}')
        return None


def open_api_page():
    '''GeminiのAPIキーページを開く'''
    print('ブラウザでGeminiのAPIキーページを開きます...')
    webbrowser.open(GEMINI_API_URL)


def show_instructions():
    '''手動操作の指示を表示'''
    print('\n=== 手動操作の手順 ===')
    print('1. ブラウザでGoogleアカウントにログインしてください')
    print("2. 'Get API key'ボタンをクリック")
    print("3. 'Create API key'ボタンをクリック")
    print("4. 'Create API key in new project'をクリック")
    print('5. 表示されたAPIキーをコピーしてください')
    print('   ※ セキュリティのため、すぐに安全な場所に保存してください')
    print('=====================================\n')


def get_api_key():
    '''ユーザーからAPIキーを取得'''
    print('コピーしたAPIキーを貼り付けてください')
    api_key = getpass.getpass('APIキー: ')
    return api_key.strip()


def save_api_key(api_key, filename=DEFAULT_ENV_FILE):
    '''APIキーをファイルに保存(上書きモード)'''
    try:
        file_path = Path(filename)

        # 既存ファイルがある場合は、GEMINI_API_KEY行以外を保持
        existing_lines = []
        if file_path.exists():
            content = file_path.read_text()
            existing_lines = [line + '\n' for line in content.splitlines()
                            if not line.strip().startswith(API_KEY_PREFIX)]

        # 新しいAPIキーを追加
        content = ''.join(existing_lines)
        if content and not content.endswith('\n'):
            content += '\n'
        content += f'{API_KEY_PREFIX}{api_key}\n'

        file_path.write_text(content)
        print(f'APIキーを {filename} に保存しました')
        return True
    except Exception as e:
        print(f'保存エラー: {e}')
        return False


def main():
    print('=== Gemini APIキー取得支援ツール ===\n')

    # 既存のAPIキーを確認
    existing_key = check_api_key()

    if existing_key:
        print(f'既存のAPIキーが見つかりました: {existing_key[:8]}...{existing_key[-4:]}')
        print('1. 既存のAPIキーを使用する')
        print('2. 新しいAPIキーで上書きする')

        choice = input('選択 (1/2): ').strip()

        if choice == '1':
            print('既存のAPIキーを使用します')
            print('\n処理を終了します')
            return
        elif choice != '2':
            print('無効な選択です')
            print('\n処理を終了します')
            return

    # ブラウザを開く
    input('Enterキーを押すとブラウザが開きます...')
    open_api_page()

    # 手順を表示
    show_instructions()

    # APIキー取得の確認
    input('APIキーをコピーしたらEnterキーを押してください...')

    # APIキーを取得
    api_key = get_api_key()

    if api_key:
        print(f'\n取得したAPIキー: {api_key[:8]}...{api_key[-4:]}')

        # ファイルに保存
        save_choice = input('\nファイルに保存しますか? (y/n): ')
        if save_choice.lower() == 'y':
            filename = input(f'保存先ファイル名 (デフォルト: {DEFAULT_ENV_FILE}): ').strip()
            if not filename:
                filename = DEFAULT_ENV_FILE
            save_api_key(api_key, filename)
    else:
        print('APIキーが入力されませんでした')

    print('\n処理を終了します')


main()