#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Token Catcher — 启动浏览器 + 监控网络日志抓取 Token
用法: python token-catcher.py [wo|nz]
"""
import subprocess
import json
import re
import os
import sys
import time
import tempfile
import urllib.request
import ssl
import shutil

SAVE_URL = "https://anatur.cn/api/auth/save"

LOGIN_URLS = {
    "wo": "https://customer.weike.fm/login?redirect=https%3A%2F%2Fcustomer.weike.fm%2Fcustomer-sevice-workbench%2Fworkorder-system%2Fcustomer-workbench",
    "nz": "https://efficiency-platform-pc.lizhiweike.com/efficiency-platform-pc/login",
}

BROWSER_PATHS = [
    # Chrome
    r"C:\Program Files\Google\Chrome\Application\chrome.exe",
    r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
    os.path.expandvars(r"%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe"),
    # Edge
    r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe",
    r"C:\Program Files\Microsoft\Edge\Application\msedge.exe",
    os.path.expandvars(r"%PROGRAMFILES(x86)%\Microsoft\Edge\Application\msedge.exe"),
    os.path.expandvars(r"%PROGRAMFILES%\Microsoft\Edge\Application\msedge.exe"),
    # QQ浏览器
    os.path.expandvars(r"%PROGRAMFILES(x86)%\Tencent\QQBrowser\QQBrowser.exe"),
    os.path.expandvars(r"%PROGRAMFILES%\Tencent\QQBrowser\QQBrowser.exe"),
    os.path.expandvars(r"%LOCALAPPDATA%\Tencent\QQBrowser\Application\QQBrowser.exe"),
    # 通用 fallback
    shutil.which("chrome"),
    shutil.which("msedge"),
    shutil.which("QQBrowser"),
]

def find_browser():
    for p in BROWSER_PATHS:
        if p and os.path.exists(p):
            return p
    return None

def save_token(token, sys_type):
    """发送 Token 到 anatur.cn"""
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    data = json.dumps({"token": token, "type": sys_type}).encode()
    req = urllib.request.Request(SAVE_URL, data=data, method="POST")
    req.add_header("Content-Type", "application/json")
    try:
        with urllib.request.urlopen(req, context=ctx, timeout=15) as r:
            return json.loads(r.read().decode())
    except Exception as e:
        return {"ok": False, "error": str(e)}

def monitor_netlog(log_path, sys_type, timeout=120):
    """持续读取 netlog 文件，检测 token"""
    print(f"⏳ 监听网络日志: {log_path}")
    start = time.time()
    seen = set()
    last_pos = 0

    while time.time() - start < timeout:
        try:
            if not os.path.exists(log_path):
                time.sleep(1)
                continue

            with open(log_path, "r", encoding="utf-8", errors="ignore") as f:
                f.seek(last_pos)
                content = f.read()
                last_pos = f.tell()

            # 搜索 token 模式
            # 格式1: URL 中的 ?token=eyJ...  
            # 格式2: JSON 中的 "token":"eyJ..."
            matches = re.findall(
                r'eyJ[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+\.[a-zA-Z0-9_\-]+',
                content
            )

            for token in matches:
                if token in seen:
                    continue
                seen.add(token)
                print(f"\n🔑 发现 Token! 长度={len(token)}")
                print(f"   正在保存到 {SAVE_URL} ...")
                result = save_token(token, sys_type)
                if result.get("ok"):
                    label = "工单" if sys_type == "wo" else "哪吒"
                    print(f"   ✅ {label} Token 已保存 (用户{result.get('user_id')})")
                    print(f"   📋 刷新 https://anatur.cn/dashboard.html 即可")
                    return True
                else:
                    print(f"   ❌ 保存失败: {result.get('error', '未知')}")

            time.sleep(1)

        except KeyboardInterrupt:
            print("\n⏹ 用户中止")
            return False
        except Exception as e:
            print(f"⚠ {e}")
            time.sleep(2)

    print("⏰ 超时")
    return False

def main():
    sys_type = sys.argv[1] if len(sys.argv) > 1 else "nz"
    if sys_type not in LOGIN_URLS:
        print("用法: python token-catcher.py [wo|nz]")
        sys.exit(1)

    browser = find_browser()
    if not browser:
        print("❌ 找不到浏览器 (支持 Chrome/Edge/QQ浏览器)")
        print("   已搜索以下路径:")
        for p in BROWSER_PATHS:
            if p: print(f"     {p}")
        sys.exit(1)

    log_path = os.path.join(tempfile.gettempdir(), "token-catcher-netlog.json")
    # 删掉旧日志
    if os.path.exists(log_path):
        try: os.remove(log_path)
        except: pass

    label = "工单" if sys_type == "wo" else "哪吒"
    url = LOGIN_URLS[sys_type]

    print("=" * 50)
    print(f"  🔑 Token Catcher — {label}系统")
    print("=" * 50)
    print()
    print(f"  浏览器:    {os.path.basename(browser)}")
    print(f"  完整路径:  {browser}")
    print(f"  登录页:    {url}")
    print(f"  网络日志:  {log_path}")
    print()
    print("  → 请在浏览器中扫码登录")
    print("  → 登录后此窗口自动检测 Token")
    print("  → 保存成功后浏览器自动关闭")
    print()

    # 启动浏览器
    cmd = [
        browser,
        f"--log-net-log={log_path}",
        "--no-first-run",
        "--no-default-browser-check",
        "--new-window",
        url,
    ]
    proc = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

    time.sleep(2)
    if proc.poll() is not None:
        print("❌ 浏览器启动失败，请检查路径")
        print(f"   尝试的路径: {browser}")
        sys.exit(1)

    # 监控网络日志
    ok = monitor_netlog(log_path, sys_type, timeout=120)

    # 清理
    try:
        proc.terminate()
        time.sleep(2)
        if proc.poll() is None:
            proc.kill()
    except:
        pass

    for f in [log_path]:
        if os.path.exists(f):
            try:
                os.remove(f)
            except:
                pass

    if ok:
        print("\n👋 完成! Token 已保存。")
    else:
        print(f"\n⚠ 未检测到 Token。")
        print(f"  手动方式: 打开 https://anatur.cn/dashboard.html → 🔑 → 粘贴登录URL")

if __name__ == "__main__":
    main()
