python 迷惑電話管理 | 60歳を迎えて、思うこと。

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

python 迷惑電話管理

にゃあにゃあ
ぱいぱい

知らない電話番号から

の 
着信

大漁


なめたら あかんぜよ!



Microsoft Copilot様に

へるぷ みぃ~

した

結果・・・
結果・・・
結果・・・ ぐちゃぐちゃ;;

【Gemini】様 に 尻ぬぐいを
お願いすることに


# ==== pythonスクリプト 【Gemini】様

# # ==============================
# 2026/03/24 18:04:09
# 【Gemini】様 Rev.D

# ### 🛠️ Rev.D:桁数チェックと整形ロジックの強化
# 「明らかに日本の番号としておかしい桁数」を弾きつつ、整形もさらに賢くしましょう。
# #### 1. 入力時に「桁数オーバー」を警告する
# `input_phone` 関数を改造して、日本の一般的な桁数(10桁または11桁)以外は再入力を促すようにします。
# #### 2. 整形ロジックをより緻密にする
# フリーダイヤルが12桁(0120-xxx-xxxxx)といった「ありえない形式」にならないようガードを固めます。

# ### 🚀 Rev.D 完成コード(連続入力・厳格チェック版)
# ```python



import csv
import os
from datetime import datetime
from collections import Counter

CSV_PATH = r"L:\pypy\着信履歴\着信履歴.csv"
YEAR = 2026

def format_phone(num: str) -> str:
    """日本の電話番号形式に合わせたハイフン整形 (Rev.D)"""
    length = len(num)
    
    # 1. フリーダイヤル (0120, 0800) -> 10桁限定
    if num.startswith(("0120", "0800")) and length == 10:
        return f"{num[0:4]}-{num[4:7]}-{num[7:10]}"
    
    # 2. 携帯・IP電話 (070, 080, 090, 050) -> 11桁限定
    if num.startswith(("070", "080", "090", "050")) and length == 11:
        return f"{num[0:3]}-{num[3:7]}-{num[7:11]}"
    
    # 3. 固定電話 (10桁限定)
    if length == 10:
        if num.startswith(("03", "06")): # 東京・大阪
            return f"{num[0:2]}-{num[2:6]}-{num[6:10]}"
        else: # その他市外局番 (横浜045など)
            return f"{num[0:3]}-{num[3:6]}-{num[6:10]}"
            
    # 整形ルールに合わないものはそのまま返す
    return num

def input_phone():
    """電話番号の入力と桁数チェック"""
    while True:
        num = input("電話番号を入力 (数字のみ): ").strip()
        if not num:
            print("⚠ 電話番号は必須入力です。")
            continue
        if not num.isdigit():
            print("⚠ 数字のみで入力してください。")
            continue
        
        # 桁数チェック (日本の電話番号は通常10か11桁)
        if len(num) < 10 or len(num) > 11:
            print(f"⚠ 桁数が異常です ({len(num)}桁)。")
            confirm = input("本当にこの番号で登録しますか? (y/n): ").lower()
            if confirm != 'y':
                continue
        
        return num

def show_ranking():
    """ランキング表示(整形を適用して見やすく)"""
    if not os.path.exists(CSV_PATH): return
    with open(CSV_PATH, "r", encoding="utf-8") as f:
        rows = list(csv.reader(f))[1:]
    
    # 5列目(元番号)の引用符を除去して集計
    numbers = [row[4].lstrip("'") for row in rows if len(row) > 4 and row[4]]
    if not numbers: return

    ranking = Counter(numbers).most_common(10)
    print("\n=== 迷惑電話ランキング(上位10件) ===")
    for i, (num, count) in enumerate(ranking, start=1):
        # 表示時にも整形をかける
        print(f"{i}位: {format_phone(num):<15} ({count}回)")

def main():
    if not os.path.exists(os.path.dirname(CSV_PATH)):
        os.makedirs(os.path.dirname(CSV_PATH), exist_ok=True)
    if not os.path.exists(CSV_PATH):
        with open(CSV_PATH, "w", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow(["日時", "電話番号", "カテゴリ", "メモ", "元番号"])

    print("--- 迷惑電話入力モード(終了するには月日に '9999' を入力) ---")
    
    while True:
        md = input("\n月日を入力 (例:0324 / 終了:9999): ").strip()
        if md == '9999': break
            
        try:
            if len(md) != 4 or not md.isdigit(): raise ValueError
            month, day = int(md[:2]), int(md[2:])
            datetime(YEAR, month, day)
        except ValueError:
            print(f"⚠ 日付が不正です: {md}")
            continue

        # 時間入力
        while True:
            hm = input("時間を入力 (例:1059): ").strip()
            if len(hm) == 4 and hm.isdigit():
                h, m = int(hm[:2]), int(hm[2:])
                if 0 <= h <= 23 and 0 <= m <= 59:
                    hour, minute = h, m
                    break
            print("⚠ 正しい時間を入力してください。")

        # 電話番号入力
        raw_num = input_phone()

        # 保存
        dt_str = datetime(YEAR, month, day, hour, minute).strftime("%Y/%m/%d %H:%M:%S")
        formatted_num = format_phone(raw_num)
        quoted_raw = f"'{raw_num}"

        with open(CSV_PATH, "a", newline="", encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow([dt_str, formatted_num, "", "", quoted_raw])

        print(f"✅ 記録完了: {formatted_num}")
        show_ranking()

if __name__ == "__main__":
    main()


# ### 📝 改良のポイント
# 1.  **「本当に登録しますか?」の壁**: 桁数がおかしいときに一度止めるようにしました。これで「080023458821(12桁)」のようなミス入力を防げます。
# 2.  **ランキングの見た目**: `format_phone(num):<15` とすることで、番号の長さに寄らず桁を揃えて表示するようにしました。
# 3.  **連続入力**: `while True` で囲んでいるので、1件終わるごとに次の入力を受け付けます。
# **これで実行してみて、変な番号が紛れ込むストレスは減りそうでしょうか?** もし「もっと自動で桁数ミスを直してほしい(例:0120の後の余計な数字を消すなど)」といったご要望があれば、さらに踏み込みます!
# # ==============================

やでやで

 

他力本願な

お年頃♪

 

じじぃ~