# -*- coding: utf-8 -*-
"""用 DOM.setFileInputFiles + objectId 上传封面图"""
import sys, socket, json, time, os, glob
sys.stdout.reconfigure(encoding="utf-8")

HOST = "localhost"
PORT = 28800
PAGE_ID = "70039F329097C14448996F189E3A42A1"

imgs = glob.glob(r"D:\wxpic\*.jpg") + glob.glob(r"D:\wxpic\*.png")
IMG = max(imgs, key=os.path.getmtime) if imgs else None
print("[INFO] 图片:", IMG)

def make_ws():
    import urllib.parse
    u = "ws://%s:%s/devtools/page/%s" % (HOST, PORT, PAGE_ID)
    p = urllib.parse.urlparse(u)
    s = socket.create_connection((p.hostname, p.port or 80), timeout=15)
    req = (
        "GET %s HTTP/1.1\r\nHost: %s:%s\r\nUpgrade: websocket\r\n"
        "Connection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
        "Sec-WebSocket-Version: 13\r\n\r\n"
    ) % (p.path, p.hostname, p.port)
    s.send(req.encode())
    resp = b""
    while b"\r\n\r\n" not in resp:
        resp += s.recv(4096)
    return s

def ws_send(sock, data):
    data = data.encode("utf-8")
    n = len(data)
    m = b"\x01\x02\x03\x04"
    if n <= 125:
        h = bytes([0x81, n | 0x80]) + m
    elif n <= 65535:
        h = bytes([0x81, 0xFE]) + n.to_bytes(2, "big") + m
    else:
        h = bytes([0x81, 0xFF]) + n.to_bytes(8, "big") + m
    sock.send(h + bytes(data[i] ^ m[i % 4] for i in range(n)))

def ws_recv(sock):
    h = b""
    while len(h) < 2:
        h += sock.recv(2 - len(h))
    n = h[1] & 0x7F
    if n == 126:
        nb = b""
        while len(nb) < 2:
            nb += sock.recv(2 - len(nb))
        n = int.from_bytes(nb, "big")
    elif n == 127:
        nb = b""
        while len(nb) < 8:
            nb += sock.recv(8 - len(nb))
        n = int.from_bytes(nb, "big")
    body = b""
    while len(body) < n:
        body += sock.recv(n - len(body))
    return body.decode("utf-8")

_mid = [0]

def cdp(sock, method, params=None):
    if params is None:
        params = {}
    _mid[0] += 1
    ws_send(sock, json.dumps({"id": _mid[0], "method": method, "params": params}))
    sock.settimeout(20)
    for _ in range(300):
        try:
            r = json.loads(ws_recv(sock))
            if r.get("id") == _mid[0]:
                return r
        except Exception:
            pass
    return None

sock = make_ws()
print("[OK] Connected\n")

# Step 1: 用 Runtime.evaluate 获取 input 的 objectId (returnByValue=false)
print("[1] 获取 image file input 的 objectId...")
r = cdp(sock, "Runtime.evaluate", {
    "expression": "window.__coverFileInput__ || document.querySelectorAll('input[type=file]')[1]",
    "returnByValue": False,
    "objectGroup": "cover-upload"
})
print("  response:", json.dumps(r, ensure_ascii=False)[:300] if r else "None")

obj_id = None
if r and "result" in r:
    result_obj = r["result"].get("result", {})
    obj_id = result_obj.get("objectId")
    print("  objectId:", obj_id)
    print("  type:", result_obj.get("type"))
    print("  subtype:", result_obj.get("subtype"))

if obj_id:
    # Step 2: DOM.setFileInputFiles
    print("\n[2] DOM.setFileInputFiles...")
    r = cdp(sock, "DOM.setFileInputFiles", {
        "objectId": obj_id,
        "files": [IMG]
    })
    print("  result:", json.dumps(r, ensure_ascii=False)[:300] if r else "None")
    
    if r and r.get("result") == {}:
        print("\n  文件设置成功！等待上传处理（10秒）...")
        time.sleep(10)
        
        # Step 3: 检查封面
        r = cdp(sock, "Runtime.evaluate", {
            "expression": """
            (function() {
                var imgs = document.querySelectorAll('img');
                var out = [];
                for (var img of imgs) {
                    var w = img.naturalWidth || img.width;
                    var h = img.naturalHeight || img.height;
                    var src = img.src || '';
                    if (w > 100 && h > 100 && src.indexOf('vcg') === -1 && src.indexOf('copyright') === -1 && src.indexOf('bdstatic') === -1) {
                        out.push({w: w, h: h, src: src.substring(0, 60), isData: src.indexOf('data:') > -1});
                    }
                }
                return JSON.stringify(out);
            })()
            """,
            "returnByValue": True
        })
        val = r.get("result", {}).get("result", {}).get("value", "") if r else ""
        print("  封面图:", val[:500])
    else:
        print("  设置失败")
else:
    print("  无法获取 objectId")

sock.close()
print("\nDone")
