标题党来着,但又是趋势,毕竟AI差不多能帮我解决百分之八十的工作内容
年纪一大,代码真深入不了,转个全栈一看都快奔四了hhh。看到沸点大家都在给同僚们支招,转行送外卖,开滴滴,炒河粉,当保安,真的少走三十年歪路。
想想我毕竟读过四年大学的叼毛,总归要搞点有技术含量的但含量不能太高的东西。于是就在看ai副业,看看能不能吃自媒体这口饭,没想到现在的龙虾真有点东西,一天给我整了个微信公众号文章自动生成与发布系统。
先上图
AI就是能一分钟写一篇,然后它是md文件格式的排版,目前图片能生成就是不美观,还没有找到好的文生图llm或者skill,还有排版感觉也就一般,后面有时间研究研究把。
项目地址附上:gitee.com/uniquech/we…
下面是我让AI读取项目文件和提示词步骤给我整理的操作手册
各位jy需要自提,帮忙粉一下《池子的AI笔记》
微信公众号文章自动生成与发布系统
完整教程 v1.0 | 基于 CodeBuddy AI + Node.js + 微信API 实现
适用于:自媒体运营者、内容创作者、公众号管理员
难度等级:⭐⭐ 新手友好(会复制粘贴即可)
目录
- 第一章:这是什么?
- 第二章:效果预览
- 第三章:准备工作(必读)
- 第四章:核心原理与流程
- 第五章:项目文件说明
- 第六章:方式一 — 可视化界面发布(推荐新手)
- 第七章:方式二 — 智能发布脚本
- 第八章:方式三 — PowerShell定时发布
- 第九章:方式四 — 云函数定时发布
- 第九章:AI Skill 使用矩阵(核心亮点)
- 第十章:Markdown 文章编写规范
- 第十一章:Markdown 文章编写规范
- 第十二章:常见问题 FAQ
- 第十三章:附录A — 配置速查表
- 第十四章:附录B — 微信 API 参考
第一章:这是什么?
这是一套 「从写文章到自动发布到微信公众号草稿箱」 的全自动化解决方案。
能做什么?
| 功能 | 说明 |
|---|---|
| ✍️ AI 辅助写文章 | 用 AI 自动生成 Markdown 格式的公众号文章 |
| 🎨 自动排版美化 | 把 Markdown 转换成微信兼容的精美 HTML |
| 🖼️ 图片自动处理 | 自动嵌入本地图片,生成居中带圆角的排版 |
| 📤 一键发布草稿 | 自动调用微信 API,把文章推送到公众号草稿箱 |
| ⏰ 定时自动发 | 每天自动取下一篇待发布文章,推送到草稿箱 |
不需要什么?
- ❌ 不需要登录微信后台手动复制粘贴
- ❌ 不需要第三方付费工具(如秀米、135编辑器)
- ❌ 不需要有编程基础(教程手把手教你)
- ❌ 不需要服务器(云函数有免费额度)
第二章:效果预览
发布前(Markdown 文件)
你在 articles/ 目录下放一个 .md 文件:
---
title: 我的第一篇AI文章
cover: ./assets/cover.png
---
# 我的第一篇AI文章
今天给大家介绍一个超好用的AI工具...
## 核心功能
- 功能一:xxx
- 功能二:xxx

发布后(微信草稿箱)
运行一条命令后:
[1/2] Getting access_token...
[OK] Token obtained
[2/2] Publishing to WeChat...
==========================================
[OK] SUCCESS! Media ID: 8vnjhK8eaAJmND6TwqPNMxxxxx
Please login to WeChat backend to publish
==========================================
File renamed to .published.md
然后你只需要:
- 登录 mp.weixin.qq.com
- 进入 草稿箱
- 点击 发布 即可 ✅
第三章:准备工作(必读)
⚠️ 在开始之前,请确保你已经准备好了以下所有东西。
3.1 需要的账号和凭证
你需要准备 3 个关键信息:
| 序号 | 信息名称 | 示例值 | 用途 | 安全级别 |
|---|---|---|---|---|
| ① | AppID | wx07be748e500e | 公众号的唯一标识,用于调用API | 🔴 敏感 |
| ② | AppSecret | b4eceed5f80d88... | 公众号的密钥密码,配合AppID使用 | 🔴🔴 极敏感 |
| ③ | ThumbMediaId | 8vnjhK8eaAJmND6T... | 封面图的素材ID(上传到微信后获得) | 🟡 一般 |
3.2 环境要求
必需环境
| 环境 | 版本要求 | 检查方法 |
|---|---|---|
| 操作系统 | Windows 10/11 | 打开「此电脑」查看 |
| Node.js | >= 16.0.0 | 终端输入 node --version |
| npm | 随 Node.js 安装 | 终端输入 npm --version |
可选环境(用于定时发布)
| 环境 | 用途 | 是否必须 |
|---|---|---|
| 腾讯云账号 | 运行云函数实现定时发布 | 仅方案三需要 |
| CloudBase CLI | 部署云函数命令行工具 | 仅方案三需要 |
3.3 如何获取这些信息
🔑 获取 AppID 和 AppSecret
步骤 1:登录微信公众平台
打开浏览器访问:mp.weixin.qq.com
用你的公众号管理员微信扫码登录。
步骤 2:进入开发设置
左侧菜单栏 → 设置与开发 → 基本配置
你会看到如下页面:
┌─────────────────────────────────────────┐
│ 公众号开发信息 │
├─────────────────────────────────────────┤
│ │
│ 开发者ID(AppID): wx07be748e500e │ ← 复制这个
│ │
│ 开发者密码(AppSecret): [************] │ ← 点击「重置」获取
│ │
└─────────────────────────────────────────┘
操作步骤:
- 复制 AppID(直接显示在页面上)
- 点击 AppSecret 旁边的「重置」按钮
- 用扫码验证身份
- 复制生成的 AppSecret(只显示一次!务必保存)
💡 重要提示:AppSecret 只在重置时显示一次。如果忘了,只能重新重置。
🖼️ 获取 ThumbMediaId(封面素材ID)
ThumbMediaId 是你上传到微信素材库后的封面图 ID。
方法一:通过后台上传(推荐)
- 登录 mp.weixin.qq.com
- 左侧菜单 → 内容管理 → 素材管理
- 点击 新建 → 上传图片
- 上传一张封面图(建议尺寸 900×383px)
- 上传成功后,点击该图片,浏览器地址栏或图片详情中可以看到 Media ID
方法二:通过 API 上传(进阶)
// 使用 curl 或 Postman 调用微信接口
POST https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=YOUR_TOKEN&type=image
// Body: form-data, 字段名 media, 值为图片文件
// 返回: {"media_id":"8vnjhK8eaAJmND6TwqPNMVQ1sqTjI1h4nAhNZlNNqNs7NXiquCAnpBVly1P6PX_w","url":"https://mmbiz.qpic.cn/..."}
返回的 media_id 就是你要填入脚本的 THUMB_MEDIA_ID。
🌐 配置 IP 白名单(重要!)
微信 API 会校验调用者的 IP 地址。你需要把你的公网 IP 加入白名单。
操作步骤:
- 在 基本配置 页面找到「IP 白名单」
- 点击修改
- 添加以下 IP(根据你的情况):
| 场景 | IP 地址 |
|---|---|
| 本地电脑运行脚本 | 你当前的公网 IP(访问 ip138.com 查看) |
| 腾讯云函数运行 | 腾讯云出口 IP(见下方) |
腾讯云常用出口 IP 段:
- 139.199.x.x
- 124.239.x.x
- 182.254.x.x
- 9.0.0.0/8
如果用云函数部署,建议在云函数中配置固定出口 IP。
第四章:核心原理与流程
4.1 完整工作流
┌──────────────────────────────────────────────────────────────────┐
│ 完整工作流程图 │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────────┐ ┌──────────────────┐ │
│ │ ① 写作 │ ─→│ ② 存放文件 │ ─→│ ③ 执行发布命令 │ │
│ │ (AI辅助) │ │ (articles/) │ │ (node/bat/云函数) │ │
│ └─────────┘ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ ┌─────────────┐ ┌──────────────────┐ │
│ │ ⑦ 完成! │ ←─│ ⑥ 登录确认 │ ←─│ ④ API推送草稿箱 │ │
│ │ 文章已发 │ │ 微信后台发布 │ │ ⑤ 获取MediaID │ │
│ └─────────┘ └─────────────┘ └──────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
文字版步骤:
| 步骤 | 操作 | 工具/方式 |
|---|---|---|
| ① | 编写/生成 Markdown 文章 | AI 辅助写作(Skill) |
| ② | 将 .md 文件放入 articles/ 目录 | 手动/AI |
| ③ | 运行发布命令 | node / bat / 云函数 |
| ④ | 脚本读取 Markdown,转换为 HTML | smart-publish.js |
| ⑤ | 调用微信 API 获取 access_token | HTTPS 请求 |
| ⑥ | 调用草稿接口,上传文章内容 | HTTPS POST |
| ⑦ | 获得 media_id,去微信后台确认发布 | 浏览器 |
4.2 技术架构图
┌─────────────────────────────────────┐
│ 用户(你) │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ 触发发布的方式 │
│ ┌─────────┐ ┌────────┐ ┌────────┐ │
│ │ 手动命令 │ │ BAT双击 │ │ 定时器 │ │
│ └────┬────┘ └───┬────┘ └───┬────┘ │
└───────┼──────────┼──────────┼────────┘
│ │ │
┌───────▼──────────▼──────────▼────────┐
│ 核心处理引擎 │
│ │
│ ┌──────────────┐ ┌─────────────┐ │
│ │ 读取MD文件 │ │ 解析YAML头 │ │
│ └──────┬───────┘ └──────┬──────┘ │
│ │ │ │
│ ┌──────▼──────────────────▼──────┐ │
│ │ Markdown → HTML 转换器 │ │
│ │ (标题/正文/代码块/图片/列表) │ │
│ └──────────────┬─────────────────┘ │
│ │ │
│ ┌──────────────▼─────────────────┐ │
│ │ 内联CSS样式注入 │ │
│ │ (微信兼容的排版美化) │ │
│ └──────────────┬─────────────────┘ │
└─────────────────┼────────────────────┘
│
┌─────────────────▼────────────────────┐
│ 微信公众平台 API │
│ │
│ ① GET /cgi-bin/token → 获取令牌 │
│ ② POST /cgi-bin/draft/add → 创建草稿 │
│ │
└─────────────────┬────────────────────┘
│
┌───────▼────────┐
│ 微信公众号草稿箱 │
│ 返回 Media_ID │
└────────────────┘
4.3 四种发布方式对比
| 特性 | 方式一:可视化界面 | 方式二:智能脚本 | 方式三:定时脚本 | 方式四:云函数定时 |
|---|---|---|---|---|
| 操作难度 | ★☆☆ 最简 | ★★☆ 简单 | ★★☆ 简单 | ★★★ 中等 |
| 每次操作 | 浏览器勾选 | 输入命令 | 双击bat文件 | 全自动无需操作 |
| 定时能力 | 无 | 无 | ✅ 可配任务计划 | ✅ 内置Cron触发 |
| 批量发布 | ✅ 支持多选 | ❌ 单篇 | ❌ 单篇 | ✅ 自动轮询 |
| 适用场景 | 新手日常发布 | 偶尔发文 | 经常发文 | 每天固定时间自动发 |
| 依赖环境 | 本地Node.js | 本地Node.js | 本地Windows | 腾讯云账号 |
| 成本 | 免费 | 免费 | 免费 | 有免费额度 |
推荐选择:
- 新手入门 → 方式一(可视化界面) 最直观
- 日常发布 → 方式三(定时脚本) 省心省力
- 完全自动化 → 方式四(云函数定时) 无需值守
第五章:项目文件说明
下载本项目后,你会看到以下目录结构:
markdownMini/ # 项目根目录
│
├── 📁 articles/ # 【重点】文章存放目录
│ ├── AI文章/ # AI资讯/AI工具类文章
│ │ ├── AI资讯/
│ │ └── AI工具/
│ ├── 文学文章/ # 文学/情感/生活感悟类文章
│ └── *.published.md # 已发布的文章(自动改名)
│
├── 📁 cloudfunctions/ # 云函数代码(定时发布用)
│ └── mp-auto-publish/
│ └── index.js
│
├── 📄 article-api.js # 【核心】API服务(可视化界面后端)
├── 📄 smart-publish.js # 【核心】智能发布脚本
├── 📄 publish-dashboard.html # 【可视化】文章发布管理界面
├── 📄 auto-publish.ps1 # 【工具】PowerShell定时发布脚本
├── 📄 generate-cover.js # 【工具】AI封面生成器
├── 📄 html-to-png.js # 【工具】HTML封面转PNG
├── 📄 fetch-ai-news.js # 【工具】获取AI资讯
├── 📄 云函数部署指南.md # 【参考】云函数部署文档
├── 📄 auto-publish.ps1 # 【工具】定时自动发布脚本
└── 📄 package.json # Node.js依赖配置
关键文件速查表
| 文件名 | 作用 | 你需要修改吗? |
|---|---|---|
article-api.js | API服务,支持可视化界面和API调用 | ✅ 必须改(填入你的AppID等) |
smart-publish.js | 智能发布脚本,支持多类型文章 | ✅ 必须改(填入你的AppID等) |
publish-dashboard.html | 可视化发布界面(浏览器打开) | ❌ 一般不用改 |
auto-publish.ps1 | PowerShell定时发布脚本 | ✅ 需要改成你的AppID等 |
generate-cover.js | AI封面生成器 | ⚠️ 按需修改 |
articles/ | 你的文章内容 | ✅ 放你的文章进来 |
articles/AI文章/ | AI资讯/工具类文章 | ✅ 按分类存放 |
articles/文学文章/ | 文学/情感/生活感悟类文章 | ✅ 按分类存放 |
第六章:方式一 — 可视化界面发布(推荐新手)
最简单直观的方式,通过浏览器界面管理文章发布。
6.1 启动服务
打开终端,进入项目目录并执行:
cd d:\项目案例\markdownMini
node article-api.js
看到以下界面说明服务启动成功:
╔══════════════════════════════════════════════════════╗
║ 文章发布管理系统 ║
╠══════════════════════════════════════════════════════╣
║ API服务: http://localhost:3001 ║
║ 管理界面: http://localhost:3001/publish-dashboard ║
╚══════════════════════════════════════════════════════╝
6.2 打开可视化界面
在浏览器中打开:http://localhost:3001/publish-dashboard
6.3 功能说明
| 功能 | 说明 |
|---|---|
| 📋 文章列表 | 显示所有待发布文章,支持按分类筛选 |
| ✅ 多选发布 | 勾选框批量选择要发布的文章 |
| 🏷️ 状态标记 | 已发布的文章显示绿色"已发布"标签 |
| 🔍 搜索功能 | 支持按标题搜索文章 |
| ⚠️ 二次确认 | 点击发布后弹出确认弹窗,显示待发布文章列表 |
6.4 发布流程
- 打开界面后自动加载文章列表
- 勾选要发布的文章
- 点击底部"立即发布"按钮
- 在确认弹窗中查看待发布文章
- 点击"确认发布"
- 自动发布到公众号草稿箱
第七章:方式二 — 智能发布脚本
适合有一定经验的用户,支持命令行发布和多种文章类型。
7.1 配置你的凭证
打开 smart-publish.js,找到文件开头(约第 18-19 行):
// =============================================
// Config - 请修改为你自己的信息
// =============================================
const APP_ID = 'wx07be748e500e'; // ① 改成你的 AppID
const APP_SECRET = 'b4eceed5f80d88294a63933290d1e975'; // ② 改成你的 AppSecret
7.2 准备文章
把你要发布的 Markdown 文件放入 articles/ 目录:
articles/
└── my-first-article.md # ← 你的文章放这里
然后修改脚本中的文件路径(约第 11 行):
const content = fs.readFileSync(
'd:/项目案例/markdownMini/articles/my-first-article.md', // ← 改成你的文件路径
'utf8'
);
同时修改标题(约第 14 行),或者在你的 Markdown 文件中使用 YAML frontmatter 定义标题(推荐):
let title = '我的文章标题'; // ← 改成你的标题
7.3 执行发布
打开终端(PowerShell 或 CMD),进入项目目录并执行:
cd d:\项目案例\markdownMini
node smart-publish.js
看到类似以下输出就说明成功了:
Title: 我的文章标题
HTML length: 12580 chars
[1/2] Getting access_token...
[OK] Token obtained
[2/2] Publishing to WeChat...
==========================================
[OK] SUCCESS! Media ID: 8vnjhK8eaAJmND6TwqPNMxxxxx
Please login to WeChat backend to publish
==========================================
File renamed to .published.md
7.4 脚本逐行详解
下面是 smart-publish.js 的完整逻辑拆解:
// ============================================================
// 第一部分:配置区(用户必须修改)
// ============================================================
const APP_ID = '你的AppID'; // 公众号开发者ID
const APP_SECRET = '你的AppSecret'; // 公众号开发者密钥
const THUMB_MEDIA_ID = '你的封面ID'; // 封面图素材ID
// ============================================================
// 第二部分:读取并解析 Markdown 文件
// ============================================================
// 读取文章内容
const content = fs.readFileSync('文章路径', 'utf8');
let body = content;
let title = '默认标题';
// 解析 YAML frontmatter(如果有的话)
// 支持 --- 开头的元数据格式:
// ---
// title: 真实标题
// ---
// 正文内容...
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
if (match) {
body = match[2]; // body = frontmatter 之后的内容
const fm = match[1]; // fm = frontmatter 内容
// 从 frontmatter 中提取 title
const tm = fm.match(/^title:\s*(.+)$/m);
if (tm) title = tm[1].trim();
}
// 移除 Markdown 的一级标题(因为微信会用单独的标题字段)
body = body.replace(/^# .+\r?\n/, '');
// ============================================================
// 第三部分:Markdown → HTML 转换(核心逻辑)
// ============================================================
// 步骤A:先提取代码块,用占位符保护起来
// (因为代码块里的内容不应该被其他规则误匹配)
const codeBlocks = [];
let codeBlockIndex = 0;
body = body.replace(/```[\s\S]*?```/g, (match) => {
const placeholder = `__CODEBLOCK_${codeBlockIndex}__`;
codeBlocks.push(match);
codeBlockIndex++;
return placeholder;
});
// 步骤B:转义 HTML 特殊字符(防XSS)
let html = body;
html = html.replace(/&/g, '&');
html = html.replace(/</g, '<');
html = html.replace(/>/g, '>');
// 步骤C:处理图片语法  -> <img>标签
html = html.replace(/!\[([^\]]*)\]\(([^)]+\.(?:png|jpg|jpeg|gif|webp))/gi,
(match, alt, src) => {
if (!src.startsWith('http')) {
src = 'd:/项目案例/markdownMini/articles/' + src; // 补全相对路径
}
return `<p style="margin:20px 0;text-align:center;">
<img src="${src}" style="max-width:100%;height:auto;border-radius:8px;" />
</p>`;
}
);
// 步骤D:处理各级标题
html = html.replace(/^#### (.+)$/gm, '<p style="font-size:16px;...">$1</p>'); // h4
html = html.replace(/^### (.+)$/gm, '<p style="font-size:18px;...">$1</p>'); // h3
html = html.replace(/^## (.+)$/gm, '<p style="font-size:20px;...">$1</p>'); // h2
html = html.replace(/^# (.+)$/gm, '<p style="font-size:22px;...">$1</p>'); // h1
// 步骤E:处理引用块 > 引用内容
html = html.replace(/^> (.+)$/gm,
'<p style="margin:20px 0;padding:15px 20px;background:linear-gradient(...)">...</p>'
);
// 步骤F:处理粗体/斜体
html = html.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>'); // ***加粗斜体***
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>'); // **加粗**
html = html.replace(/\*(.+?)\*/g, '<em>$1</em'); // *斜体*
// 步骤G:处理列表项
html = html.replace(/^\s*-\s+(.+)$/gm, '<p style="...">• $1</p>'); // 无序列表
html = html.replace(/^\s*\d+\.\s+(.+)$/gm, '<p style="...">$1</p>'); // 有序列表
// 步骤H:处理行内代码 `code`
html = html.replace(/`([^`\n]+)`/g, '<code style="...">$1</code>');
// 步骤I:恢复代码块(替换回占位符)
codeBlocks.forEach((block, index) => {
let codeContent = block.slice(4, -3).trim(); // 去掉 ``` 包裹
codeContent = codeContent.replace(/^[ \t]+/gm, ''); // 去掉每行缩进
codeContent = codeContent.replace(/\r\n/g, '<br>').replace(/\n/g, '<br>');
const codeBlockHtml = `<p style="background-color:#f6f8fa;...">
${codeContent}
</p>`;
html = html.replace(`__CODEBLOCK_${index}__`, codeBlockHtml);
});
// 步骤J:处理段落(连续文本合并为一个 <p>)
const lines = html.split(/\r?\n/);
// ... 段落合并逻辑 ...
// ============================================================
// 第四部分:组装完整的 HTML 文档
// ============================================================
const htmlBody = `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", ...;
font-size: 14px;
line-height: 1.8;
color: #333333;
}
/* 更多 CSS 样式... */
</style>
</head>
<body>
${result.join('\n')}
</body>
</html>`;
// ============================================================
// 第五部分:调用微信 API 发布
// ============================================================
// ① 获取 access_token
function getToken() {
return new Promise((resolve, reject) => {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APP_ID}&secret=${APP_SECRET}`;
https.get(url, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
const json = JSON.parse(data);
if (json.access_token) resolve(json.access_token);
else reject(new Error('Failed: ' + data));
});
});
});
}
// ② 发布草稿
function publishDraft(token) {
return new Promise((resolve, reject) => {
const data = JSON.stringify({
articles: [{
title: title,
author: 'AI副业笔记', // 作者名(可自定义)
digest: '', // 摘要(可选,留空则自动截取)
content: htmlBody, // HTML正文
thumb_media_id: THUMB_MEDIA_ID, // 封面素材ID
need_open_comment: 1, // 开启评论
only_fans_can_comment: 0 // 所有人可评论
}]
});
// 发送 POST 请求到微信 API
const req = https.request({
hostname: 'api.weixin.qq.com',
path: `/cgi-bin/draft/add?access_token=${token}`,
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let responseData = '';
res.on('data', chunk => responseData += chunk);
res.on('end', () => {
const json = JSON.parse(responseData);
if (json.media_id) resolve(json.media_id); // 成功!
else reject(new Error('Failed: ' + responseData));
});
});
req.write(data);
req.end();
});
}
// ③ 主函数:按顺序执行
async function main() {
const token = await getToken();
const mediaId = await publishDraft(token);
console.log('SUCCESS! Media ID:', mediaId);
}
main();
第八章:方式三 — PowerShell定时发布
适合习惯使用Windows任务计划的用户,可以定时执行发布。
8.1 配置凭证
打开 auto-publish.ps1,修改顶部的凭证配置(约第 3-4 行):
:: ========== 配置区(修改这里)========== ::
set "APP_ID=wx07be748e500e" :: ← 改成你的 AppID
set "APP_SECRET=b4eceed5f80d88..." :: ← 改成你的 AppSecret
set "ARTICLES_DIR=d:\项目案例\markdownMini\articles" :: ← 改成你的目录
8.2 设置Windows定时任务
- 打开"任务计划程序"(Win+R → 输入
taskschd.msc) - 创建基本任务 → 设置名称和触发时间
- 操作选择"启动程序"
- 程序脚本填写:
powershell.exe - 参数填写:
-ExecutionPolicy Bypass -File "d:\项目案例\markdownMini\auto-publish.ps1"
8.3 执行发布
手动测试运行:
cd d:\项目案例\markdownMini
.\auto-publish.ps1
8.4 常见问题
Q: 执行策略被禁用? 以管理员身份打开 PowerShell 运行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Q: 定时任务没有执行? 检查任务计划程序中的"上次运行结果",确保状态码为 0。
第九章:方式四 — 云函数定时发布
这是终极方案——完全自动化,每天按时自动发布一篇新文章到草稿箱。
9.1 云函数是什么?
云函数(Serverless Function) 是跑在腾讯云上的代码,特点:
| 特性 | 说明 |
|---|---|
| 🚀 免运维 | 不用买服务器、不用装系统 |
| ⏰ 定时触发 | 可以设置 Cron 表达式定时运行 |
| 💰 按量计费 | 有免费额度,小规模使用基本免费 |
| ☁️ 公网IP | 天然具备公网出口,方便调微信 API |
9.2 部署步骤
前提条件
- 注册腾讯云账号:cloud.tencent.com
- 开通 CloudBase 服务
- 安装 CloudBase CLI:
npm install -g @cloudbase/cli
- 登录 CloudBase:
tcb login
按提示在浏览器中完成授权。
部署云函数
# 进入云函数目录
cd d:\项目案例\markdownMini\cloudfunctions
# 部署函数(替换成你的环境ID)
tcb fn deploy mp-auto-publish --envId 你的环境ID
配置环境变量
在腾讯云控制台 → 云函数 → mp-auto-publish → 配置 → 环境变量 中添加:
| 变量名 | 值 |
|---|---|
WECHAT_APP_ID | 你的 AppID |
WECHAT_APP_SECRET | 你的 AppSecret |
初始化数据库
需要在 CloudBase 数据库中创建集合 articles_queue,结构如下:
{
"_id": "自动生成",
"title": "文章标题",
"content": "<html>文章正文HTML</html>",
"digest": "文章摘要",
"cover_image": "https://封面图URL.jpg",
"thumb_media_id": "可选,微信素材ID",
"order": 1,
"status": "pending",
"published_at": null
}
9.3 配置定时触发器
在腾讯云控制台操作:
- 进入 云函数控制台 → console.cloud.tencent.com/scf
- 找到
mp-auto-publish函数 - 点击 触发管理 → 创建触发器
- 配置参数:
| 参数 | 值 | 说明 |
|---|---|---|
| 触发方式 | 定时触发 | 定时运行 |
| 触发周期 | 自定义 | 使用 Cron |
| Cron 表达式 | 0 0 9 * * * * | 每天早上 9:00 |
- 点击 确认 保存
常用 Cron 表达式参考:
| 时间 | Cron 表达式 | 说明 |
|---|---|---|
| 每天 9:00 | 0 0 9 * * * * | 早上九点 |
| 每天 12:00 | 0 0 12 * * * * | 中午 |
| 每天 18:00 | 0 0 18 * * * * | 傍晚 |
| 每周一 9:00 | 0 0 9 * * 1 * | 每周一 |
| 每 8 小时 | 0 0 0/8 * * * * | 间隔执行 |
9.4 云函数工作流程
每天 9:00 触发器启动
↓
┌─ ① 获取 access_token ─┐
│ 调用微信 token 接口 │
└──────────┬──────────────┘
↓
┌─ ② 读取待发布文章 ──────┐
│ 从云数据库查 status=pending │
│ 按 order 排序取第一篇 │
└──────────┬──────────────┘
↓
┌─ ③ 上传封面图(如需要)──┐
│ 下载 cover_image URL │
│ 上传到微信素材库 │
│ 得到 thumb_media_id │
└──────────┬──────────────┘
↓
┌─ ④ 创建草稿 ────────────┐
│ 调用 /cgi-bin/draft/add │
│ 提交标题+HTML+封面 │
│ 返回 media_id │
└──────────┬──────────────┘
↓
┌─ ⑤ 更新状态 ────────────┐
│ 将该文章 status 改为 │
│ published,记录时间 │
└──────────┬──────────────┘
↓
✅ 任务完成!
文章已在草稿箱等你确认
第十章:AI Skill 使用矩阵(核心亮点)
本章介绍这套流程中涉及的 AI 技能(Skill),以及它们各自负责什么环节。
9.1 什么是 Skill?
Skill(技能) 是 CodeBuddy AI 的插件化能力模块。每个 Skill 都是一个专业领域的"专家",可以帮你完成特定类型的任务。
打个比方:
- CodeBuddy AI = 一个全能助理
- Skill = 助理掌握的各种专业技能(写作、设计、编程...)
在本项目中,我们组合使用了多个 Skill 来实现 从零到发布 的全流程。
9.2 本项目使用的 Skill 清单
| # | Skill 名称 | 负责阶段 | 核心用途 |
|---|---|---|---|
| 1 | wechat-mp-writer-skill-mxx | ✍️ 写作 | 公众号文章撰写、润色、去味 |
| 2 | Wechat Publisher | 📤 发布 | Markdown 一键转微信草稿 |
| 3 | Summarize | 📚 资料采集 | 总结网页内容、提取关键信息 |
| 4 | 前端开发 | 🎨 排版优化 | 生成精美的 HTML/CSS 排版样式 |
9.3 各 Skill 的详细职责
Skill 1:wechat-mp-writer-skill-mxx 📝
官方描述:
微信公众号文章全流程写作助手。支持热点选题、文章撰写、AI去味润色(去除机器感)、配图建议、一键发布到公众号草稿箱。
在本项目中的实际用途:
| 能力 | 具体操作 | 示例 |
|---|---|---|
| 热点选题 | 分析当前热门话题,生成爆款标题 | "2026年最值得用的8个免费AI工具" |
| 文章撰写 | 根据主题自动生成长文 | 输入主题 → 输出 2000+ 字文章 |
| AI 去味润色 | 让机器生成的文字更像人写的 | 去除"首先...其次...最后"等套路 |
| SEO 优化 | 优化关键词布局,提升搜索排名 | 在标题、开头、小标题中植入关键词 |
| 配图建议 | 根据内容推荐合适的配图位置 | "在第3段后插入工具截图" |
使用场景示例:
用户输入:"帮我写一篇关于AI效率工具的文章,目标读者是上班族"
↓
Skill 输出:
- 标题建议(5个备选)
- 文章大纲(含每个章节的字数分配)
- 完整正文(Markdown 格式)
- 配图建议清单
- SEO 关键词建议
与其他 Skill 的协作关系:
wechat-mp-writer-skill-mxx
│
├── 输出 Markdown 文章 ──→ 存入 articles/ 目录
│
└── 输出配图需求 ──→ 调用 Summarize Skill 收集资料
│
▼
Wechat Publisher Skill
│
▼
发布到微信草稿箱
Skill 2:Wechat Publisher 🚀
官方描述:
一键发布 Markdown 到微信公众号草稿箱。基于 wenyan-cli,支持多主题、代码高亮、图片自动上传。
在本项目中的实际用途:
| 功能 | 说明 | 与本项目的差异 |
|---|---|---|
| Markdown 转 HTML | 将 .md 文件转为微信兼容格式 | 我们用了 smart-publish.js |
| 图片上传 | 自动将图片上传到微信 CDN | 我们支持本地路径引用 |
| 多主题切换 | 提供多种排版风格 | 我们自定义了一套固定样式 |
| 代码高亮 | 对代码块进行语法着色 | 已内置在转换器中 |
为什么我们选择了自研方案而非直接用此 Skill?
| 对比维度 | Wechat Publisher Skill | 我们的 smart-publish.js |
|---|---|---|
| 定制程度 | 受限于 Skill 自身逻辑 | ✅ 完全可控 |
| 排版风格 | 固定的几套主题 | ✅ 自定义 CSS |
| 图片处理 | 需要上传到微信 CDN | ✅ 支持本地路径 |
| 学习曲线 | 需要了解 Skill 用法 | ✅ 改几个变量就行 |
如果你不想折腾代码,也可以直接用这个 Skill!
Skill 3:Summarize 📖
官方描述:
Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).
在本项目中的实际用途:
| 场景 | 操作 | 示例 |
|---|---|---|
| 网页内容提取 | 输入 URL → 输出结构化摘要 | 从 aishenqi.net 提取 AI 工具清单 |
| 资料整理 | 快速阅读长文 → 提炼要点 | 读一篇 5000 字文章,总结出 10 条要点 |
| 竞品分析 | 抓取对手文章 → 归纳其结构 | 分析爆款文章的写作套路 |
实战案例(来自本项目):
任务:整理一份"AI 神器大全"文章
操作过程:
1. 用户发现 https://aishenqi.net 这个网站有很多 AI 工具
2. 调用 Summarize Skill 抓取页面内容
3. Skill 返回了网站上的工具分类和名称列表
4. 基于这些信息 + 本地的截图,生成了一篇图文并茂的文章
Skill 4:前端开发 🎨
官方描述:
Full-stack frontend development combining premium UI design, cinematic animations, AI-generated media assets, persuasive copywriting, and visual art.
在本项目中的实际用途:
虽然本项目主要是后端脚本,但这个 Skill 在以下环节发挥了作用:
| 环节 | 具体贡献 |
|---|---|
| HTML 排版样式设计 | 生成微信兼容的内联 CSS(字体、颜色、间距) |
| 响应式适配 | 确保 HTML 在手机端显示正常 |
| 视觉层次优化 | 标题大小层级、颜色搭配、留白处理 |
我们最终使用的样式参数:
/* 字体层级 */
h1: font-size: 22px; color: #1a1a1a; /* 主标题 */
h2: font-size: 20px; color: #2a2a2a; /* 二级标题 */
h3: font-size: 18px; color: #3a3a3a; /* 三级标题 */
h4: font-size: 16px; color: #4a4a4a; /* 四级标题 */
body: font-size: 14px; line-height: 1.8; /* 正文 */
/* 强调色 */
主色调: #5765f2 (靛蓝色)
浅色版: #8b9cf7
背景渐变: linear-gradient(to right, #f8f9fa, #fff)
/* 间距规范 */
段落上下: margin: 15px ~ 35px
左内边距: padding-left: 10px ~ 12px
圆角: border-radius: 6px ~ 8px
9.4 完整的 Skill 协作流程图
┌────────────────────────────────────────────────────────────────┐
│ AI Skill 完整工作流 │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ 👤 用户的想法 │ "我想写一篇关于 xxx 的文章" │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ Skill 1: wechat-mp-writer-skill-mxx │ ◄── 写作专家 │
│ │ ─────────────────────────────────── │ │
│ │ • 选题分析 / 爆款标题生成 │ │
│ │ • 大纲规划 / 正文撰写 │ │
│ │ • AI 去味 / 润色优化 │ │
│ └────────┬───────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ ┌──────────────────┐ │
│ │ 需要外部资料? │───→│ Skill 3: Summarize│ ◄── 资料收集 │
│ └────────┬────────┘ │ • 网页内容提取 │ │
│ 否 │ • PDF/视频总结 │ │
│ │ └────────┬─────────┘ │
│ ▼ │ │
│ ┌──────────────────────────────┴──────────┐ │
│ │ Skill 4: 前端开发 │ ◄── 排版专家 │
│ │ ──────────────────────────────────── │ │
│ │ • 生成 HTML/CSS 排版样式 │ │
│ │ • 优化视觉层次和配色 │ │
│ │ • 确保微信兼容性 │ │
│ └────────┬─────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ 输出: articles/xxx.md (Markdown文件) │ │
│ └────────┬───────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ Skill 2: Wechat Publisher (或自研) │ ◄── 发布工具 │
│ │ ─────────────────────────────────── │ │
│ │ • Markdown → HTML 转换 │ │
│ │ • 调用微信 API 上传草稿 │ │
│ │ • 返回 Media ID │ │
│ └────────┬───────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ ✅ 草稿箱待发布 │ 登录 mp.weixin.qq.com 确认发布 │
│ └─────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
第十一章:Markdown 文章编写规范
为了让发布脚本正确处理你的文章,请遵循以下格式规范。
10.1 基本格式模板
直接复制下面的模板来写新文章:
---
title: 这里写你的文章标题
cover: ./assets/your-cover-image.png
description: 这是一段摘要,会显示在分享卡片上
author: 你的名字
---
# 这里是一级标题(会被自动提取作为文章标题)
这里是正文内容,用普通的段落格式书写即可。
## 二级标题
二级标题会带有左边框装饰。
### 三级标题
三级标题字号稍小一些。
#### 四级标题
四级标题最小。
## 列表示例
- 这是一个无序列表项
- 另一个列表项
- 再来一个
1. 有序列表第一项
2. 有序列表第二项
3. 有序列表第三项
## 引用示例
> 这是一段引用内容,会带有灰色背景和左边框。
## 代码示例
这是一个行内代码:`console.log("hello world")`
```javascript
// 这是一个代码块
function hello() {
console.log("Hello, World!");
}
图片插入

图片会自动居中显示,带圆角效果。
粗体和斜体
这是粗体文字,这是斜体文字,这是粗斜体。
### 10.2 YAML frontmatter 说明
文章开头用 `---` 包围的区域叫 **frontmatter(前置数据)**,用来存储元信息:
| 字段 | 是否必填 | 说明 | 示例 |
|------|:-------:|------|------|
| `title` | ✅ 必填 | 文章标题(优先级高于正文中的一级标题) | `我的第一篇文章` |
| `cover` | 可选 | 封面图路径(本地相对路径或URL) | `./assets/cover.png` |
| `description` | 可选 | 文章摘要(显示在分享卡片中) | `本文介绍了...` |
| `author` | 可选 | 作者名称 | `张三` |
| `date` | 可选 | 文章日期 | `2026-04-12` |
| `tags` | 可选 | 标签列表 | `[AI, 效率工具]` |
### 10.3 图片插入规范
#### 支持的图片格式
| 格式 | 扩展名 | 是否支持 |
|------|:------:|:-------:|
| PNG | `.png` | ✅ |
| JPEG/JPG | `.jpg` / `.jpeg` | ✅ |
| GIF | `.gif` | ✅ |
| WebP | `.webp` | ✅ |
#### 图片路径规则
articles/ ├── my-article.md # 文章文件 └── assets/ # 图片子目录(推荐) ├── cover.png # 封面图 ├── screenshot-1.png # 截图1 └── screenshot-2.png # 截图2
**在 Markdown 中这样引用:**
```markdown

或者绝对路径:

或者网络图片:

图片最佳实践
| 建议 | 原因 |
|---|---|
| 尺寸不超过 1080px 宽 | 微信会压缩,太大会失真 |
| 使用 PNG 或 JPG 格式 | 兼容性最好 |
| 文件大小 < 5MB | 微信 API 限制 |
| 图片放在 articles/ 子目录 | 方便脚本定位 |
10.4 排版样式参考
以下是转换器自动生成的样式效果预览:
一级标题效果
二级标题效果
三级标题效果
四级标题效果
引用块效果
代码块效果
function hello() {
console.log("Hello!");
}行内代码效果
console.log("hello")
普通段落
这是一段普通正文,采用 14px 字号、1.8 倍行高,颜色为深灰色 #333333,阅读体验舒适。
第十二章:常见问题 FAQ
Q1:发布时报错 "access_token 获取失败"
可能原因:
- AppID 或 AppSecret 填错了
- IP 白名单没配置当前 IP
- AppSecret 过期或被重置过
排查步骤:
- 检查
smart-publish.js中的 APP_ID 和 APP_SECRET 是否正确 - 访问 ip138.com 获取当前公网 IP
- 登录 mp.weixin.qq.com → 设置 → 基本 → IP 白名单 → 添加该 IP
- 如果刚重置过 AppSecret,记得更新脚本中的值
Q2:发布成功但草稿箱里没有文章
可能原因:
- 文章内容为空
- HTML 格式有问题
- ThumbMediaId 无效
解决方法:
- 检查 Markdown 文件是否有实际内容
- 在脚本中添加
console.log(htmlBody.length)查看 HTML 长度 - 确认 ThumbMediaId 是有效的永久素材 ID
Q3:图片没有显示出来
可能原因:
- 图片路径不对(相对路径 vs 绝对路径)
- 图片格式不支持
- 图片不存在
检查方法:
- 确认图片确实存在于指定路径
- 使用绝对路径测试:
d:/项目案例/markdownMini/articles/assets/image.png - 确保图片扩展名是小写的
.png/.jpg
Q4:中文乱码怎么办?
解决方法: 确保终端编码为 UTF-8:
# Windows CMD
chcp 65001
# PowerShell 默认就是 UTF-8,一般不需要额外设置
同时在脚本顶部可以加上:
process.env.NODE_ENCODING = 'utf8';
Q5:如何批量发布多篇文章?
方法 A:逐个修改路径发布(笨办法)
每次修改脚本中的文件路径,重复运行。
方法 B:使用队列模式(推荐)
编辑 articles_queue.json,按顺序列出所有文章:
{"order": 1, "title": "第一篇", "filename": "article-01.md", "status": "pending"}
{"order": 2, "title": "第二篇", "filename": "article-02.md", "status": "pending"}
然后使用云函数方案(方式三),它会自动按顺序每天发一篇。
Q6:如何修改作者名?
在 smart-publish.js 中找到这行:
author: 'AI副业笔记', // ← 改成你想显示的名字
Q7:如何自定义排版样式?
修改 smart-publish.js 中的 CSS 部分。主要可调参数:
| 元素 | 当前值 | 建议范围 |
|---|---|---|
| 正文字号 | 14px | 13px ~ 16px |
| 行高 | 1.8 | 1.6 ~ 2.0 |
| 主色调 | #5765f2 | 任意 HEX 色 |
| 标题左边框宽度 | 4px | 3px ~ 5px |
| 代码背景色 | #f6f8ga | 浅灰系列 |
Q8:云函数部署失败怎么办?
检查清单:
- CloudBase CLI 是否已安装?(
npm install -g @cloudbase/cli) - 是否已登录?(
tcb login) - 环境ID是否正确?
- 云函数目录下是否有
package.json和index.js? - 环境变量是否已配置?
Q9:如何取消定时发布?
方式一(云函数): 腾讯云控制台 → 云函数 → mp-auto-publish → 触发管理 → 删除触发器
方式二(Windows 计划任务):
Win + R → taskschd.msc → 找到对应任务 → 删除或禁用
Q10:这套方案安全吗?AppSecret 泄露风险?
安全建议:
- 不要把含有真实 AppSecret 的代码公开到 GitHub
- 使用环境变量代替硬编码:
const APP_ID = process.env.WECHAT_APP_ID; const APP_SECRET = process.env.WECHAT_APP_SECRET; - 定期轮换 AppSecret(在微信后台重置)
- 配置最小权限的 IP 白名单
第十三章:附录A — 配置速查表
你的个人信息备忘录
📋 复制下方表格,填入你自己的信息,保存好备用
| 项目 | 你的值 | 备注 |
|---|---|---|
| AppID | ________________ | mp.weixin.qq.com → 基本 → 开发者ID |
| AppSecret | ________________ | 同上 → 重置后获取(只显示一次!) |
| ThumbMediaId | ________________ | 素材管理 → 上传封面图后获得 |
| 公网 IP | _______________ | ip138.com 查询 |
| 云环境ID(可选) | ___________ | 仅云函数部署需要 |
| 文章目录路径 | ________________ | 如 D:\myproject\articles |
常用命令速查
| 操作 | 命令 |
|---|---|
| 检查 Node 版本 | node --version |
| 手动发布 | node smart-publish.js |
| 可视化界面 | node article-api.js 然后打开浏览器 |
| 部署云函数 | tcb fn deploy mp-auto-publish --envId xxx |
| 查看云函数日志 | 控制台 → 云函数 → 日志 |
第十四章:附录B — 微信 API 参考
相关接口列表
| 接口 | 方法 | 用途 |
|---|---|---|
/cgi-bin/token | GET | 获取 access_token |
/cgi-bin/draft/add | POST | 新建草稿 |
/cgi-bin/draft/get | GET | 获取草稿详情 |
/cgi-bin/draft/delete | POST | 删除草稿 |
/cgi-bin/freepublish/submit | POST | 直接发布(无需进后台) |
/cgi-bin/material/add_material | POST | 上传永久素材 |
/cgi-bin/media/upload | POST | 上传临时素材 |
access_token 说明
| 属性 | 值 |
|---|---|
| 有效时长 | 2 小时 |
| 获取方式 | GET 请求,传入 AppID + AppSecret |
| 并发限制 | 同时只能存在一个有效的 token |
| 建议 | 每次发布前重新获取,不要缓存太久 |
草稿接口请求格式
POST /cgi-bin/draft/add?access_token=TOKEN
{
"articles": [{
"title": "文章标题",
"author": "作者名",
"digest": "摘要",
"content": "<html>正文HTML</html>",
"thumb_media_id": "封面素材ID",
"need_open_comment": 1,
"only_fans_can_comment": 0
}]
}
返回值
// 成功
{"media_id": "8vnjhK8eaAJmND6TwqPNMxxxxx"}
// 失败
{"errcode": 40001, "errmsg": "invalid credential"}
常用错误码:
| 错误码 | 含义 | 解决方法 |
|---|---|---|
| 40001 | AppSecret 错误 | 检查密钥是否正确 |
| 40013 | AppID 无效 | 检查 AppID 是否正确 |
| 45009 | 接口调用次数超出限制 | 等待明日重试 |
| 45029 | API 频率限制 | 降低调用频率 |
结语
恭喜你看到了最后!现在你已经掌握了这套 "AI 写作 + 自动发布" 的完整流程的核心知识。
下一步行动清单
- 注册/准备一个微信公众号
- 获取 AppID 和 AppSecret
- 安装 Node.js 环境
- 克隆/下载本项目代码
- 修改配置文件,填入你的凭证
- 写一篇测试文章
- 运行发布脚本,验证成功
- (可选)部署云函数实现定时发布
获取帮助
如果遇到问题:
- 先看本章 FAQ 部分
- 检查微信官方文档:developers.weixin.qq.com/doc/offiacc…
- 在项目 GitHub Issues 中提问
版本: v1.0
更新日期: 2026-04-12
适用范围: 微信公众号(订阅号/服务号)
作者: 基于 markdownMini 项目整理
协议: MIT License