# -*- coding: utf-8 -*-
"""CDP 设置封面 file input 文件"""
import sys, socket, json, os, glob
sys.stdout.reconfigure(encoding="utf-8")

HOST = "localhost"
PORT = 28800
import urllib.request as ur
pages = json.loads(ur.urlopen("http://127.0.0.1:28800/json").read())
PAGE_ID = pages[0]["id"]

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

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)

def ws_send(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
    s.send(h + bytes(data[i] ^ m[i % 4] for i in range(n)))

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

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

# 获取 objectId
r = cdp("Runtime.evaluate", {
    "expression": "window.__newFileInput__",
    "returnByValue": False,
    "objectGroup": "cover"
})
obj_id = r["result"]["result"]["objectId"]
print("[OK] objectId:", obj_id)

# 设置文件
r = cdp("DOM.setFileInputFiles", {"objectId": obj_id, "files": [IMG]})
print("[OK] setFileInputFiles:", r)

s.close()
print("Done")
