Web → 公众号草稿箱(纯 API 版)
把任意网上资料整理成带格式的微信公众号图文,通过 draft.add 接口存入草稿箱。
完全不依赖浏览器(无需 bsk、无需扫码),适合无人值守自动化。
前置条件
- 公众号已完成微信认证(草稿箱接口仅对认证号开放)。
- 已配置凭证(二选一):
- 环境变量
MP_APPID/MP_APPSECRET;或 - 本地文件
~/.workbuddy/mp_credentials.json:{"appid":"...","secret":"..."} - 公众号「设置与开发 → 基本配置 → IP白名单」已加入调用方出口 IP
(否则cgi-bin/token返回errcode 40164)。云端跑的自动化要确认其出口 IP 也在白名单。
完整流程
0. 启动浏览器与插件(抓取前必做,确保自动化可无人值守)
发布虽是纯 API,但抓取雪球/网页常用 BrowserSkill(bsk)驱动本机 Edge。
若运行时浏览器没连上 daemon,bsk session start 会失败。先用本技能自带脚本把
浏览器和 BrowserSkill 扩展自动拉起:
python scripts/launch_browser.py
# 输出「>> 浏览器已连上 daemon」即表示 BrowserSkill 扩展已就绪,随后抓取步骤再 bsk session start
脚本逻辑:探测 bsk status → 未连上则启动本机 Edge(扩展随浏览器自启并自动连
daemon)→ 轮询等待连上。连上返回 0;仍连不上返回 3 并提示人工确认扩展状态。
会话创建(bsk session start)由抓取步骤独立完成,本脚本不做(避免阻塞)。
1. 抓取资料(用上面建好的会话)
抓取雪球/网页可用 BrowserSkill(bsk)或直接 WebFetch,取决于来源。
雪球段永平正确账号:大道无形我有型,ID 1247347556(勿混淆 1290568231 那位粉丝)。
抓取这一步与发布解耦——发布走 API,不需要保持浏览器登录态(浏览器只在抓取阶段用)。
2. 整理 Markdown(由你完成)
把抓取内容整理成结构化 Markdown,并删除 AI 嫌疑文案:
- 保留层级:# 标题、> 引用、- 列表、1. 有序列表、**加粗**、*斜体*、代码、代码块。
- 必须剔除:“数据来源:…经 BrowserSkill 抓取”“本文由 AI 整理”“抓取于…实时快照”
以及任何暴露“这是机器自动抓的/AI 写的”的句子。改成自然口吻(如“以下是今日的发言整理:”)。
3. 发布到草稿箱(核心,纯 API)
# 从 Markdown 文件发布
python scripts/draft_api.py --title "段永平今日发言(2026-07-09)" --md 发言.md
# 或从字符串发布(dry-run 只输出 HTML 不调用接口,方便调试格式)
python scripts/draft_api.py --title "标题" --content "# 正文
> 引用" --dry-run
脚本内部流程:
1. md_to_html() 把 Markdown 转成微信允许的 HTML(h1-h3/p/blockquote/ul/ol/li/strong/em/code/img/a/hr/br)。
2. 读凭证 → cgi-bin/token 拿 access_token。
3. 封面:无 --cover 时自动生成渐变 PNG 并 material/add_material 上传,缓存 thumb_media_id
(同级 .cover_media_id 文件,永久素材可复用);有 --cover 则用指定图。
4. cgi-bin/draft/add 建草稿,输出 SUCCESS media_id=... 即入草稿箱(未群发)。
5. 自检:立即用 cgi-bin/draft/get 把刚建的草稿读回来,确认标题/正文已落库,打印
>> 自检通过:草稿箱已存在《xxx》。读不回会打印自检警告,便于发现"假成功"。
4. 校验与兜底
- 成功:打印
media_id+ 自检通过,草稿出现在公众号后台「草稿箱」。 - 失败按 errcode 提示(见
references/api_notes.md): 40164→ IP 白名单没加;48001→ 账号未认证;40013/40125→ AppID/Secret 错或已被重置。- 兜底建议:若 API 不可用(白名单未配/凭证缺失),把整理好的 Markdown 存到本地
段永平发言_YYYY-MM-DD.md并标记“待发布”,不阻断上游抓取任务。
关键脚本
| 脚本 | 作用 |
|---|---|
scripts/draft_api.py |
纯 API 发布器:Markdown→HTML、拿 token、上传封面、draft.add、发布后自检 |
scripts/launch_browser.py |
抓取前自启动 Edge + BrowserSkill 扩展,确保 daemon 连上并返回会话 id |
深度参考
- 微信草稿箱 API、IP 白名单、封面必填、errcode 速查:
references/api_notes.md
调用约定(必看)
- 凭证绝对不要写进技能文件或上传到 SkillHub 市场;只走环境变量
MP_APPID/MP_APPSECRET,
或本地~/.workbuddy/mp_credentials.json(用户私有目录,不上传)。 - 正文图片用外部 URL 多数账号会被过滤,纯文字稿不受影响;如需插图,先
material/add_material上传再引用返回的 weixin URL。 - 文件编码全程 UTF-8。
scripts/下所有脚本均不含任何 appid/appsecret 明文。