留给我干前端的时间不多了

0 阅读29分钟

标题党来着,但又是趋势,毕竟AI差不多能帮我解决百分之八十的工作内容

年纪一大,代码真深入不了,转个全栈一看都快奔四了hhh。看到沸点大家都在给同僚们支招,转行送外卖,开滴滴,炒河粉,当保安,真的少走三十年歪路。

想想我毕竟读过四年大学的叼毛,总归要搞点有技术含量的但含量不能太高的东西。于是就在看ai副业,看看能不能吃自媒体这口饭,没想到现在的龙虾真有点东西,一天给我整了个微信公众号文章自动生成与发布系统。

先上图

fe6e45f229c578d4d2bb64ed06f0583.png

05875c971bae03072ac2d6ce2250689.png

d786988d7626661054bf7356b27afe7.png

AI就是能一分钟写一篇,然后它是md文件格式的排版,目前图片能生成就是不美观,还没有找到好的文生图llm或者skill,还有排版感觉也就一般,后面有时间研究研究把。

项目地址附上:gitee.com/uniquech/we…

下面是我让AI读取项目文件和提示词步骤给我整理的操作手册

各位jy需要自提,帮忙粉一下《池子的AI笔记

微信公众号文章自动生成与发布系统

完整教程 v1.0 | 基于 CodeBuddy AI + Node.js + 微信API 实现

适用于:自媒体运营者、内容创作者、公众号管理员

难度等级:⭐⭐ 新手友好(会复制粘贴即可)


目录


第一章:这是什么?

这是一套 「从写文章到自动发布到微信公众号草稿箱」 的全自动化解决方案。

能做什么?

功能说明
✍️ AI 辅助写文章用 AI 自动生成 Markdown 格式的公众号文章
🎨 自动排版美化把 Markdown 转换成微信兼容的精美 HTML
🖼️ 图片自动处理自动嵌入本地图片,生成居中带圆角的排版
📤 一键发布草稿自动调用微信 API,把文章推送到公众号草稿箱
定时自动发每天自动取下一篇待发布文章,推送到草稿箱

不需要什么?

  • ❌ 不需要登录微信后台手动复制粘贴
  • ❌ 不需要第三方付费工具(如秀米、135编辑器)
  • ❌ 不需要有编程基础(教程手把手教你)
  • ❌ 不需要服务器(云函数有免费额度)

第二章:效果预览

发布前(Markdown 文件)

你在 articles/ 目录下放一个 .md 文件:

---
title: 我的第一篇AI文章
cover: ./assets/cover.png
---

# 我的第一篇AI文章

今天给大家介绍一个超好用的AI工具...

## 核心功能

- 功能一:xxx
- 功能二:xxx

![工具截图](./assets/screenshot.png)

发布后(微信草稿箱)

运行一条命令后:

[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

然后你只需要:

  1. 登录 mp.weixin.qq.com
  2. 进入 草稿箱
  3. 点击 发布 即可 ✅

第三章:准备工作(必读)

⚠️ 在开始之前,请确保你已经准备好了以下所有东西。

3.1 需要的账号和凭证

你需要准备 3 个关键信息

序号信息名称示例值用途安全级别
AppIDwx07be748e500e公众号的唯一标识,用于调用API🔴 敏感
AppSecretb4eceed5f80d88...公众号的密钥密码,配合AppID使用🔴🔴 极敏感
ThumbMediaId8vnjhK8eaAJmND6T...封面图的素材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): [************]    │  ← 点击「重置」获取
│                                         │
└─────────────────────────────────────────┘

操作步骤:

  1. 复制 AppID(直接显示在页面上)
  2. 点击 AppSecret 旁边的「重置」按钮
  3. 用扫码验证身份
  4. 复制生成的 AppSecret(只显示一次!务必保存)

💡 重要提示:AppSecret 只在重置时显示一次。如果忘了,只能重新重置。

🖼️ 获取 ThumbMediaId(封面素材ID)

ThumbMediaId 是你上传到微信素材库后的封面图 ID。

方法一:通过后台上传(推荐)

  1. 登录 mp.weixin.qq.com
  2. 左侧菜单 → 内容管理素材管理
  3. 点击 新建上传图片
  4. 上传一张封面图(建议尺寸 900×383px)
  5. 上传成功后,点击该图片,浏览器地址栏或图片详情中可以看到 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 加入白名单。

操作步骤:

  1. 基本配置 页面找到「IP 白名单」
  2. 点击修改
  3. 添加以下 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,转换为 HTMLsmart-publish.js
调用微信 API 获取 access_tokenHTTPS 请求
调用草稿接口,上传文章内容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.jsAPI服务,支持可视化界面和API调用必须改(填入你的AppID等)
smart-publish.js智能发布脚本,支持多类型文章必须改(填入你的AppID等)
publish-dashboard.html可视化发布界面(浏览器打开)❌ 一般不用改
auto-publish.ps1PowerShell定时发布脚本✅ 需要改成你的AppID等
generate-cover.jsAI封面生成器⚠️ 按需修改
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 发布流程

  1. 打开界面后自动加载文章列表
  2. 勾选要发布的文章
  3. 点击底部"立即发布"按钮
  4. 在确认弹窗中查看待发布文章
  5. 点击"确认发布"
  6. 自动发布到公众号草稿箱

第七章:方式二 — 智能发布脚本

适合有一定经验的用户,支持命令行发布和多种文章类型。

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, '&lt;');
html = html.replace(/>/g, '&gt;');

// 步骤C:处理图片语法 ![alt](path.png) -> <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(/^&gt; (.+)$/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定时任务

  1. 打开"任务计划程序"(Win+R → 输入 taskschd.msc
  2. 创建基本任务 → 设置名称和触发时间
  3. 操作选择"启动程序"
  4. 程序脚本填写:powershell.exe
  5. 参数填写:-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 部署步骤

前提条件
  1. 注册腾讯云账号:cloud.tencent.com
  2. 开通 CloudBase 服务
  3. 安装 CloudBase CLI:
npm install -g @cloudbase/cli
  1. 登录 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 配置定时触发器

在腾讯云控制台操作:

  1. 进入 云函数控制台console.cloud.tencent.com/scf
  2. 找到 mp-auto-publish 函数
  3. 点击 触发管理创建触发器
  4. 配置参数:
参数说明
触发方式定时触发定时运行
触发周期自定义使用 Cron
Cron 表达式0 0 9 * * * *每天早上 9:00
  1. 点击 确认 保存

常用 Cron 表达式参考:

时间Cron 表达式说明
每天 9:000 0 9 * * * *早上九点
每天 12:000 0 12 * * * *中午
每天 18:000 0 18 * * * *傍晚
每周一 9:000 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 名称负责阶段核心用途
1wechat-mp-writer-skill-mxx✍️ 写作公众号文章撰写、润色、去味
2Wechat Publisher📤 发布Markdown 一键转微信草稿
3Summarize📚 资料采集总结网页内容、提取关键信息
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
![截图说明](./assets/screenshot-1.png)

或者绝对路径:
![截图说明](d:/项目案例/markdownMini/articles/assets/screenshot-1.png)

或者网络图片:
![截图说明](https://example.com/image.png)
图片最佳实践
建议原因
尺寸不超过 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 过期或被重置过

排查步骤:

  1. 检查 smart-publish.js 中的 APP_ID 和 APP_SECRET 是否正确
  2. 访问 ip138.com 获取当前公网 IP
  3. 登录 mp.weixin.qq.com → 设置 → 基本 → IP 白名单 → 添加该 IP
  4. 如果刚重置过 AppSecret,记得更新脚本中的值

Q2:发布成功但草稿箱里没有文章

可能原因:

  • 文章内容为空
  • HTML 格式有问题
  • ThumbMediaId 无效

解决方法:

  1. 检查 Markdown 文件是否有实际内容
  2. 在脚本中添加 console.log(htmlBody.length) 查看 HTML 长度
  3. 确认 ThumbMediaId 是有效的永久素材 ID

Q3:图片没有显示出来

可能原因:

  • 图片路径不对(相对路径 vs 绝对路径)
  • 图片格式不支持
  • 图片不存在

检查方法:

  1. 确认图片确实存在于指定路径
  2. 使用绝对路径测试:d:/项目案例/markdownMini/articles/assets/image.png
  3. 确保图片扩展名是小写的 .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 部分。主要可调参数:

元素当前值建议范围
正文字号14px13px ~ 16px
行高1.81.6 ~ 2.0
主色调#5765f2任意 HEX 色
标题左边框宽度4px3px ~ 5px
代码背景色#f6f8ga浅灰系列

Q8:云函数部署失败怎么办?

检查清单:

  • CloudBase CLI 是否已安装?(npm install -g @cloudbase/cli
  • 是否已登录?(tcb login
  • 环境ID是否正确?
  • 云函数目录下是否有 package.jsonindex.js
  • 环境变量是否已配置?

Q9:如何取消定时发布?

方式一(云函数): 腾讯云控制台 → 云函数 → mp-auto-publish → 触发管理 → 删除触发器

方式二(Windows 计划任务):

Win + R → taskschd.msc → 找到对应任务 → 删除或禁用

Q10:这套方案安全吗?AppSecret 泄露风险?

安全建议:

  1. 不要把含有真实 AppSecret 的代码公开到 GitHub
  2. 使用环境变量代替硬编码:
    const APP_ID = process.env.WECHAT_APP_ID;
    const APP_SECRET = process.env.WECHAT_APP_SECRET;
    
  3. 定期轮换 AppSecret(在微信后台重置)
  4. 配置最小权限的 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/tokenGET获取 access_token
/cgi-bin/draft/addPOST新建草稿
/cgi-bin/draft/getGET获取草稿详情
/cgi-bin/draft/deletePOST删除草稿
/cgi-bin/freepublish/submitPOST直接发布(无需进后台)
/cgi-bin/material/add_materialPOST上传永久素材
/cgi-bin/media/uploadPOST上传临时素材

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"}

常用错误码:

错误码含义解决方法
40001AppSecret 错误检查密钥是否正确
40013AppID 无效检查 AppID 是否正确
45009接口调用次数超出限制等待明日重试
45029API 频率限制降低调用频率

结语

恭喜你看到了最后!现在你已经掌握了这套 "AI 写作 + 自动发布" 的完整流程的核心知识。

下一步行动清单

  • 注册/准备一个微信公众号
  • 获取 AppID 和 AppSecret
  • 安装 Node.js 环境
  • 克隆/下载本项目代码
  • 修改配置文件,填入你的凭证
  • 写一篇测试文章
  • 运行发布脚本,验证成功
  • (可选)部署云函数实现定时发布

获取帮助

如果遇到问题:

  1. 先看本章 FAQ 部分
  2. 检查微信官方文档:developers.weixin.qq.com/doc/offiacc…
  3. 在项目 GitHub Issues 中提问

版本: v1.0
更新日期: 2026-04-12
适用范围: 微信公众号(订阅号/服务号)
作者: 基于 markdownMini 项目整理
协议: MIT License