从零构建 Hermes Agent ↔ CSDN MCP 自动化发布链路
CSDN 的反爬(WAF)很硬:headless Chrome 被精准拦截。Cookie 导入是最实用的绕过方案。前端变化快:CSS 选择器、弹窗逻辑随时可能变,MCP 服务的维护成本主要在适配前端更新。MCP 的价值:通过 MCP 协议,AI Agent 可以无缝获取"发布文章"这种高级能力,比让用户手动操作高效得多。Cookie 安全:Cookie 包含完整的登录凭证,务必保管好。如果泄露,在
从零构建 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.yaml 的 mcp_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参数(domcontentloaded→networkidle) - 先访问 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 一直失败。
调试发现两个问题:
-
CSS 隐藏:标题输入框的
placeholder="请输入文章标题"被 CSDN 升级改掉了,新的选择器是input.article-bar__title--input,且display: none。需要通过 JavaScript 移除display:none内联样式。 -
弹窗遮挡: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_until 从 domcontentloaded 改为 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)。
总结与经验
- CSDN 的反爬(WAF)很硬:headless Chrome 被精准拦截。Cookie 导入是最实用的绕过方案。
- 前端变化快:CSS 选择器、弹窗逻辑随时可能变,MCP 服务的维护成本主要在适配前端更新。
- MCP 的价值:通过 MCP 协议,AI Agent 可以无缝获取"发布文章"这种高级能力,比让用户手动操作高效得多。
- Cookie 安全:Cookie 包含完整的登录凭证,务必保管好。如果泄露,在 CSDN 网页端退出登录即可使旧 Cookie 失效。
这篇文章本身就是通过 Hermes Agent + CSDN MCP 发布到草稿箱的,算是"猪跑了一次"🐷
更多推荐

所有评论(0)