Web → 公众号草稿箱
把任意网上资料整理成带格式的微信公众号图文,存入草稿箱(不自动群发)。
前置条件
- BrowserSkill 已安装并连接浏览器(
bsk doctor全绿;扩展需手动从 Chrome Web Store 装)。 - 公众号后台
mp.weixin.qq.com可访问,账号能扫码登录(登录步骤需用户本人完成)。
完整流程
1. 抓取资料
bsk session start --name <标识> # 拿到 SESSION id(如 zmwo)
bsk session navigate --session <id> "<目标URL>"
bsk snapshot --session <id> > page.txt
bsk screenshot --session <id> --out page.png
避坑(见 references/bsk_notes.md):
- 雪球等 SPA:
navigate常因load不触发而超时(exit 4),但页面已加载——超时后直接snapshot即可。 - 全程复用同一 session:拿到
<id>后,抓取、登录、填稿都用它,不要再bsk session start第二个。 - 段永平正确雪球账号:大道无形我有型,ID
1247347556(勿混淆1290568231那位粉丝)。 - PowerShell 中文乱码:bsk 输出 UTF-8,PowerShell 默认 GBK 解码会乱码。运行 bsk 前先
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8,再| Out-File -Encoding utf8 文件.txt。
2. 整理 Markdown(由你完成)
把抓取内容整理成结构化 Markdown,并删除 AI 嫌疑文案:
- 保留层级:
#标题、>引用、-列表、**加粗**。 - 必须剔除:“数据来源:…经 BrowserSkill 抓取”“本文由 AI 整理”“抓取于…实时快照” 以及任何暴露“这是机器自动抓的/AI 写的”的句子。改成自然口吻(如“以下是今日的发言整理:”)。
- 输出两份产物:
- 最终对外 Markdown(给用户留存/预览)。
- 正文的 HTML 片段(供注入),标签限定为
h3 / blockquote / ul>li / strong / p, 含**加粗**的地方用<strong>。不要出现<script>、内联style。
3. 登录公众号并清场
- 复用步骤 1 的 session(不要新开),
bsk session navigate --session <id> "https://mp.weixin.qq.com"进入后台首页。 - 提示用户扫码登录(这一步必须用户本人完成,你无法代填)。
- 登录后确认:用
bsk snapshot检查页面是否出现账号名(如「禾田吵」),确认登录态。 - 进入编辑器:点左侧「图文消息 → 新建图文」,或
navigate到编辑器 URL (形如https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&lang=zh_CN&token=<token>,token从登录后页面 URL 的token=参数取得)。 - 关闭弹窗:
bsk evaluate --session <id> "$(cat scripts/close_popups.js)"(常见如「小店返佣」推广卡,点「稍后再说」)。
4. 填写标题 + 正文
标题框是「可见 contenteditable DIV + 隐藏 textarea」双 DOM,必须两者都写(见 references/prose_mirror_schema.md):
python scripts/fill_template.py scripts/fill_title.js "window.__TITLE__" "段永平今日发言(2026-07-09)" /tmp/fill_title_filled.js
bsk evaluate --session <id> "$(cat /tmp/fill_title_filled.js)"
正文用公众号 ProseMirror 视图程序化构建(保留层级格式):
# 把第 2 步的 HTML 片段写到 body.html(UTF-8),再用 @file: 交给 fill_template.py 安全注入
python scripts/fill_template.py scripts/build_body.js "window.__BODY_HTML__" "@file:body.html" _build_body_filled.js
bsk evaluate --session <id> "$(cat _build_body_filled.js)"
输出文件
_build_body_filled.js放在当前工作目录即可(bsk只读$(cat ...)的内容,不读路径)。 严禁用$(cat body.html)直接当参数——shell 会把长 HTML 拆成多词破坏注入。fill_template.py用json.dumps生成合法 JS 字符串,自动转义引号/换行。
5. 校验 + 存草稿
bsk evaluate --session <id> "$(cat scripts/verify_body.js)" > verify.json
# 解析 verify.json:检查 counts.heading/blockquote/list 非零,hasTrace 必须为 false
bsk evaluate --session <id> "document.querySelectorAll('button') 中文本为'保存为草稿'的.click()"
存草稿后向用户确认:
- 封面图:公众号图文发文必须配封面。当前版本封面菜单常只有「从正文选/从图片库选/扫码上传/AI 配图」,
「文字封面」入口未必存在;图片库多已下线;bsk 无法自动上传本地文件到封面的
input[type=file]。 → 请用户手动上传一张图,或选用 AI 配图;之后才能「发表」。 - 原创:声明原创需公众号已完成微信实名认证;未实名则声明入口会卡住。不声明可直接存草稿/发表。
完成后 bsk session stop <id> 关闭 Agent Window。
关键脚本
| 脚本 | 作用 | 占位符 |
|------|------|--------|
| scripts/fill_template.py | 通用注入器:把字符串安全替换进模板 JS 的占位符 | 参数传入 |
| scripts/build_body.js | 公众号正文 ProseMirror 程序化构建(HTML→富文本) | window.__BODY_HTML__ |
| scripts/fill_title.js | 标题双 DOM 写入(可见 DIV + 隐藏 textarea) | window.__TITLE__ |
| scripts/close_popups.js | 隐藏所有 modal/mask,关闭 AI 配图等弹窗 | 无 |
| scripts/verify_body.js | 校验结构(heading/blockquote/list 计数)+ AI 痕迹检测 | 无 |
深度参考
- 公众号 ProseMirror schema 规则、双 DOM 标题、加粗 mark:
references/prose_mirror_schema.md - BrowserSkill 安装/命令/中文乱码/evaluate 传参:
references/bsk_notes.md
调用约定(必看)
- 所有
bsk evaluate的长 JS 都先写进.js文件,再用"$(cat file.js)"整体传入, 避免 PowerShell/Shell 对$、反引号、空格的转义破坏。 - 注入本地 HTML/标题时一律用
scripts/fill_template.py,不要手工拼接字符串。 - 文件编码全程 UTF-8;中文内容直接写在 JS 文件里无需额外编码。
微信扫一扫