【Python】使えるパスワード自動生成ツール!重複チェック&ファイル保存機能付き(コピペOK)

【Windows環境対応】Pythonとバッチファイルで作る「対話型」パスワードジェネレーター python


 強力なパスワードをいちいち考えるのが面倒なので、パスワードの自動生成プログラムをAIさん指導の元、作ってみました(笑)。


 このプログラムは、ただランダムな文字列を作るだけでなく、「Windowsのバッチファイルから1クリックで起動」、「8~30文字の範囲指定」、「エラーの原因になる特定の記号の除外」など、”使える”機能を詰め込みました。


 さらに、過去に生成したパスワードと絶対に重複しないチェック機能や、実行時の日時をファイル名にしたテキストファイルへの自動保存機能も搭載しています。環境構築から使い方まで分かりやすく解説します!

使い方の説明

【準備するもの】

プログラムを動かすために、任意のフォルダ(例:E:\password_generator)を作成し、以下の2つのファイルを保存してください。プログラムコードは、最後に置いておきます。

  1. main.py(パスワード自動生成のPythonコード)
  2. run.bat(ダブルクリックで起動するためのWindowsバッチファイル)

実際の使い方の流れ(例文と画面イメージ)

run.bat をダブルクリックすると、コマンドプロンプト(黒い画面)が立ち上がり、対話形式で条件を指定できます。

実行例①:すべてデフォルト設定で作る場合

文字数や記号にこだわりがない場合は、何も入力せずに Enterキーを叩くだけで16文字のパスワードが3つ出来上がります。

↓コマンドプロンプト(黒い画面)に表示される文言↓
=== パスワード生成 & 自動保存ツール ===
[注意] 何も入力せずにEnterを押すと、16文字(記号なし)のパスワードが生成されます。

  • 文字数を指定してください (8-30): (何も入力せずEnter)
  • 記号を含めますか? (y/n) [n]: (何も入力せずEnter)

====================================
重複チェック済みのパスワードを3つ生成しました:

  1. tK8wPz2mNq5vX9rA
  2. bD4fHj9kLm1nPp3q
  3. rS7tVw2xYz5aBc6d

====================================

ファイルを作成しました: 20260603_234500.txt
履歴ファイル (history.txt) にデータを蓄積しました。←重複チェック用ファイル

処理が完了しました。
続行するには何かキーを押してください . . .

実行例②:条件を細かく指定する場合(20文字・記号あり・特定の記号を除外)

Webサイトや社内システムの仕様に合わせて、「20文字」、「記号を含める」、「ただし、エラー原因になる ” や ‘ や \ は除外する」といった指定も簡単です。

=== パスワード生成 & 自動保存ツール ===
[注意] 何も入力せずにEnterを押すと、16文字(記号なし)のパスワードが生成されます。

  • 文字数を指定してください (8-30): 20
  • 記号を含めますか? (y/n) [n]: y
  • 除外したい記号があれば入力してください(例: “‘\ ) [なし]: “‘\

====================================
重複チェック済みのパスワードを3つ生成しました:

  1. g#K9$vF2m%Nq5_rA@z*p
  2. bD+fHj!kLm~nPp[q}s-x
  3. rS=tVw?xYz&aBc#d(f)g

====================================

ファイルを作成しました: 20260603_234612.txt
履歴ファイル (history.txt) にデータを蓄積しました。

処理が完了しました。
続行するには何かキーを押してください . . .

実行後に生成されるファイル

プログラムが終了すると、同じフォルダ内に以下のファイルが自動生成されます。

  • 20260603_234500.txt : 実行した日時が名前になったファイル。中に今回生成された3つのパスワードだけが保存されます。
  • history.txt : 過去に作った全パスワードのログです。プログラムはこのファイルを自動で読み込み、「過去に一度でも作ったパスワードは二度と生成しない」という強固な重複回避を行います。

main.py(パスワード自動生成のPythonコード)

import secrets
import string
import os
import datetime

# 過去の全履歴を保存するファイル名
HISTORY_FILE = "history.txt"

def load_history():
    """過去に生成したパスワードの履歴を読み込む"""
    if not os.path.exists(HISTORY_FILE):
        return set()
    with open(HISTORY_FILE, "r", encoding="utf-8") as f:
        return set(line.strip() for line in f if line.strip())

def save_to_history(passwords):
    """新しいパスワードを履歴ファイルに追記する"""
    with open(HISTORY_FILE, "a", encoding="utf-8") as f:
        for pwd in passwords:
            f.write(pwd + "\n")

def generate_single_password(length, use_upper, use_lower, use_digits, use_punctuation, exclude_chars):
    """指定された条件でパスワードを1本生成する基本ロジック"""
    characters = ""
    if use_upper:
        characters += string.ascii_uppercase
    if use_lower:
        characters += string.ascii_lowercase
    if use_digits:
        characters += string.digits
        
    if use_punctuation:
        punctuation_pool = string.punctuation
        for char in exclude_chars:
            punctuation_pool = punctuation_pool.replace(char, '')
        characters += punctuation_pool
        
    if not characters:
        raise ValueError("エラー: 少なくとも1つの文字タイプを選択してください。")
        
    return ''.join(secrets.choice(characters) for _ in range(length))

def generate_multiple_passwords(count=3, length=16, use_upper=True, use_lower=True, use_digits=True, use_punctuation=False, exclude_chars=""):
    """重複をチェックしながら指定された個数のパスワードを生成する"""
    if not (8 <= length <= 30):
        raise ValueError("エラー: パスワードの文字数は8文字から30文字の間で指定してください。")

    history = load_history()
    generated_passwords = []
    attempts = 0
    max_attempts = 1000

    while len(generated_passwords) < count:
        pwd = generate_single_password(length, use_upper, use_lower, use_digits, use_punctuation, exclude_chars)
        attempts += 1
        
        if pwd not in history and pwd not in generated_passwords:
            generated_passwords.append(pwd)
        
        if attempts > max_attempts:
            raise RuntimeError("エラー: 重複のないパスワードを生成できませんでした。文字数を増やすか条件を緩めてください。")
            
    return generated_passwords

if __name__ == "__main__":
    print("=== パスワード生成 & 自動保存ツール ===")
    print("[注意] 何も入力せずにEnterを押すと、16文字(記号なし)のパスワードが生成されます。\n")

    try:
        # 1. 条件の入力
        len_input = input("- 文字数を指定してください (8-30): ").strip()
        length = int(len_input) if len_input else 16

        punc_input = input("- 記号を含めますか? (y/n) [n]: ").strip().lower()
        use_punctuation = True if punc_input == 'y' else False

        exclude_chars = ""
        if use_punctuation:
            exclude_chars = input("- 除外したい記号があれば入力してください(例: \"'\\ ) [なし]: ")

        # 2. 3つのパスワードを生成
        passwords = generate_multiple_passwords(
            count=3,
            length=length,
            use_upper=True,
            use_lower=True,
            use_digits=True,
            use_punctuation=use_punctuation,
            exclude_chars=exclude_chars
        )
        
        # 3. 画面に結果を表示
        print("\n====================================")
        print(" 重複チェック済みのパスワードを3つ生成しました:")
        for i, pwd in enumerate(passwords, 1):
            print(f"  {i}. {pwd}")
        print("====================================")

        # 4. 個別ファイルの作成(ファイル名: 年月日_時分秒.txt)
        now = datetime.datetime.now()
        filename = now.strftime("%Y%m%d_%H%M%S.txt")
        
        with open(filename, "w", encoding="utf-8") as f:
            f.write(f"生成日時: {now.strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write("------------------------------------\n")
            for pwd in passwords:
                f.write(pwd + "\n")
                
        print(f"ファイルを作成しました: {filename}")

        # 5. 過去ログ(history.txt)へ蓄積
        save_to_history(passwords)
        print(f"履歴ファイル ({HISTORY_FILE}) にデータを蓄積しました。")

    except Exception as e:
        print(f"\n{e}")

run.bat(ダブルクリックで起動するためのWindowsバッチファイル)

@echo off
cd /d "E:\password_generator" # ご自身の保存先フォルダに書き換えて下さい。

:: 仮想環境のPythonを使ってスクリプトを実行
call .\.venv\Scripts\activate
python main.py

:: 実行後に画面を閉じずに一時停止する
echo.
echo 処理が完了しました。
pause
タイトルとURLをコピーしました