TrendPublish 是一个基于 Deno 和 TypeScript 的微信文章自动发布系统。它可以抓取网页、RSS、Twitter/X 等数据源,使用大模型完成内容排序、摘要、标题、排版和配图,最后生成并发布到微信公众号。
项目当前聚焦一条主链路:微信文章发布。配置集中在
trendpublish.config.ts,可以用 TypeScript
类型提示组织模型、抓取源、模板、图片、去重和通知能力。
示例公众号:AISPACE科技空间
社区交流:
- Discord: https://discord.gg/mrZvBHNawS
- QQ 群: TrendPublish-1
- 多源抓取:支持普通 URL、RSS/RSSHub、FireCrawl、Jina Reader / DeepSearch、 Twitter/X 与 Xquik。
- AI 内容处理:支持 OpenAI Chat Completions 兼容接口,用于排序、摘要、润色、标题和动态模板生成。
- 微信文章渲染:内置多套公众号模板,支持
dynamic动态模板和minimal等静态模板。 - 智能配图:支持阿里云图片生成和 MiniMax 图片生成,用于封面图和可选正文配图。
- 服务覆盖:大模型、数据源获取、图片生成、发布、通知和存储都按能力拆分, 现在能直接使用,后续也方便继续补充。
- 发布与调试:支持微信公众号草稿/发布接口,也支持 dry-run 输出本地 HTML。
- 日志观测:所有 Logger 输出都可镜像到结构化 stdout 或 HTTP 日志平台。
- 可选增强:支持本地 SQLite / Cloudflare D1 向量去重,以及 Bark、钉钉、飞书工作流通知。
- 每天自动整理技术、产品、商业或研究资讯,并发布到微信公众号。
- 使用固定数据源生成 AI 资讯简报。
- 用可控模板生成公众号正文,减少手动排版成本。
- 需要先本地预览、dry-run 验证,再正式发布的内容工作流。
需要 Deno v2.0.0 或更高版本。
Windows:
irm https://deno.land/install.ps1 | iexmacOS / Linux:
curl -fsSL https://deno.land/install.sh | shgit clone https://github.com/liyown/ai-trend-publish
cd ai-trend-publishcp 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
# 启动本地 API 服务 + Dashboard 前端热更新
deno task devdeno task dev 会同时启动后端服务 http://localhost:8000 和 Vite Dashboard
http://localhost:5173/dashboard/,前端修改会自动刷新并代理 /api 到本地后端。
article --dry-run 会把渲染后的 HTML 输出到
src/temp/,适合正式发布前检查正文效果。
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 |
完整字段说明见 配置说明。
最简单的写法是直接放 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 名,而是你自己定义的抓取分组名。
当前版本建议先用一套稳定的大模型配置跑通主链路,再按需开启抓取增强、图片生成、 去重和通知。
- OpenAI:申请地址;
baseUrl填https://api.openai.com/v1;model按平台模型列表选择。 - DeepSeek:申请地址;
baseUrl填https://api.deepseek.com/v1;常用模型为deepseek-chat、deepseek-reasoner。 - 通义千问 / DashScope:申请地址;
baseUrl填https://dashscope.aliyuncs.com/compatible-mode/v1;常用模型为
qwen-plus、qwen-max。
- 普通网页 URL:直接写到
features.article.sources。 - RSS / RSSHub:直接写 RSS URL;RSSHub 可配置
providers.fetch.rss.baseUrl。 - FireCrawl:申请地址;配置
providers.fetch.firecrawl.apiKey。 - Jina Reader / DeepSearch:申请地址;配置
providers.fetch.jina.apiKey。 - Twitter/X:申请地址;配置
providers.fetch.twitter.bearerToken。 - Xquik:申请地址;配置
providers.fetch.twitter.xquikApiKey。 - 后续:GitHub、Hacker News、Product Hunt、YouTube、搜索引擎结果源。
- 阿里云图片生成:申请地址;配置
providers.image.dashscope.apiKey。 - MiniMax 图片生成:申请地址;配置
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开启,可设置生成模型、数量和尺寸。 - 后续:OpenAI Images、Gemini / Imagen、Replicate、Stability、ComfyUI。
- 微信公众号:申请地址;配置
providers.publish.weixin.appId和providers.publish.weixin.appSecret。 - Cloudflare 真实发布推荐使用
weixin-relay,微信凭证只放在固定 IP 机器上。 - 当前支持:封面上传、正文图片上传、草稿创建和发布。
- 正式发布前需要在公众号后台配置 IP 白名单。
- 后续:Twitter/X thread、Telegram、飞书文档、Notion、静态站点、Webhook。
- 向量去重:DashScope Embedding;常用模型为
text-embedding-v3。 - 存储:本地/Docker 使用文件和 SQLite;Cloudflare 原生模式使用 R2、KV、D1。
- 通知:当前支持 Bark、钉钉机器人、飞书机器人。
- 后续:OpenAI / Jina / BGE Embedding、PostgreSQL、SQLite、Vectorize、 企业微信、Telegram、Slack、Discord、邮件通知。
模板通过 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
deno task preview
# 质量检查
deno task verify
deno task test
# 本地前端/文档开发
deno task dashboard
deno task docs
# 部署
deno task docker
deno task relay
deno task cf deploydeno task dashboard 只启动 Dashboard 前端 dev server;日常开发推荐直接用
deno task dev,它会同时启动后端和前端 watch。
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 配置定义、解析与校验
架构细节见 架构总览。
本地或服务器直接运行:
deno task doctor
deno task article --dry-run
deno task devDocker 推荐使用已经发布到 GHCR 的镜像:
docker pull ghcr.io/liyown/ai-trend-publish:latest
docker compose up -d容器默认读取 /app/config/trendpublish.config.ts,通常把本地
./config/trendpublish.config.ts 挂载进去即可。镜像由 GitHub Actions 自动构建,
不需要在服务器上本地构建。镜像内已经包含 dashboard 构建产物,启动后访问
http://localhost:8000/dashboard。
微信 relay 也是同一个镜像、同一个配置文件名,只是启动命令不同:
cp trendpublish.config.example.ts config/trendpublish.config.ts
deno task docker relayCloudflare 提供 Worker / Workflows 原生入口,适合远程 HTTP 触发或 Cron
定时发布。运行状态写入 KV/D1,文章产物和 dry-run HTML 写入 R2 或 KV
fallback,并可通过 /dashboard 查看步骤、错误和产物。部署后可以用
deno task cf smoke 检查 /api/health、创建一次 dry-run
Workflow,并轮询到最终结果。Cloudflare 真实发布 建议调用固定 IP 机器上的
weixin-relay,避免微信 IP 白名单问题。
源码部署时,deno task dev、deno task cf dry-run 和 deno task cf deploy
都会自动构建 dashboard。Cloudflare 部署会把 dashboard 作为 Workers Static Assets
发布。
正式发布微信公众号前,需要:
- 本地/Docker 直连发布:配置
providers.publish.weixin.appId和providers.publish.weixin.appSecret。 - Cloudflare 发布:部署
weixin-relay,配置providers.publish.weixinRelay.url/token。 - 在公众号后台配置固定 IP 机器的白名单。
- 先跑 dry-run 检查正文和图片。
- 再设置
features.article.dryRun: false执行真实发布。
部署细节见 部署文档。
服务启动后提供 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 文档。
- Discord: https://discord.gg/mrZvBHNawS
- QQ 群:TrendPublish-1
欢迎提交 Issue 和 Pull Request。建议在提交前先运行:
deno task verify感谢社区贡献者对项目的支持。
本项目使用 MIT License,详见 LICENSE。