ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

硬核!用Spring Boot + Spring AI + MCP打造全自动CSDN发贴机器人,程序员终于可以躺平了

硬核!用Spring Boot + Spring AI + MCP打造全自动CSDN发贴机器人,程序员终于可以躺平了 1. 从手动搬运到自动草稿这个机器人到底解决什么问题如果你在 CSDN 写技术文章大概率经历过这套流程本地 Markdown 写完了打开浏览器登录新建文章把正文粘进去然后一张张上传配图再手动敲标签、选分类最后预览一遍才敢点发布。单篇可能十分钟但如果你一周要发三五篇这些重复动作加起来就是实打实的时间黑洞。我这次要拆解的方案是用 Spring Boot Spring AI MCP 搭一个「自动发帖机器人」你在本地把文章写好机器人负责把 Markdown 正文、图片、标题、标签整理成 CSDN 草稿你只需要最后确认发布。它不是一个替你写水文的外挂而是一个把「搬运 排版 填表」这三件体力活接过去的自动化管道。适合谁看有 Java/Spring Boot 基础、想入门 MCP 工具调用的后端同学已经在用 Spring AI 但不知道怎么接外部平台 API 的开发者以及被日更折磨、想用工程手段省时间的博主。核心检索词就三个Spring Boot 做调度与装配、Spring AI 做模型调用、MCP 做工具注册与执行。下面从环境准备一路走到端到端验证配置和代码都可以直接抄。2. TaoToken 前置统一 Key 与 API 通道怎么配在写 MCP 工具之前先把模型调用这条链路打通。Spring AI 默认走 OpenAI 风格的接口我们只需要把 base-url 和 api-key 指向统一通道即可。我用 TaoToken 的原因是它把模型对话、coding plan、API Keys 管理放在一个控制台里换模型时不用改一堆环境变量对本地调试和后续接 Agent 都省事。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 Key。API 基地址用 https://taotoken.net/api 注意这个地址后面不加任何查询参数Spring AI 的base-url就填它。需要提前准备好的三样东西一个可用的 API Key在控制台 API Keys 页面生成形如sk-开头模型名称比如对话模型填你控制台里开通的那个本地 JDK 17 和 MavenSpring Boot 3.x 对 JDK 版本有要求提示Key 不要写进application.yml提交到 Git。用环境变量注入本地用 IDE 的 Run Configuration 配线上用容器环境变量。如果你后面要长期跑编码类 Agent 任务可以顺带看下 Coding Plan 页面把额度规划清楚只是验证模型连通性的话模型对话页面就够用了。控制台地址是 https://taotoken.net/console API Keys 管理在 https://taotoken.net/api-keys 。3. 可复制配置application.yml 与 MCP 工具注册骨架3.1 application.yml 完整配置先给一份可以直接跑的配置。关键点是spring.ai.openai这一段base-url 指向 TaoToken 的 API 地址api-key 从环境变量读。server: port: 8080 spring: application: name: csdn-auto-poster ai: openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: ${TAOTOKEN_MODEL:gpt-4o-mini} temperature: 0.7 datasource: url: jdbc:postgresql://localhost:5432/autopost username: postgres password: ${DB_PASSWORD:postgres} jpa: hibernate: ddl-auto: update mcp: server: name: csdn-poster-server version: 1.0.0 sse-endpoint: /mcp/sse csdn: cookie: ${CSDN_COOKIE} draft-api: https://blog.csdn.net/phoenix/web/v1/article/draftcsdn.cookie是你登录 CSDN 后浏览器里的会话凭证用于调用草稿接口。这里只做草稿写入不直接发布避免误操作。3.2 MCP 工具注册骨架MCP 的核心是「把能力注册成工具让模型按需调用」。下面是一个最小可用的工具注册类用 Spring AI 的Tool注解暴露两个方法一个生成文章元信息标题、标签、摘要一个写入 CSDN 草稿。Component public class CsdnPosterTools { private final ChatClient chatClient; private final CsdnDraftClient draftClient; public CsdnPosterTools(ChatClient.Builder builder, CsdnDraftClient draftClient) { this.chatClient builder.build(); this.draftClient draftClient; } Tool(description 根据文章正文生成 CSDN 标题、标签和摘要) public ArticleMeta generateMeta(String markdownBody) { String prompt 你是技术博客编辑。请阅读下面的 Markdown 正文 输出 JSON{title:...,tags:[...],summary:...}。 标签不超过 5 个摘要不超过 100 字。 正文 markdownBody; String json chatClient.prompt().user(prompt).call().content(); return JsonUtil.parse(json, ArticleMeta.class); } Tool(description 把文章写入 CSDN 草稿箱返回草稿 ID) public String saveDraft(String title, String markdownBody, String tags) { return draftClient.createDraft(title, markdownBody, tags); } }ChatClient由 Spring AI 自动装配Tool方法会被 MCP Server 扫描并暴露出去。模型在对话中决定什么时候调用generateMeta、什么时候调用saveDraft这就是 MCP 的价值工具和模型解耦加平台只需要加工具类。3.3 草稿写入客户端CsdnDraftClient负责真正的 HTTP 调用把 Markdown 转成 CSDN 草稿接口需要的字段。Component public class CsdnDraftClient { Value(${csdn.cookie}) private String cookie; Value(${csdn.draft-api}) private String draftApi; private final RestClient restClient RestClient.create(); public String createDraft(String title, String content, String tags) { MapString, Object body Map.of( title, title, content, content, tags, tags, type, original, status, 2 ); String resp restClient.post() .uri(draftApi) .header(Cookie, cookie) .header(Content-Type, application/json) .body(body) .retrieve() .body(String.class); return JsonUtil.read(resp, data, id); } }status: 2表示存草稿不直接公开。这样即使自动化跑飞了也不会把半成品发出去。4. 验证请求从本地文章到 CSDN 草稿的端到端动作配置写完跑一次完整链路。我准备了一篇本地 Markdown放在src/main/resources/articles/demo.md然后写一个 CommandLineRunner 触发整个流程。SpringBootApplication public class AutoPosterApplication implements CommandLineRunner { private final ChatClient chatClient; private final CsdnPosterTools tools; public static void main(String[] args) { SpringApplication.run(AutoPosterApplication.class, args); } Override public void run(String... args) throws Exception { String body Files.readString( Path.of(src/main/resources/articles/demo.md)); String result chatClient.prompt() .system(你是发帖助手先调用 generateMeta 生成元信息 再调用 saveDraft 写入草稿。) .user(请处理这篇文章\n body) .tools(tools) .call() .content(); System.out.println(执行结果 result); } }启动前设置环境变量export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_MODEL你开通的模型名 export CSDN_COOKIE你的CSDN会话cookie mvn spring-boot:run成功时控制台会打印类似执行结果已生成标题《Spring Boot 整合 MCP 实战》 标签 [Spring Boot, MCP, AI]草稿 ID 123456789 已写入草稿箱。打开 CSDN 创作中心草稿箱里能看到这篇文章标题、正文、标签都已填好你只需要检查配图位置和最终排版。到这里从本地 Markdown 到 CSDN 草稿的端到端动作就跑通了。注意Cookie 会过期建议在客户端里加一层失效检测返回 401 时打印明确日志而不是静默失败。5. 本篇常见错排查5.1 401 或鉴权失败先确认TAOTOKEN_API_KEY是否真的注入到进程里echo $TAOTOKEN_API_KEY看一眼。如果 Key 没问题检查 base-url 是不是写成了带路径的形式正确写法就是https://taotoken.net/api不要自己拼/v1。CSDN 侧的 401 基本都是 Cookie 过期重新登录复制即可。5.2 模型不调用工具Spring AI 里要让模型用工具必须在 prompt 链上显式.tools(tools)漏了这一步模型只会纯文本回复。另外Tool的 description 要写清楚用途描述太模糊模型会犹豫。如果还是不稳定把 system prompt 里的调用顺序写死先 generateMeta 再 saveDraft。5.3 草稿写入成功但内容为空多半是 Markdown 里的特殊字符没转义或者 content 字段被截断。检查CsdnDraftClient里 body 的序列化方式确认 content 是完整字符串。图片如果是本地路径CSDN 无法访问需要先上传图床再把链接替换进 Markdown。5.4 MCP SSE 连接断开本地调试时如果 MCP Server 和主应用分开跑确认sse-endpoint端口没被占用。长时间空闲断连是正常的加一个心跳或重连逻辑即可。生产环境建议把 MCP Server 和主应用放同一个容器网络里减少网络抖动。6. 下一步怎么接得更顺这套骨架跑通后扩展方向很清晰想接更多平台就照着CsdnPosterTools再加一个工具类MCP 会自动暴露想让文章质量更稳可以在generateMeta里加一段风格约束把历史高赞文章的标签分布喂进去做参考想定时跑把 CommandLineRunner 换成Scheduled就行。模型调用这条链路统一走 TaoToken 的 API 通道换模型只改环境变量不用动业务代码。需要管理多个 Key 或看调用量去控制台 https://taotoken.net/console 和 API Keys 页面 https://taotoken.net/api-keys 操作接入细节和参数说明在文档 https://taotoken.net/doc 里如果你要把它做成长期跑的编码/发布 AgentCoding Plan 页面 https://taotoken.net/coding-plan 可以先把额度规划好。先把草稿链路跑稳再考虑全自动发布这样每一步都可控。
返回列表