如何把微信公众号文章变成 RSS 订阅源:wewe-rss 私有化部署完整指南
【免费下载链接】wewe-rss🤗更优雅的微信公众号订阅方式,支持私有化部署、微信公众号RSS生成(基于微信读书)项目地址: https://gitcode.com/GitHub_Trending/we/wewe-rss
微信公众号 RSS 订阅听起来不复杂,但现实中公众号没有开放订阅入口,文章又散落在各自的推送历史里。wewe-rss 是一个可以私有化部署的项目,它基于微信读书接口抓取公众号内容,生成标准 RSS / Atom / JSON 订阅源,让任何 RSS 阅读器统一管理这些文章。这篇文章按"先看清它能干什么、再一条链路搭起来"的顺序走一遍,从启动服务到把新文章推进群,都有对应步骤。
wewe-rss 能解决什么:三个典型使用场景
十几个号的消息散落在微信里
添加多个公众号之后,所有号的新文章都会进同一条聚合流,阅读器里只需订一个地址;每个公众号也有独立订阅地址,可以单独挑着看。服务支持把所有订阅源导出 OPML,换个阅读器时一键迁移。
只追一个主题,却被大量推送淹没
公众号的内容经常混杂:讲技术的号也会发招聘、活动和转载。在订阅地址上追加title_include与title_exclude两个查询参数即可,多个关键词用竖线|分隔,例如http://localhost:4000/feeds/all.atom?title_include=AI|机器学习&title_exclude=招聘,效果是只保留标题命中前一组关键词、且不含后一组关键词的条目。过滤在服务端完成,阅读器端不用做任何改造。
希望在阅读器里直接读全文
默认情况下订阅流只携带标题、封面和链接。设置环境变量FEED_MODE=fulltext(或单次请求追加mode=fulltext,单次参数优先于全局配置)后,服务会抓取文章正文写进 feed,在阅读器里直接读完,不用跳回微信。全文输出会让接口响应变慢、内存占用变高,不必常开,临时需求用单次参数更合适。
wewe-rss 私有化部署步骤:从 0 到订阅地址一条链路
启动服务
推荐 Docker Compose,一条命令同时拉起服务与数据库:
git clone https://gitcode.com/GitHub_Trending/we/wewe-rss cd wewe-rss docker compose up -d服务默认监听4000 端口,浏览器打开http://localhost:4000即进入管理界面。不想用 Docker 也可以本地跑:pnpm install && pnpm run -r build && pnpm run start:server,完整说明见 README.md。
💡更轻量的替代:把启动文件换成 docker-compose.sqlite.yml,用 SQLite 版本,省去单独部署 MySQL。
绑定微信读书账号
抓取公众号内容的凭证是微信读书账号。进入账号管理页面,点击右上角添加读书账号,用手机扫码登录,账号保存在服务端,仅用于抓取文章。
💡两个易踩的坑:扫码登录时不要勾选"24 小时后自动退出",否则凭证很快失效;账号列表出现"今日小黑屋"状态说明临时封控,等一天会自行恢复。
添加公众号源,拿到订阅地址
切到公众号源标签页,点左上角添加,在弹窗里粘贴该公众号的任意一篇分享链接,点确定。服务会自动识别公众号并抓取历史文章;添加频率过高同样会触发临时封控,一般 24 小时左右恢复。
添加成功后,每个公众号对应一个独立订阅地址,从列表页的RSS按钮可直接复制,常见两种形态:
- 单个公众号:
http://localhost:4000/feeds/{公众号ID}.rss - 全部聚合:
http://localhost:4000/feeds/all.rss
⚠️公网部署注意:如果要把服务放到公网给别人用,务必在环境变量里设置SERVER_ORIGIN_URL为服务器公网 IP 或域名,否则生成的链接指向 localhost,别人无法打开。
配置旋钮速查:筛选、全文、频率、限流
旋钮分两类:查询参数写在订阅地址后,即时生效;环境变量改 docker-compose.yml 后重启容器生效。
| 旋钮 | 设置位置 | 作用 | 默认值 |
|---|---|---|---|
title_include | 订阅地址查询参数 | 只保留标题命中关键词的条目,多值用\|分隔 | 无 |
title_exclude | 订阅地址查询参数 | 排除标题命中关键词的条目,多值用\|分隔 | 无 |
mode | 订阅地址查询参数 | 单次请求输出全文(mode=fulltext),优先于FEED_MODE | 关闭 |
limit/page | 订阅地址查询参数 | 每页条数与页码 | 单源 10 / 聚合 30,第 1 页 |
update | 订阅地址查询参数 | update=true手动触发该源立即抓取 | 关闭 |
FEED_MODE | 环境变量 | 全局全文模式,取值fulltext | 关闭 |
CRON_EXPRESSION | 环境变量 | 定时抓取任务的 Cron 表达式 | 35 5,17 * * *(北京时间每天 5:35 与 17:35) |
MAX_REQUEST_PER_MINUTE | 环境变量 | 接口限流,每分钟最大请求次数 | 60 |
输出格式由地址后缀决定:.rss兼容性最广(RSS 2.0),.atom标准更严格,.json是 JSON Feed,适合程序解析;后缀无法识别时按 atom 处理。聚合流里每条条目还会标注来源公众号,单源流则不显示。
把新文章推进群,或交给脚本处理
用钉钉机器人接收推送
仓库 wewe-rss-dingtalk/ 目录自带一个独立推送服务:它直接查数据库里最近 12 小时的新文章,通过机器人 Webhook 以 markdown 消息推到群里,脚本每 4 小时跑一轮。接入只需两步:在main.py填入机器人的access_token和secret,再在 compose 文件里放开13306:3306数据库端口映射,然后python3 main.py或docker-compose up -d运行。新文章发布不久,团队就能在群里看到,不需要轮询任何接口。
让脚本消费聚合流
聚合流本身就是标准 JSON Feed,任何脚本都能直接消费:
import requests resp = requests.get( "http://localhost:4000/feeds/all.json", params={"limit": 20, "title_include": "AI"}, ) for item in resp.json()["items"][:5]: print(item["title"])把这段放进定时任务,接上邮件、飞书或自己的告警系统,就能按自己的规则处理新文章。
内部是怎么跑的:从请求到 feed 生成
- 后端是 NestJS,核心生成逻辑在 feeds.service.ts:
handleGenerateFeed先从数据库取出文章列表,再按请求后缀渲染 RSS 2.0、Atom 或 JSON Feed,标题过滤在渲染完成后应用。 - 前端管理界面位于 apps/web/src/,React + Vite 技术栈。
- 数据模型与迁移文件在 apps/server/prisma/schema.prisma 旁的 migrations 目录。
- 抓取文章正文带一层 LRU 缓存,最多存 5000 条,热门文章的二次访问直接命中缓存,不再请求微信。
- 想改代码可以从
handleGenerateFeed入手,加一种输出格式或过滤条件都很顺手。
开始之前的一条建议
先只订阅 2~3 个天天看的公众号,跑一周再调title_include和CRON_EXPRESSION,一周的真实数据比一堆配置项更能说明哪些设置对你有用。另外若服务对外暴露,记得设置AUTH_CODE——/feeds路径不受限,该授权码保护的是管理类接口,能防止陌生人改动你的公众号列表。
【免费下载链接】wewe-rss🤗更优雅的微信公众号订阅方式,支持私有化部署、微信公众号RSS生成(基于微信读书)项目地址: https://gitcode.com/GitHub_Trending/we/wewe-rss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考