从零构建 Hermes Agent ↔ CSDN MCP 自动化发布链路

背景

我使用 Hermes Agent 作为日常 AI 助手,它运行在 WSL(Windows Subsystem for Linux)上,通过飞书与我交互。Hermes 支持 MCP(Model Context Protocol),可以扩展各种工具能力。

一直以来写技术博客的流程是:Hermes 帮我生成文章 → 我复制 → 打开 CSDN 编辑器 → 粘贴 → 发布。这个过程既繁琐又容易出错(漏了格式、忘了标签)。自然而然的,我想到:为什么不直接让 Hermes 帮我发布到 CSDN?

本文记录了我从发现 CSDN MCP、到配置部署、再到解决各种奇葩问题的全过程。


第一步:找到合适的 CSDN MCP

在 GitHub 上搜索 “csdn mcp server”,找到两个主流方案:

项目 类型 特点
luolaihua/csdn-mcp Python + FastMCP 扫码登录,可持久化 Cookie
CorgiBoyG/mcp-server-csdn Java 手动填 Cookie 字符串

Python 方案启动成本低、环境干净,我选择了前者。

安装过程很简单:

git clone https://github.com/luolaihua/csdn-mcp
# 项目本身只有 3 个文件,核心是 server.py
# 依赖:fastmcp + playwright

第二步:配置 Hermes 加载 CSDN MCP

~/.hermes/config.yamlmcp_servers 段添加:

csdn:
  command: /path/to/fastmcp
  args:
    - run
    - /path/to/csdn-mcp/server.py:mcp
  timeout: 120

然后重启 gateway 使配置生效:

hermes gateway run --replace

验证工具是否发现成功:

hermes mcp list  # csdn 应显示 ✓ enabled
hermes mcp test csdn  # 应显示 4 个工具

第三步:登录 CSDN(最折腾的部分)

csdn-mcp 默认使用微信扫码登录:调用 csdn_login → 无头浏览器打开 CSDN 登录页 → 显示二维码 → 等待用户扫码。

结果翻车了。

坑 1:缺少系统依赖

Playwright 需要 libnspr4 等系统库,WSL 默认没装:

sudo apt-get install -y libnspr4 libnss3 libatk1.0-0 libatk-bridge2.0-0 \
  libcups2 libdrm2 libdbus-1-3 libxkbcommon0 libxcomposite1 libxdamage1 \
  libxrandr2 libgbm1 libpango-1.0-0 libcairo2 libasound2

坑 2:CSDN WAF 拦截无头浏览器

装好依赖后,Playwright 可以启动了。但 CSDN 的 Web 应用防火墙(WAF)检测到 headless Chrome,直接返回 net::ERR_EMPTY_RESPONSE,页面完全打不开。

尝试了各种方案:

  • 更换 wait_until 参数(domcontentloadednetworkidle
  • 先访问 CSDN 首页积累 Cookie 再跳转登录页
  • 安装 Xvfb 用非无头模式
  • curl_cffi 模拟真实浏览器

curl_cffi 可以绕过 WAF 拿到 200 OK 的页面,但 CSDN 登录页的二维码是微信 SDK 动态渲染的(res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js),纯 HTTP 请求拿不到内容。

最终方案:放弃扫码登录,改用已登录浏览器的 Cookie。

// 在已登录 CSDN 的 Windows Chrome 中按 F12 → Console
document.cookie
// 复制输出的字符串,发给 Hermes

通过解析 Cookie 字符串并保存为 Playwright 格式,成功绕过了 WAF 和扫码的限制。

坑 3:新手引导弹窗遮挡编辑器

Cookie 导入成功后,csdn_check_login 可以确认登录,但 csdn_publish 一直失败。

调试发现两个问题:

  1. CSS 隐藏:标题输入框的 placeholder="请输入文章标题" 被 CSDN 升级改掉了,新的选择器是 input.article-bar__title--input,且 display: none。需要通过 JavaScript 移除 display:none 内联样式。

  2. 弹窗遮挡:CSDN 编辑页有一个新手引导弹窗 .beginnerGuide-box.show-beginnerGuide-box,遮挡了发布按钮和关键表单。也需要通过 JS 移除。

解决方法是在每次加载编辑器页面后执行:

// 移除新手引导弹窗
document.querySelectorAll('.beginnerGuide-box').forEach(el => el.remove());

// 恢复标题输入框显示
document.querySelectorAll('input[style*="display: none"]').forEach(el => {
  el.style.display = '';
});

同时将 wait_untildomcontentloaded 改为 networkidle,确保 SPA 完全加载后再操作。

第四步:最终链路打通

经过以上修复,完整的发布链路为:

Hermes Agent (飞书)
    ↓ MCP 协议(stdio)
csdn-mcp server.py (FastMCP)
    ↓ Playwright 浏览器自动化
Headless Chrome (已注入 Cookie)
    ↓ 自动登录、填标题、写内容、点发布
CSDN 编辑器 (editor.csdn.net/md/)

关键文件结构:

文件 用途
~/.hermes/config.yaml MCP Server 注册配置
~/.hermes/csdn_cookies.json 持久化 Cookie
csdn-mcp/server.py MCP 服务端核心逻辑

使用效果

现在只需要在飞书上说一句:

“帮我把这段 Markdown 发布到 CSDN”

Hermes 就会自动完成从内容填写到草稿箱保存的全流程。如果确认无误,还可以直接正式发布(draft=false)。


总结与经验

  1. CSDN 的反爬(WAF)很硬:headless Chrome 被精准拦截。Cookie 导入是最实用的绕过方案。
  2. 前端变化快:CSS 选择器、弹窗逻辑随时可能变,MCP 服务的维护成本主要在适配前端更新。
  3. MCP 的价值:通过 MCP 协议,AI Agent 可以无缝获取"发布文章"这种高级能力,比让用户手动操作高效得多。
  4. Cookie 安全:Cookie 包含完整的登录凭证,务必保管好。如果泄露,在 CSDN 网页端退出登录即可使旧 Cookie 失效。

这篇文章本身就是通过 Hermes Agent + CSDN MCP 发布到草稿箱的,算是"猪跑了一次"🐷

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐