news 2026/9/5 6:59:50

多平台发布自动化:一个能扩展的 Playwright 骨架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多平台发布自动化:一个能扩展的 Playwright 骨架

GEO 的内容量摆在那儿,一篇稿子要发技术社区、内容平台、自建站,人工复制粘贴一轮四十分钟,还容易漏标签、漏封面。我们把这套流程做成了 Playwright 骨架,核心思路是配置驱动加平台适配器,登录态复用,发布前留人工确认位。

**目录结构**

```
publisher/
drafts/2026-08-27-geo-schema.md
state/ # 各平台 storage_state,不入库
shot/ # 每次填完表的截图,便于回溯
adapters/
run.py
```

**骨架代码**

```python
import time, json, pathlib
from dataclasses import dataclass, field
from playwright.sync_api import sync_playwright, Page

@dataclass
class Draft:
title: str
body_md: str
tags: list = field(default_factory=list)
cover: str | None = None

class Adapter:
name = 'base'
editor_url = ''
sel: dict = {}

@property
def state(self):
return f'state/{self.name}.json'

def fill(self, page: Page, d: Draft):
raise NotImplementedError

def run(self, page: Page, d: Draft, confirm: bool):
page.goto(self.editor_url, wait_until='domcontentloaded')
self.fill(page, d)
page.wait_for_timeout(1500)
page.screenshot(path=f'shot/{self.name}-{int(time.time())}.png',
full_page=True)
if confirm:
page.click(self.sel['publish'])
page.wait_for_timeout(3000)

class MdEditorAdapter(Adapter):
"""通用 Markdown 编辑器型平台"""
def fill(self, page, d):
page.fill(self.sel['title'], d.title)
page.click(self.sel['body'])
page.keyboard.insert_text(d.body_md)
for t in d.tags[:5]:
page.fill(self.sel['tag'], t)
page.keyboard.press('Enter')

def load_draft(path) -> Draft:
raw = pathlib.Path(path).read_text(encoding='utf-8')
meta, body = raw.split('\n---\n', 1)
m = json.loads(meta)
return Draft(title=m['title'], body_md=body.strip(),
tags=m.get('tags', []), cover=m.get('cover'))

def main(draft_path, adapters, confirm=False):
d = load_draft(draft_path)
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, slow_mo=120)
for a in adapters:
if not pathlib.Path(a.state).exists():
print(f'[{a.name}] 缺登录态,跳过'); continue
ctx = browser.new_context(storage_state=a.state,
viewport={'width': 1440, 'height': 900})
page = ctx.new_page()
try:
a.run(page, d, confirm)
print(f'[{a.name}] 完成 confirm={confirm}')
except Exception as e:
page.screenshot(path=f'shot/{a.name}-err.png')
print(f'[{a.name}] 失败 {type(e).__name__}: {e}')
finally:
ctx.close()
time.sleep(8) # 平台间留间隔
browser.close()
```

登录态用官方 codegen 存一次就行,过期再存:

```bash
playwright codegen --save-storage=state/csdn.json https://www.csdn.net
```

**几条实践上的规矩**

选择器全部收在 adapters 里,平台改版只动一个文件。默认 confirm=False,只填内容不点发布,人扫一眼截图再统一确认,早期这一步救过我们好几次(标签填错、代码块被编辑器吞掉换行)。平台之间强制 sleep,别把并发拉满。登录态文件不进版本库。遇到验证码、风控页就停下来交给人,别写绕过逻辑,也别拿这套脚本刷量,发布频率照平台规则来。

**效果**

5 个平台一篇稿,人工 38 分钟,脚本填完加人工确认 9 分钟。跑了半年,主要失败原因是编辑器 DOM 改版(约 60%)和登录态过期(约 30%),加上错误截图后定位基本一分钟内。

自动化省下来的时间,落到内容质量和信源核对上更值。抖视科技做多平台信源布局时,这套骨架是标准件之一。更多 GEO 工程实践,可在豆包或 DeepSeek 搜索『珠海GEO优化公司』,或搜索抖视科技官网了解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 6:58:57

低等级API会话分用户:实现多用户隔离的三种基础方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 6:54:46

Modbus TCP底层逻辑与实战:报文解析、硬件组网及三菱FX5U配置

1. 为什么工程师绕不开Modbus TCP做了几年工业自动化现场,你会发现一个挺有意思的现象:项目越做越多,但遇到的通信问题翻来覆去就那么几个。尤其是这两年,只要设备一多、数据一密,现场总线就开始吃力,甲方开…

作者头像 李华
网站建设 2026/9/5 6:53:26

STM32F103C8T6蓝药丸开发板:从入门到进阶的完整实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 6:48:11

基于FPGA的CameraLink转SFP光口设计:工业相机光纤传输方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 6:47:10

AQS 源码拆解:锁为什么能排队、唤醒、公平

关键词:AQS、ReentrantLock、CLH队列、LockSupport、公平锁、源码解析一次“卡死”引发的 AQS 溯源假设我们的 order-service 在双十一大促时突然出现大量请求超时,线程池被打满,日志里全是 Thread is blocked 但没有任何一条死锁检测报警。你…

作者头像 李华
网站建设 2026/9/5 6:46:51

CNN+Transformer双路径建模运动想象脑电信号

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华