# -*- coding: utf-8 -*-
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)

# WebSocket CDP
def ws_connect():
    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\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-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):
    global _mid
    if params is None:
        params = {}
    _mid += 1
    ws_send(sock, json.dumps({"id": _mid, "method": method, "params": params}))
    sock.settimeout(20)
    for _ in range(300):
        try:
            r = json.loads(ws_recv(sock))
            if r.get("id") == _mid:
                return r
        except Exception:
            pass
    return None

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

# 1. DOM.getDocument
print("[1] DOM.getDocument...")
r = cdp(sock, "DOM.getDocument", {"depth": 0})
root = r["result"]["root"]["nodeId"]
print("  root nodeId:", root)

# 2. querySelectorAll input[type=file]
print("\n[2] querySelectorAll...")
r = cdp(sock, "DOM.querySelectorAll", {"nodeId": root, "selector": "input[type=file]"})
all_ids = r["result"]["nodeIds"]
print("  nodeIds:", all_ids)

# 3. 找图片类型的 input
print("\n[3] 找封面图 input...")
cover_node = None
for bId in all_ids:
    r = cdp(sock, "DOM.requestNode", {"backendNodeId": bId})
    nid = r["result"].get("node")
    if not nid:
        continue
    r = cdp(sock, "DOM.getAttributes", {"nodeId": nid})
    if r:
        attrs = r["result"]["attributes"]
        d = {}
        for i in range(0, len(attrs), 2):
            d[attrs[i]] = attrs[i + 1]
        accept = d.get("accept", "")
        print("  bId=%d nodeId=%s accept=%s" % (bId, nid, accept))
        if "image" in accept and "video" not in accept and cover_node is None:
            cover_node = nid
            print("  -> 封面图!")

# 4. Page.setUploadFiles
if cover_node:
    print("\n[4] Page.setUploadFiles...")
    print("  nodeId:", cover_node)
    print("  文件:", IMG)
    r = cdp(sock, "Page.setUploadFiles", {"nodeId": cover_node, "files": [IMG]})
    print("  结果:", r)
    if r and r.get("result") == {}:
        print("  成功! 等10秒上传...")
        time.sleep(10)
        # 检查
        r = cdp(sock, "Runtime.evaluate", {
            "expression": """
            (function() {
              var out = [];
              var imgs = document.querySelectorAll("img");
              for (var img of imgs) {
                var w = img.naturalWidth || img.width;
                var h = img.naturalHeight || img.height;
                var src = img.src || "";
                if (w > 80 && h > 80 && src.indexOf("vcg") === -1) {
                  out.push({w: w, h: h, src: src.substring(0, 50)});
                }
              }
              return JSON.stringify(out);
            })()
            """,
            "returnByValue": True
        })
        print("  封面:", r.get("result", {}).get("result", {}).get("value", ""))
    else:
        print("  失败:", r)
else:
    print("  未找到封面图 input")

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