# -*- coding: utf-8 -*-
"""
修复版：使用简单方式填入文章内容
"""
import sys, socket, json, base64, urllib.request, time
sys.stdout.reconfigure(encoding='utf-8', errors='replace')

HOST = 'localhost'
PORT = 9222

def get_first_page():
    pages = json.loads(urllib.request.urlopen(f'http://{HOST}:{PORT}/json', timeout=5).read())
    for p in pages:
        if p.get('type') == 'page':
            return p
    return None

def ws_connect(url):
    import urllib.parse
    parsed = urllib.parse.urlparse(url)
    sock = socket.create_connection((parsed.hostname, parsed.port or 80), timeout=10)
    key = 'dGhlIHNhbXBsZSBub25jZQ=='
    hs = 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(hs.encode())
    resp = b''
    while b'\r\n\r\n' not in resp:
        resp += sock.recv(4096)
    return sock

def send_frame(sock, data):
    data = data.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
    else:
        hdr = bytes([0x81, 0xFF]) + n.to_bytes(8, 'big') + mask
    sock.send(hdr + bytes(data[i] ^ mask[i % 4] for i in range(n)))

def recv_frame(sock):
    def rx(n):
        buf = b''
        while len(buf) < n:
            buf += sock.recv(n - len(buf))
        return buf
    h = rx(2)
    n = h[1] & 0x7f
    if n == 126:
        n = int.from_bytes(rx(2), 'big')
    elif n == 127:
        n = int.from_bytes(rx(8), 'big')
    return rx(n).decode('utf-8')

_mid = 0
def cdp_call(sock, method, params=None):
    global _mid
    _mid += 1
    msg = {'id': _mid, 'method': method}
    if params:
        msg['params'] = params
    send_frame(sock, json.dumps(msg))
    sock.settimeout(60)
    while True:
        raw = recv_frame(sock)
        obj = json.loads(raw)
        if obj.get('id') == _mid:
            return obj.get('result', {})

# 文章内容 - 用简单文字避免编码问题
TITLE = '考公P图诈胡事件反转'

# 构建正文内容
paragraphs = [
    ('0.05分的差距，有人选择全力以赴，有人选择P图骗人。', 'normal'),
    ('', 'divider'),
    ('近日，省考第一P分诈胡的话题冲上热搜第一，引发了全网热议。', 'normal'),
    ('', 'normal'),
    ('去年12月，2026届硕士生李明化名报考了广东省公务员考试中的一个法官助理岗位，该岗位仅招录一人。笔试成绩公布后，一名自称该岗位笔试第一的网友发出了自己的成绩单：79.7分。', 'normal'),
    ('', 'normal'),
    ('李明的笔试成绩是65.25分。看着对方那近乎完美的分数，李明瞬间陷入绝望。按照笔试面试各占50%的规则，他需要在面试中高出对方15分才能翻盘，这几乎是不可能的任务。', 'normal'),
    ('', 'normal'),
    ('然而，当3月7日入围体检的人选揭晓时，李明惊讶地发现，对方的笔试成绩只比自己高0.05分。', 'normal'),
    ('', 'normal'),
    ('那张79.7分的成绩单，是P出来的。', 'highlight'),
    ('', 'divider'),
    ('01 一场精心策划的心理战', 'heading'),
    ('', 'normal'),
    ('李明回忆，查到自己的65.25分时，心情颇为复杂。参考往年情况，这个分数并不理想。在三名面试入围者中，他排名第二，但岗位仅招录一人。他正准备报名培训班，为接下来的面试做冲刺。', 'normal'),
    ('', 'normal'),
    ('这份平静持续了不到五个小时。', 'normal'),
    ('', 'normal'),
    ('当晚，李明的室友转给他一篇网帖。发帖者自称是该岗位笔试第一名，正在寻找同岗位考生，并附上一张成绩单截图：行测84.4分，申论75分，笔试成绩为79.7分。', 'normal'),
    ('', 'normal'),
    ('近15分的笔试差距，让李明第一时间判断面试翻盘无望。', 'normal'),
    ('', 'normal'),
    ('更令人细思极恐的是，这名自称第一名的考生通过私信联系上李明后，不断强调自己的投入与处境。', 'normal'),
    ('', 'normal'),
    ('这段被李明形容为心理战的交流，对他的备考决策产生了明显影响。面对悬殊的分差，他一度心如死灰，甚至萌生放弃面试的念头。', 'normal'),
    ('', 'normal'),
    ('最终，在朋友鼓励下，他决定参加面试，但没有报名培训班，仅做了简单准备。', 'normal'),
    ('', 'divider'),
    ('02 真相大白：0.05分的差距', 'heading'),
    ('', 'normal'),
    ('3月7日，李明到广州参加面试，结识了同岗笔试第三名陈磊化名。交谈中得知，陈磊此前也通过相同网帖与第一名有过交流，并添加了对方微信。', 'normal'),
    ('', 'normal'),
    ('当天，该岗位公布了笔试、面试成绩及综合排名。入围体检人选的笔试成绩是65.3分，而非他们一直以为的79.7分。', 'normal'),
    ('', 'normal'),
    ('愤怒与懊悔瞬间涌上李明心头。', 'normal'),
    ('', 'normal'),
    ('我们真实的笔试分差只有0.05分，按笔面试各占50%折算后，综合分差只有0.025分，完全是面试定输赢。如果我早知道是这样的情况，一定会全力以赴准备面试。', 'highlight'),
    ('', 'normal'),
    ('发布网帖的第一名在面试当天晚上删除了陈磊的微信，次日重新添加并道歉：实在对不起，我确实挺卑劣的。', 'normal'),
    ('', 'normal'),
    ('相关材料已被整理成举报信寄送至招录单位。广州市中级人民法院工作人员表示，已关注到相关情况，目前正在处理。', 'normal'),
    ('', 'divider'),
    ('03 网友评论：不仅是道德问题', 'heading'),
    ('', 'normal'),
    ('事件曝光后，网友评论炸开了锅。', 'normal'),
    ('', 'normal'),
    ('有人直指这是人品问题：P的是分数，丢的是人品。', 'normal'),
    ('', 'normal'),
    ('有人分析这种行为背后的心理：上岸执念吃光了做人底线。', 'normal'),
    ('', 'normal'),
    ('律师表示，这件事不仅是道德问题，该考生可能已涉嫌违法。', 'normal'),
    ('', 'divider'),
    ('04 学业规划视角：这场P图风波给所有考生的警示', 'heading'),
    ('', 'normal'),
    ('作为一名关注学业规划的观察者，我从这起事件中看到了更深层的启示。', 'normal'),
    ('', 'divider'),
    ('中考高考：看不见的同辈压力', 'heading'),
    ('', 'normal'),
    ('在中考、高考的备考过程中，虽然我们看不到所有人的具体分数，但P图心态无处不在。', 'normal'),
    ('', 'normal'),
    ('真正的强者，从不靠贬低他人来抬高自己。', 'normal'),
    ('', 'divider'),
    ('考研复试：信息孤岛中的心理博弈', 'heading'),
    ('', 'normal'),
    ('考研复试与此事件最为相似。考生同样只能查到自己的分数，不知道竞争对手的实际水平。', 'normal'),
    ('', 'normal'),
    ('0.05分的差距告诉我们：在最终结果出来前，任何信息都可能是假的，唯一能相信的是自己的准备。', 'normal'),
    ('', 'divider'),
    ('国央企就业：背调时代已来', 'heading'),
    ('', 'normal'),
    ('随着征信体系和背调机制的完善，求职市场正在发生深刻变化。一次P图可能毁掉整个职业生涯的起点。', 'normal'),
    ('', 'normal'),
    ('在背调技术日益发达的今天，诚信才是最长远的规划。', 'normal'),
    ('', 'divider'),
    ('05 结语：比上岸更重要的事', 'heading'),
    ('', 'normal'),
    ('那位第一名在道歉时说：我确实挺卑劣的。', 'normal'),
    ('', 'normal'),
    ('这句话，值得所有正在备考的人深思。', 'normal'),
    ('', 'normal'),
    ('0.05分的差距，有人选择全力以赴准备面试，有人选择P图骗人。这两种选择，决定了两个人的不同结局。', 'normal'),
    ('', 'normal'),
    ('考公、考研、高考、求职，每一次考试都是一场修行。分数决定了你能走多快，而人品决定了你能走多远。', 'normal'),
    ('', 'normal'),
    ('也许，真正的上岸，不是考上一个岗位、一所学校，而是在面对0.05分的微小差距时，依然能守住做人的底线。', 'normal'),
    ('', 'divider'),
    ('参考资料：中国新闻周刊、光明网、中国青年网等多家媒体报道', 'normal'),
]

# 构建纯文本内容
content_lines = []
for text, style in paragraphs:
    if style == 'divider':
        content_lines.append('')
        content_lines.append('────────────────────────────────────')
        content_lines.append('')
    elif style == 'heading':
        content_lines.append('')
        content_lines.append(text)
        content_lines.append('')
    elif style == 'highlight':
        content_lines.append('▶ ' + text)
        content_lines.append('')
    elif style == 'list':
        content_lines.append('• ' + text)
    else:
        content_lines.append(text)

content = '\n'.join(content_lines)

page = get_first_page()
sock = ws_connect(page['webSocketDebuggerUrl'])

# 填标题
print('填标题...')
result = cdp_call(sock, 'Runtime.evaluate', {'expression': '''
var title = document.querySelector("#title");
if(title) {
    title.value = "''' + TITLE + '''";
    title.dispatchEvent(new Event("input", {bubbles: true}));
    "OK";
} else {
    "FAIL";
}
'''})
print('标题结果:', result)

# 填正文
print('填正文...')
result = cdp_call(sock, 'Runtime.evaluate', {'expression': '''
var editor = document.querySelector(".ProseMirror");
if(editor) {
    editor.innerText = "''' + content.replace('"', '\\"').replace('\n', '\\n') + '''";
    editor.dispatchEvent(new Event("input", {bubbles: true}));
    "OK";
} else {
    "FAIL";
}
'''})
print('正文结果:', result)

sock.close()
print('完成！')
