WeRSS 微信公众号订阅助手技术分析
一、项目概述
1. 项目简介
WeRSS(We-MP-RSS)是一个开源的微信公众号订阅助手项目,旨在为用户提供符合阅读习惯的微信公众号内容管理方案。该项目通过微信公众号内容爬取和解析,自动生成 RSS 订阅源,使用户能够使用 RSS 阅读器订阅和管理微信公众号内容,摆脱微信应用的束缚。
项目仓库地址为 https://github.com/rachelos/we-mp-rss,采用前后端分离架构,后端使用 Python + FastAPI,前端使用 Vue 3 + Vite,数据库支持 SQLite 和 MySQL。
2. 核心功能
WeRSS 提供了丰富的功能特性,主要涵盖以下几个方面:
A. 内容管理功能
- 微信公众号内容爬取和解析:支持多种爬取方式,自动获取公众号文章列表和详情
- RSS 订阅源生成:为每个订阅的公众号自动生成标准 RSS 格式的订阅源
- 定时自动更新:可配置定时任务,自动抓取最新文章
- 标签订阅:支持按标签筛选和订阅公众号
B. 内容导出功能
- 导出为 Markdown:将公众号文章转换为 Markdown 格式
- 导出为 PDF:支持将文章导出为 PDF 文档
- 导出为其他格式:支持 docx、json 等多种格式导出
C. Web 管理界面
- 友好的用户界面:提供简洁易用的 Web 管理界面
- 二维码授权:支持扫码授权登录微信公众号
- 订阅管理:可视化的订阅列表管理
- 文章阅读:内置文章阅读器
D. 通知与集成
- 授权过期提醒:当公众号授权即将过期时自动提醒
- 自定义通知渠道:支持钉钉、微信、飞书和自定义 Webhook
- API 接口:提供完整的 RESTful API
- WebHook 支持:支持 Webhook 集成
- AI Agent 接入:支持 AI Agent 接入微信公众号
E. 定制化配置
- 自定义 RSS 标题、描述和封面
- 自定义 RSS 分页大小
- 多数据库支持:默认使用 SQLite,可选 MySQL
- 多 RSS 客户端支持
3. 技术架构
WeRSS 采用前后端分离的架构设计,主要技术栈包括:
A. 后端技术
- Python 3.13.1+:项目要求 Python 版本不低于 3.13.1
- FastAPI:高性能的 Python Web 框架,用于构建 RESTful API
- SQLite/MySQL:数据存储,默认使用 SQLite,可配置 MySQL
- 定时任务:内置任务调度系统,支持定时抓取文章
B. 前端技术
- Vue 3:渐进式 JavaScript 框架
- Vite:下一代前端构建工具
- Node.js 20.18.3+:前端开发环境要求
C. 系统架构图
graph TB
subgraph 前端
A[Vue3 + Vite]
end
subgraph 后端
B[FastAPI]
C[定时任务]
D[爬虫模块]
E[RSS生成]
end
subgraph 数据存储
F[(SQLite/MySQL)]
G[文件缓存]
end
subgraph 外部服务
H[微信公众号]
I[通知渠道]
end
A -->|HTTP API| B
B --> F
B --> G
C --> D
D --> H
D --> F
E --> B
B --> I
I --> J[钉钉/微信/飞书/自定义]二、系统工作原理
1. 核心工作流程
WeRSS 的核心工作流程可以分为订阅管理、内容爬取、RSS 生成和通知推送四个主要环节。
A. 订阅管理
用户通过 Web 界面添加要订阅的微信公众号,系统提供多种添加方式:
- 二维码授权:用户使用微信扫描二维码授权登录,系统自动获取已关注的公众号列表
- 手动添加:用户输入公众号名称或 ID,系统搜索并添加
- 标签订阅:用户选择感兴趣的标签,系统自动订阅相关公众号
订阅信息被保存到数据库中,包括公众号 ID、名称、授权状态等。
B. 内容爬取
系统的定时任务模块会周期性地执行内容爬取任务:
- 文章列表爬取:根据订阅列表,爬取每个公众号的最新文章列表
- 文章详情爬取:对新增文章,爬取完整的文章内容、图片、作者等信息
- 内容解析:解析微信公众号的 HTML 内容,提取正文、图片链接等关键信息
- 内容存储:将解析后的文章内容保存到数据库
爬取过程支持多种爬取方式,可以应对不同的反爬策略。
C. RSS 生成
当用户或其他系统请求 RSS 订阅源时,系统会执行以下步骤:
- 读取文章列表:从数据库中查询指定公众号的文章列表
- 生成 RSS XML:按照 RSS 2.0 标准格式生成 XML 文档
- 应用自定义配置:根据用户配置的标题、描述、封面等信息自定义 RSS
- 返回 RSS:将生成的 RSS 内容返回给请求方
D. 通知推送
当有新的文章被爬取或授权即将过期时,系统会触发通知推送:
- 检查通知条件:判断是否满足通知条件(新文章、授权过期等)
- 格式化通知内容:根据配置的格式(HTML/文本)格式化通知内容
- 调用 Webhook:向配置的通知渠道发送 Webhook 请求
- 记录通知结果:记录通知发送状态,处理失败重试
2. 工作流程时序图
以下时序图展示了从用户订阅到获取 RSS 的完整流程:
sequenceDiagram
participant U as 用户
participant W as Web界面
participant A as API服务
participant J as 定时任务
participant M as 微信公众号
participant D as 数据库
U->>W: 订阅公众号
W->>A: POST /api/subscribe
A->>D: 保存订阅信息
Note over J,D: 定时执行
J->>M: 爬取文章列表
M-->>J: 返回文章数据
J->>M: 爬取文章详情
M-->>J: 返回完整内容
J->>D: 保存文章
J->>A: 生成RSS
A->>D: 读取文章列表
A-->>U: 返回RSS Feed
U->>A: 获取RSS
A->>D: 查询文章
A-->>U: 返回RSS XML3. 数据模型
系统的核心数据模型包括以下几个实体:
A. 公众号信息
存储微信公众号的基本信息和授权状态,字段包括:
- 公众号 ID:唯一标识符
- 公众号名称:显示名称
- 授权状态:是否已授权
- 授权过期时间:授权的到期时间
- 最后更新时间:最后爬取时间
B. 文章信息
存储爬取的文章内容,字段包括:
- 文章 ID:唯一标识符
- 公众号 ID:关联的公众号
- 文章标题
- 文章内容(HTML/Markdown)
- 发布时间
- 原文链接
- 封面图片链接
C. 订阅关系
存储用户的订阅记录,字段包括:
- 用户 ID
- 公众号 ID
- 订阅时间
- 订阅状态
三、部署与安装
1. Docker 部署(推荐)
WeRSS 提供了预构建的 Docker 镜像,部署非常简单。
A. 快速启动
docker run -d \
--name we-mp-rss \
-p 8001:8001 \
-v ./data:/app/data \
ghcr.io/rachelos/we-mp-rss:latest启动后访问 http://localhost:8001/ 即可使用。
B. 配置说明
-p 8001:8001:将容器的 8001 端口映射到主机的 8001 端口-v ./data:/app/data:将主机的 data 目录挂载到容器,确保持久化存储
C. 国内加速镜像
对于国内用户,可以使用代理镜像加速访问:
docker run -d \
--name we-mp-rss \
-p 8001:8001 \
-v ./data:/app/data \
docker.1ms.run/rachelos/we-mp-rss:latestD. 升级更新
docker stop we-mp-rss
docker rm we-mp-rss
docker pull ghcr.io/rachelos/we-mp-rss:latest
docker run -d \
--name we-mp-rss \
-p 8001:8001 \
-v ./data:/app/data \
ghcr.io/rachelos/we-mp-rss:latest2. 源码部署
如果需要从源码部署,可以按照以下步骤操作。
A. 环境要求
- Python >= 3.13.1
- Node.js >= 20.18.3
B. 后端服务部署
- 克隆项目
git clone https://github.com/rachelos/we-mp-rss.git
cd we-mp-rss- 安装 Python 依赖
pip install -r requirements.txt- 配置数据库
复制配置文件模板并修改:
cp config.example.yaml config.yaml- 启动服务
python main.py -job True -init TrueC. 前端开发
- 安装前端依赖
cd we-mp-rss/web_ui
yarn install- 启动前端服务
yarn dev四、配置详解
1. 环境变量配置
WeRSS 通过 config.yaml 文件进行配置,支持丰富的环境变量。以下是主要的配置项说明:
A. 基础配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| APP_NAME | we-mp-rss | 应用名称 |
| SERVER_NAME | we-mp-rss | 服务器名称 |
| WEB_NAME | WeRSS微信公众号订阅助手 | 前端显示名称 |
| PORT | 8001 | API 服务端口 |
| DEBUG | False | 调试模式 |
B. 数据库配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| DB | sqlite:///data/db.db | 数据库连接字符串 |
| ARTICLE.TRUE_DELETE | False | 是否真正删除文章 |
C. 定时任务配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| ENABLE_JOB | True | 是否启用定时任务 |
| SPAN_INTERVAL | 10 | 定时任务执行间隔(秒) |
| THREADS | 2 | 最大线程数 |
| MAX_PAGE | 5 | 最大爬取页数 |
D. RSS 配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| RSS_BASE_URL | 空 | RSS 域名地址 |
| RSS_LOCAL | False | 是否使用本地 RSS 链接 |
| RSS_TITLE | 空 | RSS 标题 |
| RSS_DESCRIPTION | 空 | RSS 描述 |
| RSS_COVER | 空 | RSS 封面 |
| RSS_FULL_CONTEXT | True | 是否显示全文 |
| RSS_ADD_COVER | True | 是否添加封面图片 |
| RSS_CDATA | False | 是否启用 CDATA |
| RSS_PAGE_SIZE | 30 | RSS 分页大小 |
E. 通知配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| SEND_CODE | True | 是否发送授权二维码通知 |
| CODE_TITLE | WeRSS授权二维码 | 二维码通知标题 |
| DINGDING_WEBHOOK | 空 | 钉钉通知 Webhook URL |
| WECHAT_WEBHOOK | 空 | 微信通知 Webhook URL |
| FEISHU_WEBHOOK | 空 | 飞书通知 Webhook URL |
| CUSTOM_WEBHOOK | 空 | 自定义通知 Webhook URL |
| WEBHOOK.CONTENT_FORMAT | html | 文章内容发送格式 |
F. 内容收集配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| GATHER.CONTENT | True | 是否收集内容 |
| GATHER.MODEL | app | 收集模式 |
| GATHER.CONTENT_AUTO_CHECK | False | 是否自动检查未收集文章内容 |
| GATHER.CONTENT_AUTO_INTERVAL | 59 | 自动检查未收集文章内容的时间间隔(分钟) |
| GATHER.CONTENT_MODE | web | 内容修正模式 |
G. 安全配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| SECRET_KEY | we-mp-rss | 密钥 |
| SAFE_HIDE_CONFIG | db,secret,token,notice... | 隐藏的配置信息 |
| SAFE_LIC_KEY | RACHELOS | 授权加密密钥 |
| TOKEN_EXPIRE_MINUTES | 4320 | 登录会话有效期(分钟) |
H. 缓存与日志配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| CACHE.DIR | ./data/cache | 缓存目录 |
| LOG_FILE | 空 | 日志文件路径 |
| LOG_LEVEL | INFO | 日志级别 |
I. 其他配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
| USER_AGENT | Mozilla/5.0... | 用户代理 |
| AUTO_RELOAD | False | 代码变更时自动重启服务 |
| EXPORT_PDF | False | 是否启用 PDF 导出功能 |
2. 配置示例
以下是一个完整的 config.yaml 配置示例:
app:
name: we-mp-rss
server_name: we-mp-rss
web_name: WeRSS微信公众号订阅助手
port: 8001
debug: false
database:
url: sqlite:///data/db.db
article_true_delete: false
job:
enable: true
span_interval: 10
threads: 2
max_page: 5
rss:
base_url: ""
local: false
title: ""
description: ""
cover: ""
full_context: true
add_cover: true
cdata: false
page_size: 30
notification:
send_code: true
code_title: WeRSS授权二维码
dingding_webhook: ""
wechat_webhook: ""
feishu_webhook: ""
custom_webhook: ""
webhook_content_format: html
gather:
content: true
model: app
content_auto_check: false
content_auto_interval: 59
content_mode: web
security:
secret_key: your-secret-key
hide_config: db,secret,token,notice.wechat,notice.feishu,notice.dingding
lic_key: RACHELOS
token_expire_minutes: 4320
cache:
dir: ./data/cache
logging:
file: ""
level: INFO
other:
user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
auto_reload: false
export_pdf: false五、技术特点
1. 前后端分离架构
WeRSS 采用前后端分离的架构设计,前端使用 Vue 3 + Vite 构建,后端使用 FastAPI 提供 RESTful API。这种架构带来了以下优势:
- 开发效率提升:前后端可以独立开发和部署,提高了开发效率
- 可维护性强:前后端职责清晰,代码组织更加规范
- 扩展性好:可以轻松添加新的客户端(如移动端 App)
- 性能优化:前端可以使用 Vite 进行快速构建和热更新
2. 多爬取方式支持
系统支持多种微信公众号内容爬取方式,可以根据不同的反爬策略自动选择合适的爬取方法。这种设计提高了系统的稳定性和可靠性。
3. 灵活的通知机制
WeRSS 提供了丰富的通知渠道,包括钉钉、微信、飞书和自定义 Webhook。用户可以根据自己的需求选择合适的通知方式,及时获取新文章更新和授权过期提醒。
4. 多格式内容导出
系统支持将微信公众号文章导出为多种格式,包括 Markdown、PDF、DOCX 和 JSON。这使得用户可以根据不同的使用场景选择合适的导出格式。
5. 定时任务调度
内置的定时任务调度系统可以自动执行文章爬取任务,用户无需手动触发。同时支持配置爬取间隔、最大爬取页数等参数,灵活控制爬取行为。
6. API 接口完善
系统提供了完整的 RESTful API,支持第三方系统集成。通过 API,用户可以实现以下功能:
- 订阅管理
- 文章查询
- RSS 获取
- Webhook 配置
7. 数据库灵活切换
支持 SQLite 和 MySQL 两种数据库,用户可以根据自己的需求选择合适的数据库。SQLite 适合小型部署和单机使用,MySQL 适合大型部署和高并发场景。
六、应用场景
1. 个人阅读管理
对于经常阅读微信公众号内容的用户,WeRSS 提供了以下便利:
- 统一管理:在一个界面中管理所有关注的公众号
- RSS 订阅:使用熟悉的 RSS 阅读器阅读公众号内容
- 离线阅读:支持导出为 Markdown 或 PDF,方便离线阅读
- 内容归档:自动保存历史文章,便于回顾和搜索
2. 企业内容监测
企业可以使用 WeRSS 监测竞争对手或行业动态:
- 竞品监测:订阅竞争对手的公众号,及时了解其动态
- 行业资讯:订阅行业媒体的公众号,获取最新行业资讯
- 舆情监控:通过 Webhook 集成,将新文章推送到企业内部系统
3. 内容分析与挖掘
研究人员或分析师可以使用 WeRSS 进行内容分析:
- 数据采集:批量采集公众号文章数据
- 格式转换:将文章转换为结构化格式(JSON)
- 内容导出:导出为 Markdown 或 PDF,便于后续处理
4. AI Agent 集成
WeRSS 支持 AI Agent 接入,可以实现:
- 智能推荐:根据阅读历史推荐相关文章
- 内容摘要:自动生成文章摘要
- 智能问答:基于公众号内容构建知识库
七、项目亮点
1. 开源免费
WeRSS 是完全开源的项目,采用 MIT 许可证。用户可以免费使用、修改和分发,非常适合个人和小团队使用。
2. 部署简单
提供 Docker 镜像,一条命令即可完成部署。对于不熟悉 Python 和 Node.js 的用户,也可以轻松使用。
3. 功能完整
涵盖了微信公众号订阅管理的各个方面,从订阅、爬取、RSS 生成到通知推送,功能齐全。
4. 持续更新
项目活跃度高,持续更新维护。根据 GitHub 数据,项目拥有 1.8k+ Star,300+ Fork,用户反馈积极。
5. 社区支持
项目拥有活跃的社区,用户可以通过 GitHub Issues 提问和反馈问题。同时项目还提供了详细的文档和使用说明。
八、注意事项
1. 合规使用
使用 WeRSS 爬取微信公众号内容时,需要注意:
- 尊重版权:爬取的内容仅供个人使用,不得用于商业用途
- 遵守协议:遵守微信公众号的服务协议和 robots.txt 规则
- 合理频率:设置合理的爬取频率,避免对服务器造成压力
2. 数据安全
- 备份数据:定期备份数据库,防止数据丢失
- 权限控制:如果部署在公网,建议配置访问控制和身份认证
- 密钥保护:妥善保管 SECRET_KEY 等敏感配置
3. 性能优化
- 数据库选择:对于大量订阅和文章,建议使用 MySQL 替代 SQLite
- 缓存配置:合理配置缓存目录,提高访问速度
- 定时任务:根据实际需求调整定时任务的执行间隔和线程数
4. 反爬策略
微信公众号可能采取反爬措施,建议:
- 更新频率:及时关注项目更新,获取最新的反爬应对方案
- 多种方式:系统支持多种爬取方式,当一种失效时可以尝试其他方式
- User Agent:合理配置 User Agent,模拟正常访问
九、总结
WeRSS 是一个功能完整、设计优雅的微信公众号订阅管理工具。它通过前后端分离的架构设计,提供了稳定可靠的内容爬取和 RSS 生成功能。项目开源免费,部署简单,非常适合个人和小团队使用。
对于希望摆脱微信应用束缚,使用 RSS 阅读器管理微信公众号内容的用户来说,WeRSS 是一个理想的选择。同时,其完善的 API 接口和 Webhook 支持,也为企业级应用和二次开发提供了可能。
参考资料
- WeRSS GitHub 仓库 - 项目主页
- WeRSS 知乎专栏文章 - 项目介绍