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の後の余計な数字を消すなど)」といったご要望があれば、さらに踏み込みます!
# # ==============================
やでやで
他力本願な
お年頃♪
じじぃ~