起動手順

ターミナル
$pip install wmi pynput pywin32 requests       # 必要モジュールインストール


# USBWatcher v2.3 🌸 デスクトップに剥き出し保存する改良版!
import wmi
import time
import os
import shutil
from datetime import datetime

LOG_FILE = "usb_log.txt"

# 🖥️ デスクトップのパスを取得(Windows専用)
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

# 🔧 ログを出力(UTF-8で絵文字対応♪)
def log_event(msg):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    entry = f"[{timestamp}] {msg}"
    print(entry)
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(entry + "\n")

# 📂 USB内の全ファイルを「デスクトップに直接」コピーする処理
def copy_from_usb_to_desktop(drive):
    try:
        for root, dirs, files in os.walk(drive):
            for file in files:
                src_file = os.path.join(root, file)
                dst_file = os.path.join(desktop_path, file)

                # 🔁 同名ファイルがあればタイムスタンプ追加で衝突回避
                if os.path.exists(dst_file):
                    base, ext = os.path.splitext(file)
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                    dst_file = os.path.join(desktop_path, f"{base}_{timestamp}{ext}")

                try:
                    shutil.copy2(src_file, dst_file)
                    log_event(f"✅ コピー成功: {src_file} → {dst_file}")
                except PermissionError:
                    log_event(f"⚠️ アクセス拒否: {src_file}")
                except Exception as e:
                    log_event(f"⚠️ コピーエラー: {src_file} → {e}")

        log_event(f"🎉 すべてのファイルをデスクトップにコピー完了!")

    except Exception as e:
        log_event(f"❌ 全体コピー失敗: {e}")

# 🚀 USB監視スタート
print("[*] USB監視開始中...(Ctrl+Cで終了)")
c = wmi.WMI()
watcher = c.Win32_VolumeChangeEvent.watch_for()

try:
    while True:
        event = watcher()
        drive = event.DriveName
        event_type = event.EventType

        if event_type == 2:  # 挿入
            log_event(f"🔌 USB挿入: {drive}")
            copy_from_usb_to_desktop(drive)
        elif event_type == 3:  # 抜去
            log_event(f"🔌 USB抜去: {drive}")

except KeyboardInterrupt:
    print("\n[!] 監視終了〜おつかれさま🎀")