我用 Puppeteer 把发掘金文章这步也自动化了------附 CLI 和 MCP 接口
预计阅读:5 分钟
一、视频发布自动化了,但图文这一步还是断的
MatrixMedia 之前做的事情:用 CLI 和 MCP 把视频发布变成 AI 可以直接调用的操作。n8n 流程走完,一条命令发到 7 个平台,不用人盯着。
但我自己跑这套流程的时候发现,视频那边通了,图文这边还是卡着。
写完一篇掘金文章,要打开编辑器、填标题、粘贴正文、选分类、搜标签、点发布------每次都是同一套动作,区别只是内容不同。
能不能也做成一条命令?
这就是这个版本做的事:给 MatrixMedia 加了图文发布能力,先从掘金开始。
二、CLI:新增 publish-article 子命令
视频发布用的是 publish,图文发布是一个平级的新子命令 publish-article。
最简用法:
bash
matrixmedia cli publish-article \
-p juejin \
--phone 13800138000 \
-t "我用 Puppeteer 把发掘金文章这步也自动化了" \
-f ./article.md \
--tags "前端 electron"
正文支持两种方式:传文件路径(.md 或 .txt),或者直接把内容塞进 --content。两种方式二选一,给 AI 生成的内容直接管道过来很方便。
完整参数:
scss
-p, --platform <id> 平台:juejin / jj / 掘金(当前仅支持掘金)
-t, --title <text> 文章标题(必填)
--content <text> 文章正文;与 --file 至少提供一个
-f, --file <path> Markdown 正文文件路径;与 --content 至少提供一个
--cover <path> 封面图片路径
--phone <id> 账号手机号
--category <name> 分类,默认"前端"
--tags <text> 标签,多个用空格分隔
--summary <text> 文章摘要
--publish-at <t> 定时发布,格式 "YYYY-MM-DD HH:mm:ss"
退出码和视频发布保持一致:0 成功、1 未知异常、2 参数错误、3 业务失败(比如登录态过期)。AI Agent 读退出码的逻辑不用改。
三、Puppeteer 操控掘金编辑器:两个实现细节
掘金编辑器不是普通 <textarea>,它用的是 CodeMirror。这里有两个坑。
坑一:正文不能用 page.type
CodeMirror 底层有自己的输入处理,用 Puppeteer 的 page.type() 直接输入,文字会丢、乱序,几百字的文章输进去可能只剩一半。
实际解法是走剪贴板:
javascript
async function pasteText(page, text) {
const originalClipboardText = clipboard.readText();
const modifierKey = process.platform === 'darwin' ? 'Meta' : 'Control';
try {
clipboard.writeText(text);
await page.keyboard.down(modifierKey);
await page.keyboard.press('KeyV');
} finally {
await page.keyboard.up(modifierKey).catch(() => {});
clipboard.writeText(originalClipboardText);
}
}
粘贴前把原剪贴板内容存起来,粘完还原------不污染用户的剪贴板。
坑二:标签是下拉搜索选择,不是自由输入
掘金的标签字段需要:输入关键字 → 等下拉出现 → 点击选项。直接 page.type 后回车,标签不会真正被选中,发布时就报"请选择标签"。
实现上要等下拉渲染、匹配到选项再 click():
javascript
await page.type(TAG_INPUT_SELECTOR, tag, { delay: 50 });
await page.waitForTimeout(800); // 等掘金接口返回下拉
// 在 DOM 里找到匹配项,点击
如果下拉里找不到这个标签(比如拼写问题),就退化到直接 Enter,避免整个流程卡死。
四、MCP:新增 publish_article 工具
MCP Server 里同步加了 publish_article 工具,参数结构和 CLI 对应:
typescript
{
name: 'publish_article',
description: '发布掘金文章,需要已登录掘金账号',
inputSchema: {
properties: {
platform: { type: 'string', enum: ['juejin'] },
phone: { type: 'string', description: '账号手机号' },
title: { type: 'string' },
content: { type: 'string', description: '正文内容,与 file 二选一' },
file: { type: 'string', description: 'Markdown 文件路径,与 content 二选一' },
cover: { type: 'string', description: '封面图路径' },
category: { type: 'string' },
tags: { type: 'string' },
summary: { type: 'string' },
publishAt: { type: 'string' },
},
required: ['platform', 'phone', 'title'],
}
}
接了 MCP 之后,在 Hermes 里说一句:
"把 /path/to/article.md 发到掘金,标题是'XXX',标签前端,账号 138xxxx"
Hermes 调 publish_article → 底层拉起 Puppeteer → 发布完返回结果。全程不用打开 MatrixMedia 的 GUI。
五、后面准备加的:知乎和公众号
掘金先做,主要因为我自己用、方便测试。
知乎 的图文发布流程类似,编辑器也是 CodeMirror,预计迁移成本不大。
微信公众号 相对麻烦------不是纯网页操作,需要另开 BrowserWindow 模拟登录,还有图片上传限制要处理,正在调研。
如果你用知乎或公众号发文章、有兴趣一起踩坑,欢迎到 GitHub 开 issue。
六、总结
这个版本做的事:
- 加了
publish-article子命令,支持掘金图文发布,CLI 和 MCP 都能调 - Puppeteer 操控 CodeMirror 编辑器:正文走剪贴板粘贴、标签走下拉搜索点选
- 退出码和 JSON stdout 约定不变,原来接 AI 流程的地方不用改
- 知乎和公众号在路线图上,掘金是第一个
开源地址:github.com/hanliang97/...
如果你在用 AI 工具写文章、又在做矩阵号,或者也在研究怎么用 Puppeteer 操控这类富文本编辑器,欢迎看看代码,有问题直接开 issue,中文优先。
代码对你有用的话,点个 Star,这是对开源项目最直接的支持。
字数统计:约 1650 字