TrendPublish 是一个面向微信公众号的自动化选题与发布系统。它从你指定的数据源中抓取内容,用 AI 做选题、证据补全、排序、标题、正文生成、审稿、排版和配图,最后生成可预览的 dry-run 产物或创建微信公众号草稿。
它不是一个简单的 RSS 摘要脚本,而是一条可观察、可回滚、可调参的文章生产流水线:每次运行都会留下步骤、错误、质量审稿、HTML、图片和配置快照,方便你复盘为什么这篇文章值得发,以及哪里需要人工介入。
项目当前聚焦一条主链路:微信文章自动发布。本地、Docker 和 Cloudflare 都使用同一套 TypeScript 配置模型;Dashboard 中可编辑数据源、文章方案、共享能力和定时规则,下一次运行即时生效,密钥仍留在部署环境中。
示例公众号:AISPACE科技空间
社区交流:
日更类公众号真正耗时的不是“让模型写一段摘要”,而是稳定地完成这些事情:
TrendPublish 的设计目标就是把这些步骤变成一条清晰的自动化流程:AI 可以参与选题和创作,但每一步都可追踪、可配置、可 dry-run。
dynamic 动态排版,所有 HTML
都会做微信兼容清洗。发布中心会先告诉你最近一次运行结果、当前是否建议进入草稿箱,以及下一步应该检查什么。

运行页展示每次 workflow 的步骤、耗时、错误、人工反馈和产物入口,便于定位问题和复盘文章质量。

质量复盘页包含选题工作台,可以看到候选主题、入选/跳过原因、账号适配和审稿结果。 你也可以直接给候选主题标记“锁主线 / 采用 / 跳过”,这些反馈会进入账号级学习, 帮助下一次选题更贴近该账号的风格。
系统设置页用于维护文章方案、定时规则、共享能力和高级 JSON。日常使用不需要手写配置文件。

flowchart LR
A["数据源
URL / RSS / Search / Social"] --> B["抓取与清洗"]
B --> C["去重与历史记忆"]
C --> D["选题聚类与排序"]
D --> E["证据补全"]
E --> F["文章计划"]
F --> G["正文 / 标题 / 配图"]
G --> H["质量审稿与修订"]
H --> I["微信兼容 HTML"]
I --> J{"dry-run?"}
J -->|是| K["保存 HTML / JSON / 图片产物"]
J -->|否| L["上传素材并创建微信草稿"]
K --> M["Dashboard 复盘"]
L --> M
需要 Deno v2.0.0 或更高版本。
Windows:
irm https://deno.land/install.ps1 | iex
macOS / Linux:
curl -fsSL https://deno.land/install.sh | sh
git clone https://github.com/liyown/ai-trend-publish
cd ai-trend-publish
cp trendpublish.config.example.ts trendpublish.config.ts
deno task doctor
最小配置只需要服务密钥和一套大模型配置:
import { defineConfig } from "@src/utils/config/define-config.ts";
export default defineConfig({
server: {
apiKey: "your-api-key",
},
providers: {
ai: {
baseUrl: "https://api.deepseek.com/v1",
apiKey: "your-ai-api-key",
model: "deepseek-chat",
},
},
features: {
article: {
dryRun: true,
renderer: {
template: "minimal",
promptProfile: "technology",
},
sources: [
"https://news.ycombinator.com/",
],
},
},
});
更多配置见 配置说明。
# 检查配置和必填项
deno task doctor
# 预览全部微信模板
deno task preview
# 跑一次微信文章流程,不上传、不发布
deno task article --dry-run
# 跑多公众号矩阵 dry-run;不指定账号时使用全部启用账号
deno task article --matrix
deno task article --matrix --account main,lab
# 启动本地 API 服务 + Dashboard 前端热更新
deno task dev
deno task dev 会同时启动后端服务 http://localhost:8000 和 Vite Dashboard
http://localhost:5173/dashboard/,前端修改会自动刷新并代理 /api 到本地后端。
article --dry-run 会把渲染后的 HTML 输出到
src/temp/,适合正式发布前检查正文效果。 article --matrix
会为每个账号创建独立 dry-run,并在运行记录里生成矩阵父批次汇总和账号对比产物,
用于检查主线、文章形态和质量分是否真正拉开差异。
TrendPublish 的配置分成三层:
providers:只放外部服务凭证和默认能力参数。features.article:决定微信文章工作流开启哪些功能、选择哪个
provider、使用什么参数。storage.runtimeConfig:保存 Dashboard 可编辑的运行时业务配置。本地/Docker 用
SQLite,Cloudflare 用 D1;密钥不会写入数据库。例如,开启正文 AI 配图时:
providers: {
image: {
dashscope: { apiKey: "your-dashscope-api-key" },
},
},
features: {
article: {
bodyImages: {
mode: "missing",
provider: "dashscope",
count: 1,
size: "1024*1024",
},
},
},
这样可以避免“凭证配置”和“功能开关”混在一起。
| 目标 | 配置位置 | 说明 |
|---|---|---|
| 选择文章模板 | features.article.renderer.template |
支持 minimal、longform、product、dynamic 等 |
| 选择提示词风格 | features.article.renderer.promptProfile |
支持 technology、business、product、developer、research、general |
| 配置数据源 | features.article.sources |
直接写 URL,也可以用 group:url 指定抓取分组 |
| 配置抓取策略 | fetchGroups |
分组内 provider 按顺序 fallback |
| 开启封面生图 | features.article.cover |
支持 dashscope / minimax,需要对应 providers.image.*.apiKey |
| 开启正文配图 | features.article.bodyImages |
失败时回退已有原文图片布局 |
| 开启向量去重 | features.article.deduplication |
需要 embedding provider;本地/Docker 用 SQLite,Cloudflare 用 D1 |
| 开启通知 | features.article.notifications.channels |
支持 Bark、钉钉、飞书 |
| 页面改配置 | storage.runtimeConfig |
Dashboard 保存 Profile、数据源、抓取分组和定时规则,下一次运行生效 |
| 接入日志观测 | observability |
所有 Logger 输出可镜像到 stdout、Axiom、Better Stack 或 HTTP ingest |
| 正式发布微信 | features.article.dryRun: false |
本地固定 IP 用 weixin,Cloudflare 推荐 weixin-relay |
| 多公众号发布 | features.article.publisher.accountId |
对应 providers.publish.weixin.accounts 的账号 ID;relay 只做凭证透传代理 |
| 矩阵运营 | Dashboard 账号矩阵 |
编辑账号定位、默认方案和来源分组,运行后展示账号级质量趋势、风险和学习建议 |
完整字段说明见 配置说明。
最简单的写法是直接放 URL:
features: {
article: {
sources: [
"https://news.ycombinator.com/",
"https://openai.com/news/",
],
},
},
fetchGroups: {
default: ["auto"],
},
需要指定抓取策略时,可以使用自定义分组前缀:
providers: {
fetch: {
firecrawl: { apiKey: "your-firecrawl-api-key" },
jina: { apiKey: "your-jina-api-key" },
twitter: { xquikApiKey: "your-xquik-api-key" },
},
},
fetchGroups: {
default: ["auto"],
web: ["firecrawl", "jina"],
social: ["twitter"],
},
features: {
article: {
sources: [
"web:https://openai.com/news/",
"social:https://x.com/OpenAIDevs",
],
},
},
web: 和 social: 不是固定 provider 名,而是你自己定义的抓取分组名。
当前版本建议先用一套稳定的大模型配置跑通主链路,再按需开启抓取增强、图片生成、 去重和通知。
baseUrl 填
https://api.openai.com/v1;model 按平台模型列表选择。baseUrl 填
https://api.deepseek.com/v1;常用模型为 deepseek-chat、
deepseek-reasoner。baseUrl 填 https://dashscope.aliyuncs.com/compatible-mode/v1;常用模型为\
qwen-plus、qwen-max。features.article.sources。providers.fetch.rss.baseUrl。providers.fetch.firecrawl.apiKey。providers.fetch.jina.apiKey。providers.fetch.brave.apiKey,适合作为低成本通用搜索入口。providers.fetch.tavily.apiKey,适合 AI research / agent 风格搜索。providers.fetch.exa.apiKey,
适合语义搜索和研究型选题。providers.fetch.serper.apiKey,适合需要 Google SERP 覆盖的场景。providers.fetch.newsapi.apiKey,适合新闻搜索,生产限制以官方套餐为准。providers.fetch.twitter.bearerToken。providers.fetch.twitter.xquikApiKey。search:关键词,路由到 fetchGroups.search。providers.image.dashscope.apiKey。providers.image.minimax.apiKey,当前默认模型为 image-01。qwen-image-2.0-pro,更适合中文标题和封面版式。qwen-image-2.0,也可手动配置 wan2.7-image-pro
或兼容旧模型 wanx2.1-t2i-turbo。features.article.bodyImages 开启,可设置生成模型、数量和尺寸。providers.publish.weixin.appId 和 providers.publish.weixin.appSecret。weixin-relay,微信凭证仍放在主服务配置中并按次透传。text-embedding-v3。模板通过 features.article.renderer.template 选择:
minimal:极简阅读风,适合稳定日更。longform:长文杂志风,适合深度整理。product:产品更新风,适合产品、工具、版本动态。darktech:深色研究笔记风。dynamic:AI 根据本次文章内容实时生成公众号正文 HTML,失败时自动回退
minimal。也可以使用 default、modern、tech、mianpro、random。模板展示见
模板文档 或
在线展示。
# 日常使用
deno task doctor
deno task dev
deno task article --dry-run
deno task article --matrix --account main,lab
deno task article
deno task preview
# 质量检查
deno task verify
deno task test
# 本地前端/文档开发
deno task dashboard
deno task docs
# 部署
deno task docker
deno task relay
deno task cf deploy
deno task dashboard 只启动 Dashboard 前端 dev server;日常开发推荐直接用
deno task dev,它会同时启动后端和前端 watch。
整体采用 modular monolith:业务能力集中在微信文章 feature,外部服务统一放在 integrations,运行时和存储通过 ports 隔离。
flowchart TB
UI["Dashboard / CLI / API"] --> APP["app/weixin-article
应用组装层"]
APP --> WF["Workflow Runtime
Local / Cloudflare"]
APP --> FEATURE["features/weixin-article
业务编排与领域服务"]
FEATURE --> MODULES["modules
排序 / 摘要 / Markdown 等内部能力"]
FEATURE --> PORTS["core/ports
LLM / Fetch / Image / Publish / Store"]
PORTS --> INTEGRATIONS["integrations
外部服务 Adapter"]
INTEGRATIONS --> EXT["LLM / Search / Image / Weixin / Notify"]
WF --> STORAGE["ArtifactStore / RunStateStore / VectorStore"]
STORAGE --> LOCAL["Local SQLite / 文件"]
STORAGE --> CF["Cloudflare D1 / KV / R2"]
src/
app/weixin-article/ # 应用组装层:创建 provider、规划抓取、定义 workflow
features/weixin-article/ # 微信文章业务模型、服务、渲染和 workflow
integrations/ # 外部服务 adapter:LLM、fetch、image、publish、notify、vector
core/ # workflow runtime、ports 和通用基础能力
modules/ # 内容排序、摘要、Markdown 转换等内部可复用能力
platform/cloudflare/ # Cloudflare 可选部署入口
platform/local/ # 本地 artifact 和运行状态存储
utils/config/ # TypeScript 配置定义、解析与校验
架构细节见 架构总览。
部署时先选一种形态:
本地开发:
cp trendpublish.config.example.ts trendpublish.config.ts
deno task doctor
deno task dev
Docker 部署:
mkdir -p config data/temp
cp trendpublish.config.docker.example.ts config/trendpublish.config.ts
deno task docker
Docker 默认使用 ghcr.io/liyown/ai-trend-publish:latest,配置挂载到
/app/config/trendpublish.config.ts,运行产物挂载到 /app/src/temp。
Cloudflare 部署:
deno task cf dry-run
deno task cf migrate
deno task cf deploy
deno task cf smoke --url https://<worker-domain> --api-key <SERVER_API_KEY>
微信真实发布需要固定 IP:
weixin-relay 部署到固定 IP 机器,Cloudflare 只调用
relay,并把本次发布账号的微信凭证透传给 relay。relay 和主服务使用同一个镜像、同一套配置结构:
deno task docker relay
relay 只保存自己的 server.apiKey,不保存公众号 AppID/AppSecret,也不维护账号
列表。多公众号时,微信凭证和账号运营信息都在主服务侧维护;relay 只负责固定 IP
转发微信 API。
部署细节见 部署文档。
服务启动后提供 POST /api/workflow,可手动触发微信文章工作流。
curl -X POST http://localhost:8000/api/workflow \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"jsonrpc": "2.0",
"method": "triggerWorkflow",
"params": {
"workflowType": "weixin-article-workflow",
"dryRun": true
},
"id": 1
}'
更多说明见 JSON-RPC API 文档。
$ claude mcp add ai-trend-publish \
-- python -m otcore.mcp_server <graph>