# -*- coding: utf-8 -*-
"""诊断编辑器完整结构"""
import sys, socket, json, time, urllib.request, urllib.parse
sys.stdout.reconfigure(encoding='utf-8')

HOST = 'localhost'
PORT = 9223

pages = json.loads(urllib.request.urlopen(f'http://{HOST}:{PORT}/json').read())
page_id = [p['id'] for p in pages if 'baijiahao.baidu.com' in p['url']][0]

ws_url = f'ws://{HOST}:{PORT}/devtools/page/{page_id}'
parsed = urllib.parse.urlparse(ws_url)
sock = socket.create_connection((parsed.hostname, parsed.port or 80), timeout=15)
key = 'dGhlIHNhbXBsZSBub25jZQ=='
handshake = f'GET {parsed.path} HTTP/1.1\r\nHost:{parsed.hostname}:{parsed.port}\r\nUpgrade:websocket\r\nConnection:Upgrade\r\nSec-WebSocket-Key:{key}\r\nSec-WebSocket-Version:13\r\n\r\n'
sock.send(handshake.encode())
resp = b''
while b'\r\n\r\n' not in resp:
    resp += sock.recv(4096)

def send(s, d):
    data = json.dumps(d).encode('utf-8')
    n = len(data)
    mask = b'\x01\x02\x03\x04'
    if n <= 125:
        hdr = bytes([0x81, n|0x80]) + mask
    elif n <= 65535:
        hdr = bytes([0x81, 0xFE]) + n.to_bytes(2, 'big') + mask
    s.send(hdr + bytes(data[i] ^ mask[i%4] for i in range(n)))

def recv(s):
    h = s.recv(2)
    n = h[1] & 0x7f
    if n == 126:
        n = int.from_bytes(s.recv(2), 'big')
    elif n == 127:
        n = int.from_bytes(s.recv(8), 'big')
    return s.recv(n).decode('utf-8')

# 查找所有可能的编辑器元素
expr = '''
(function(){
    var results = [];
    
    // 1. contenteditable
    var ce = document.querySelectorAll('[contenteditable]');
    for(var el of ce){
        var rect = el.getBoundingClientRect();
        results.push({type:'contenteditable', class:el.className.substring(0,40), top:Math.round(rect.top), text_len:(el.innerText||'').length});
    }
    
    // 2. role="textbox" 或 aria-label
    var textboxes = document.querySelectorAll('[role="textbox"], [aria-label*="标题"], [aria-label*="正文"]');
    for(var el of textboxes){
        var rect = el.getBoundingClientRect();
        results.push({type:'role_textbox', aria:el.getAttribute('aria-label')||'none', top:Math.round(rect.top)});
    }
    
    // 3. lexial-editor 相关的容器
    var lexicals = document.querySelectorAll('[data-lexical-editor]');
    for(var el of lexicals){
        var rect = el.getBoundingClientRect();
        results.push({type:'lexical_editor', class:el.className.substring(0,40), top:Math.round(rect.top)});
    }
    
    // 4. ueditor iframe
    var iframes = document.querySelectorAll('iframe[id*="ueditor"], iframe[id*="editor"]');
    for(var el of iframes){
        var rect = el.getBoundingClientRect();
        results.push({type:'iframe', id:el.id, top:Math.round(rect.top)});
    }
    
    // 5. 查找所有明显的文本输入区域 (宽度 > 500, 高度 > 100)
    var allDivs = document.querySelectorAll('div');
    for(var el of allDivs){
        var rect = el.getBoundingClientRect();
        if(rect.width > 500 && rect.height > 100 && (el.innerText||'').length > 100){
            results.push({type:'big_div', class:el.className.substring(0,30), top:Math.round(rect.top), text_len:(el.innerText||'').length});
        }
    }
    
    return JSON.stringify(results);
})()
'''
send(sock, {'id':1,'method':'Runtime.evaluate','params':{'expression':expr}})
r = recv(sock)
print('编辑器结构:')
print(json.loads(r)['result']['result']['value'])

sock.close()