#!/usr/bin/env python3
"""百家号文章填充 v12 - 清理后填充"""
import socket, json, urllib.request, urllib.parse, time

HOST = 'localhost'
PORT = 9223

def get_ws_connection():
    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)
    return sock

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')

print("=" * 50)
print("百家号文章填充 v12 - 清理后填充")
print("=" * 50)

sock = get_ws_connection()

# Step 1: 清理现有的错误内容
print("\n[Step 1] 清理现有内容...")
clean_expr = '''
(function(){
    var box = document.querySelector('.input-box');
    if(box){
        box.innerHTML = '';
    }
    return 'cleared';
})()
'''
send(sock, {'id':1,'method':'Runtime.evaluate','params':{'expression':clean_expr}})
r = recv(sock)
print(f"  清理结果: {r}")

time.sleep(1)

# Step 2: 填充标题到 .input-box
print("\n[Step 2] 填充标题...")
title = "山东第二医科大学：山东省重点大学还是普通本科？"
title_expr = f'''
(function(){{
    var box = document.querySelector('.input-box');
    if(box){{
        box.innerText = "{title}";
        box.dispatchEvent(new Event('input', {{bubbles: true}}));
        box.dispatchEvent(new Event('change', {{bubbles: true}}));
    }}
    return 'title set';
}})()
'''
send(sock, {'id':2,'method':'Runtime.evaluate','params':{'expression':title_expr}})
r = recv(sock)
print(f"  标题设置: {r}")

time.sleep(1)

# Step 3: 填充正文到 UEditor iframe
print("\n[Step 3] 填充正文到 UEditor...")
body = """山东第二医科大学是山东省重点大学吗？这是许多考生和家长关心的问题。本文将从学校历史、办学层次、学科实力等方面进行全面分析。

## 学校历史与更名

山东第二医科大学前身为潍坊医学院，创建于1951年。经过70多年的发展，学校于2023年经教育部批准更名为山东第二医科大学。这意味着学校已经升格为本科层次的医学院校。

## 办学层次

作为山东省重点建设的医学院校，山东第二医科大学属于：
- 山东省属重点大学
- 山东省应用型人才培养特色名校
- 国家"卓越医生教育培养计划"试点高校

## 学科实力

学校拥有多个省级重点学科和重点实验室，在医学影像学、临床医学、护理学等专业具有较强实力。

## 结论

山东第二医科大学作为山东省重点建设的医学院校，在办学层次和学科实力方面都具有一定优势，是考生值得考虑的选择。"""

body_expr = f'''
(function(){{
    var iframe = document.querySelector('#ueditor_0');
    if(iframe){{
        var doc = iframe.contentDocument || iframe.contentWindow.document;
        doc.body.innerHTML = `{body}`.replace(/\\n/g, '<br>');
        return 'body set: ' + doc.body.innerText.length + ' chars';
    }}
    return 'iframe not found';
}})()
'''
send(sock, {'id':3,'method':'Runtime.evaluate','params':{'expression':body_expr}})
r = recv(sock)
print(f"  正文设置: {r}")

time.sleep(2)

# Step 4: 验证结果
print("\n[Step 4] 验证...")
verify_expr = '''
(function(){
    var r = {title: '', body: '', inputBox: '', iframeBody: ''};
    var box = document.querySelector('.input-box');
    if(box) r.inputBox = box.innerText.substring(0, 100);
    var iframe = document.querySelector('#ueditor_0');
    if(iframe){
        var doc = iframe.contentDocument || iframe.contentWindow.document;
        r.iframeBody = doc.body.innerText.substring(0, 100);
    }
    return JSON.stringify(r);
})()
'''
send(sock, {'id':4,'method':'Runtime.evaluate','params':{'expression':verify_expr}})
r = recv(sock)
result = json.loads(r)['result']['result']['value']
print(f"  验证结果: {result}")

sock.close()
print("\n" + "=" * 50)
print("完成！请检查页面显示是否正确。")
print("=" * 50)
