我用 Puppeteer 把发掘金文章这步也自动化了——附 CLI 和 MCP 接口

0 阅读4分钟

我用 Puppeteer 把发掘金文章这步也自动化了——附 CLI 和 MCP 接口

预计阅读:5 分钟


一、视频发布自动化了,但图文这一步还是断的

MatrixMedia 之前做的事情:用 CLI 和 MCP 把视频发布变成 AI 可以直接调用的操作。n8n 流程走完,一条命令发到 7 个平台,不用人盯着。

但我自己跑这套流程的时候发现,视频那边通了,图文这边还是卡着。

写完一篇掘金文章,要打开编辑器、填标题、粘贴正文、选分类、搜标签、点发布——每次都是同一套动作,区别只是内容不同。

能不能也做成一条命令?

这就是这个版本做的事:给 MatrixMedia 加了图文发布能力,先从掘金开始。


二、CLI:新增 publish-article 子命令

视频发布用的是 publish,图文发布是一个平级的新子命令 publish-article

最简用法:

matrixmedia cli publish-article \
  -p juejin \
  --phone 13800138000 \
  -t "我用 Puppeteer 把发掘金文章这步也自动化了" \
  -f ./article.md \
  --tags "前端 electron"

正文支持两种方式:传文件路径(.md.txt),或者直接把内容塞进 --content。两种方式二选一,给 AI 生成的内容直接管道过来很方便。

完整参数:

-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() 直接输入,文字会丢、乱序,几百字的文章输进去可能只剩一半。

实际解法是走剪贴板:

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()

await page.type(TAG_INPUT_SELECTOR, tag, { delay: 50 });
await page.waitForTimeout(800);  // 等掘金接口返回下拉
// 在 DOM 里找到匹配项,点击

如果下拉里找不到这个标签(比如拼写问题),就退化到直接 Enter,避免整个流程卡死。


四、MCP:新增 publish_article 工具

MCP Server 里同步加了 publish_article 工具,参数结构和 CLI 对应:

{
  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。


六、总结

这个版本做的事:

  1. 加了 publish-article 子命令,支持掘金图文发布,CLI 和 MCP 都能调
  2. Puppeteer 操控 CodeMirror 编辑器:正文走剪贴板粘贴、标签走下拉搜索点选
  3. 退出码和 JSON stdout 约定不变,原来接 AI 流程的地方不用改
  4. 知乎和公众号在路线图上,掘金是第一个

开源地址:github.com/hanliang97/…

如果你在用 AI 工具写文章、又在做矩阵号,或者也在研究怎么用 Puppeteer 操控这类富文本编辑器,欢迎看看代码,有问题直接开 issue,中文优先。

代码对你有用的话,点个 Star,这是对开源项目最直接的支持。


字数统计:约 1650 字