)
做内容运营或自托管 Agent 的同学大概率遇到过这类需求要在多个平台百家号、知乎、微博、CSDN、公众号上自动写稿发文但每个平台都要扫码登录总不能每次跑脚本都重新登录一遍。本文讲一套可落地的方案用 Edge 的 CDPChrome DevTools Protocol远程控制一个常驻、已登录的浏览器实例Playwright 通过connect_over_cdp直接接管实现登录一次、长期复用。## 核心思路正常playwright.launch()每次都是全新浏览器cookie 全空。要保留登录态关键是两点1.固定用户数据目录启动时带上--user-data-dir让所有 cookie、localStorage 落盘到同一目录2.通过 CDP 接管而非新开启动参数加--remote-debugging-port9222再用connect_over_cdp(http://127.0.0.1:9222)连上。pythonimport sysfrom playwright.sync_api import sync_playwrightCDP http://127.0.0.1:9222with sync_playwright() as p: b p.chromium.connect_over_cdp(CDP) ctx b.contexts[0] # 复用已登录的上下文 page ctx.new_page() page.goto(https://baijiahao.baidu.com/builder/rc/edit?typenews) # 此时浏览器已经是登录态无需再扫码## 启动命令含登录态保持bashmsedge.exe --remote-debugging-port9222 \ --user-data-dirC:/path/to/edge-profile \ --no-first-run --no-default-browser-checkuser-data-dir 必须固定。只要这个目录不变哪怕浏览器进程被回收重启下次连上还是原来的登录态——这是整个方案能无人值守的关键。## 填稿SPA 编辑器要等 hydrate现代富文本编辑器如百家号、公众号大多是 SPAgoto 后 DOM 还没就绪直接找 contenteditable 会失败。正确做法是轮询等正文编辑区出现pythonbody_frame Nonefor _ in range(45): for fr in page.frames: try: if fr.evaluate(“() document.body.getAttribute(‘contenteditable’)‘true’): body_frame fr; break except Exception: pass if body_frame: break time.sleep(1)正文用 keyboard.insert_text 逐段写入比 type 稳定标题先 Controla 清空再填避免和上次内容叠加。## 发布时的坑按钮被遮罩盖住百家号点发布前编辑器会跑一段检测期间一个 .bjh-btn-disable-mask 层盖住发布按钮。不处理的话点击无效、毫无反应。解决办法是发布前轮询遮罩是否消失pythoncovered page.evaluate(‘’() { const pub […document.querySelectorAll(‘button’)].find(x x.innerText.trim()‘发布’); if (!pub) return true; const r pub.getBoundingClientRect(); const top document.elementFromPoint(r.xr.width/2, r.yr.height/2); return top ? !!top.closest(‘.bjh-btn-disable-mask’) : true;}‘’)并且发布按钮要用精确文本匹配innerText.trim()发布用has-text(发布)会误点到定时发布”。## 公众号封面的从正文选择陷阱公众号编辑器不让直接拖拽上传封面必须先把图插进正文再到封面区点从正文选择。而那个按钮藏在 hover 浮层里0×0 尺寸Playwright 的.click()会因元素不稳定超时得改用 JSel.click()强制触发。## 小结- 登录态 固定--user-data-dirconnect_over_cdp别用launch()- 填稿前等 SPA hydrate正文用insert_text- 发布按钮先等遮罩消失再精确匹配文本- 平台特有交互公众号封面、百家号封面确认按上面套路兜底。把这几条封装成启动 Edge → 轮询 CDP → 跑脚本的单一命令就能做到一键多发、无人值守。