# ForgeRSS
**Repository Path**: usdt/ForgeRSS
## Basic Information
- **Project Name**: ForgeRSS
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-01
- **Last Updated**: 2026-09-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ForgeRSS
### 将任意网站转换为 RSS 订阅源 | 多引擎抓取 + 反爬突破 + 社交媒体支持 | 完全开源免费
**完全开源 | 免费使用 | 自动更新 | 多引擎抓取 | 政府网站反爬突破 | Docker 支持**
[](https://github.com/tmwgsicp/ForgeRSS/stargazers)
[](LICENSE)
[](https://hub.docker.com/r/tmwgsicp/forgerss)
[](https://www.python.org/)
> **100% 开源,100% 免费。** 代码完全公开,私有化部署无任何限制,不搞"开源"之名行收费之实。
---
## 功能特性
- **多引擎抓取** — curl_cffi + Selenium + DrissionPage,自动选择最优方案
- **AI 编程工具文档订阅** — 支持 OpenAI Codex、Claude Code、Cursor、Qwen Code 等完整开发文档抓取
- **社交媒体订阅** — 知乎、B 站、小红书、知识星球,统一登录态管理 + URL/纯 ID 双输入
- **公司公告订阅** — 巨潮资讯网,支持「关键词主题 / 分类 / 全市场最新」三种模式 + PDF 自动下载
- **附件归档** — 知识星球帖子内的 PDF / 音频 / 图片按 `<群名>_<群ID>/<话题>_/` 自动归档;B 站视频可选下载
- **智能登录态检测** — URL 重定向 + HTML 关键词三层判断,登录态过期自动通知,Profile 复用零配置
- **流式 RSS 生成** — 内存优化的批量处理,支持数百篇长文档
- **政府网站反爬突破** — 支持绕过瑞数信息等商用反爬系统(需桌面环境)
- **智能去重** — 基于 URL 哈希,避免重复文章
- **双存储方案** — JSON 缓存 (GitHub 托管) + SQLite (本地/Docker)
- **标准 RSS 2.0** — CDATA 包裹 + 内联样式,兼容 Readwise、FreshRSS 等阅读器
- **灵活更新频率** — 新闻每 6 小时更新,文档每周更新,节省资源
- **GitHub Actions** — 全自动定时更新,CI 自动构建 Docker 镜像 + tar 包
- **Docker 支持** — 一键部署,适合自托管
---
## 可用 RSS 订阅源
以下是已部署的 RSS 源,可直接在 RSS 阅读器中订阅:
| 信息源 | 订阅链接 |
|--------|----------|
| **Anthropic News** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_anthropic_news.xml) |
| **Anthropic Research** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_anthropic_research.xml) |
| **Anthropic Engineering** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_anthropic_engineering.xml) |
| **OpenAI Research** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_openai_research.xml) |
| **OpenAI Codex Docs** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_openai_codex_docs.xml) |
| **Claude Code Docs** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_claude_code_docs.xml) |
| **Cursor Docs** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_cursor_docs.xml) |
| **Qwen Code Docs** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_qwen_code_docs.xml) |
| **IDSociety Science Speaks** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_idsociety.xml) |
| **巨潮资讯网公司公告** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_cninfo_announcements.xml) |
| **小宇宙播客(示例订阅)** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_xiaoyuzhou.xml) |
| **雪球用户动态(示例订阅)** | [订阅](https://cdn.jsdelivr.net/gh/tmwgsicp/ForgeRSS@main/feeds/feed_xueqiu_user.xml) |
| **国家药监局药品公告** | 需本地运行(见下方说明) |
| **知乎热榜** | 需本地运行(见下方说明) |
| **知乎用户动态** | 需本地运行(见下方说明) |
| **B 站 UP 主视频** | 需本地运行(见下方说明) |
| **小红书用户笔记** | 需本地运行(见下方说明) |
| **知识星球话题** | 需本地运行(见下方说明) |
| **抖音用户视频** | 需本地运行(见下方说明) |
| **快手用户视频** | 需本地运行(见下方说明) |
| **微博用户动态** | 需本地运行(见下方说明) |
> **更新频率**:新闻类 Feed 每 6 小时自动更新,文档类 Feed 每周更新一次(周一 00:00 UTC)。所有 Feed 包含完整文章内容,使用 jsDelivr CDN 托管,兼容所有 RSS 阅读器。
### 详细信息源列表
| 信息源 | 分类 | 抓取方式 | Feed 文件 | 更新频率 | 运行环境 |
|--------|------|----------|-----------|----------|----------|
| Anthropic News | AI | curl_cffi | `feed_anthropic_news.xml` | 6小时 | CI/本地 |
| Anthropic Research | AI | curl_cffi | `feed_anthropic_research.xml` | 6小时 | CI/本地 |
| Anthropic Engineering | AI | curl_cffi | `feed_anthropic_engineering.xml` | 6小时 | CI/本地 |
| OpenAI Research | AI | curl_cffi | `feed_openai_research.xml` | 6小时 | CI/本地 |
| OpenAI Codex Docs | AI 编程工具 | curl_cffi + Selenium | `feed_openai_codex_docs.xml` | **每周** | CI/本地 |
| Claude Code Docs | AI 编程工具 | Selenium | `feed_claude_code_docs.xml` | **每周** | CI/本地 |
| Cursor Docs | AI 编程工具 | Selenium | `feed_cursor_docs.xml` | **每周** | CI/本地 |
| Qwen Code Docs | AI 编程工具 | curl_cffi | `feed_qwen_code_docs.xml` | **每周** | CI/本地 |
| IDSociety Science Speaks | 医学 | Selenium | `feed_idsociety.xml` | 6小时 | CI/本地 |
| **国家药监局 (NMPA)** | 政府 | **DrissionPage** | `feed_nmpa_drug.xml` | **手动** | **仅本地** |
| 巨潮资讯网 | 金融 | curl_cffi | `feed_cninfo_announcements.xml` | 6小时 | CI/本地 |
| **知乎热榜** | 社交媒体 | **DrissionPage + 登录** | `feed_zhihu_hot.xml` | **手动** | **仅本地** |
| **知乎用户动态** | 社交媒体 | **DrissionPage + 登录** | `feed_zhihu_user.xml` | **手动** | **仅本地** |
| **B 站 UP 主** | 社交媒体 | **DrissionPage + 登录** | `feed_bilibili_up.xml` | **手动** | **仅本地** |
| **小红书用户** | 社交媒体 | **DrissionPage + 登录** | `feed_xiaohongshu_user.xml` | **手动** | **仅本地** |
| **知识星球话题** | 社交媒体 | **DrissionPage + 登录** | `feed_zsxq_topics.xml` | **手动** | **仅本地** |
| **抖音用户** | 社交媒体 | **DrissionPage + 登录 + CDP + ffmpeg** | `feed_douyin_user.xml` | **手动** | **仅本地** |
| **快手用户** | 社交媒体 | **DrissionPage + 登录 + CDP** | `feed_kuaishou_user.xml` | **手动** | **仅本地** |
| **微博用户** | 社交媒体 | **DrissionPage + 登录** | `feed_weibo_user.xml` | **手动** | **仅本地** |
| 小宇宙播客 | 播客 | curl_cffi (Next.js SSR) | `feed_xiaoyuzhou.xml` | 6小时 | **CI/本地** |
| 雪球用户 | 金融 | DrissionPage headless(无登录) | `feed_xueqiu_user.xml` | 6小时 | **CI/本地** |
---
## 快速使用
### 方式一:直接订阅(推荐)
复制上方订阅链接到你的 RSS 阅读器即可使用。
如需自定义,可 Fork 本项目,启用 GitHub Actions,Feed 会自动生成到 `feeds/` 目录:
```
https://cdn.jsdelivr.net/gh/你的用户名/ForgeRSS@main/feeds/feed_anthropic_news.xml
```
> 使用 jsDelivr CDN 链接可确保正确的 Content-Type,兼容 FreshRSS、Inoreader 等阅读器。
### 方式二:Docker 部署
```bash
# 方式一:使用 docker-compose(推荐)
git clone https://github.com/tmwgsicp/ForgeRSS.git
cd forgerss
docker-compose up
# 方式二:直接运行
docker run -v ./feeds:/app/feeds tmwgsicp/ForgeRSS:latest
```
### 方式三:本地运行
```bash
# 克隆项目
git clone https://github.com/tmwgsicp/ForgeRSS.git
cd forgerss
# 安装依赖
pip install -r requirements.txt
# (可选) 抖音视频下载需要 ffmpeg
# Windows: scoop install ffmpeg 或 choco install ffmpeg
# macOS: brew install ffmpeg
# Linux: sudo apt install ffmpeg / sudo dnf install ffmpeg
# 验证: ffmpeg -version
# 运行所有生成器
python scripts/run_all.py
# 运行单个生成器
python scripts/run_single.py anthropic_news --max 20
# 运行 AI 编程工具文档生成器
python scripts/run_single.py cursor_docs --max 100
# 运行社交媒体生成器(需先登录,见下方说明)
python scripts/run_single.py zhihu_hot --max 30
BILIBILI_UP_MID=546195 python scripts/run_single.py bilibili_up --max 10
XHS_USER_ID=664f367c00000000070064da python scripts/run_single.py xiaohongshu_user --max 10
ZSXQ_GROUP_ID=88514182418182 python scripts/run_single.py zsxq_topics --max 20
# 运行巨潮公告(按主题关键词)
CNINFO_KEYWORDS=股权激励 python scripts/run_single.py cninfo_announcements --max 20
```
---
## 抓取策略
### 多引擎抓取
| 方案 | 速度 | 适用场景 | 运行环境 |
|------|------|----------|----------|
| **curl_cffi** | ~5秒 | SSR/静态网站,模拟 Chrome TLS 指纹 | 任意 |
| **Selenium** | ~30秒 | 需要 JS 渲染的网站 | CI/本地 |
| **DrissionPage** | ~30秒 | 政府网站/强反爬网站(瑞数等) | **仅桌面环境** |
系统会自动选择最优方案:先尝试 curl_cffi,失败时降级到 Selenium,最后尝试 DrissionPage。
### 反爬等级 (anti_bot_level)
| 等级 | 说明 | 抓取策略 | 典型场景 |
|------|------|----------|----------|
| `0` | 普通网站 | curl_cffi → Selenium → DrissionPage | Anthropic, OpenAI |
| `1` | 中等反爬 | DrissionPage headless → headed | 部分企业网站 |
| `2` | 强反爬(瑞数等) | DrissionPage headed | 政府网站(NMPA) |
| `3+` | 需要登录态 | DrissionPage + 持久化登录 Profile | 社交媒体(知乎、B 站、小红书、知识星球) |
**说明**:
- **Level 0-2** 由 `smart_fetch` 自动处理
- **Level 3+** 需要各 generator 自行实现登录逻辑(每个平台一个 `scraper.py`,共享 `generators/utils/login_checker.py` 做登录态检测)
---
## 政府网站反爬突破方案
很多政府网站(如 NMPA 国家药监局)使用商用反爬系统(瑞数信息 RuiShu),会拦截所有自动化访问(HTTP 412)。本项目提供了专门的解决方案。
### 支持绕过的反爬系统
- **瑞数信息 (RuiShu)** — 国内政府网站常用
- **其他 JS 挑战类反爬** — 需要执行 JS 后才能访问的网站
### 技术原理
| 工具 | Headless 模式 | 非 Headless 模式 |
|------|--------------|------------------|
| Selenium | 被拦截 | 被拦截 |
| Playwright | 被拦截 | 被拦截 |
| **DrissionPage** | 被拦截 | **可以绕过** |
DrissionPage 使用 CDP 协议直接控制 Chrome,伪装更彻底,配合以下措施可绕过瑞数:
1. **非 Headless 模式** — 必须有真实显示器或虚拟显示
2. **干净的浏览器 Profile** — 每次请求使用新的临时 Profile
3. **反检测 JS 注入** — 隐藏 `navigator.webdriver` 等特征
### 运行环境要求
由于必须使用非 Headless 模式,政府网站抓取**无法在 GitHub Actions 等 CI 环境运行**。
| 环境 | 是否支持 | 说明 |
|------|---------|------|
| Windows 桌面 | 支持 | 推荐,直接运行 |
| Windows Server + RDP | 支持 | 需保持桌面会话 |
| Linux + 桌面环境 | 支持 | GNOME/KDE + VNC |
| Linux + Xvfb | 可能不支持 | 虚拟显示可能被检测 |
| Docker / CI | 不支持 | 无真实显示器 |
### 使用方式
```bash
# 运行 NMPA 药品公告抓取(需桌面环境)
python scripts/run_single.py nmpa_drug --max 30
# 或直接调用,支持翻页
python generators/medical/nmpa_drug.py --max 30 --pages 2 --full
```
### 定时运行建议
1. **Windows 任务计划程序** — 每天定时运行,生成后推送到 GitHub
2. **本地 cron** — Linux 桌面环境下配置定时任务
3. **手动运行** — 需要更新时手动执行
```bash
# 运行后推送到 GitHub
python scripts/run_single.py nmpa_drug --max 50
git add feeds/ cache/
git commit -m "chore: update NMPA feed"
git push
```
### 添加新的政府网站源
```python
from generators.base import Article, BaseFeedGenerator
from generators.utils import smart_fetch
class MyGovGenerator(BaseFeedGenerator):
FEED_NAME = "my_gov"
FEED_TITLE = "某政府网站"
FEED_URL = "https://www.example.gov.cn/news/"
# 设置反爬等级为 2(强反爬)
ANTI_BOT_LEVEL = 2
CONTENT_CHECK = "/news/" # 验证抓取成功的字符串
def fetch_articles(self) -> list[Article]:
html = smart_fetch(
self.FEED_URL,
anti_bot_level=self.ANTI_BOT_LEVEL,
content_check=self.CONTENT_CHECK,
selenium_wait=8,
)
# 解析 HTML,返回 Article 列表
...
```
---
## 社交媒体订阅(需登录态)
知乎、B 站、小红书、知识星球需要**登录态**才能访问,统一使用 DrissionPage 复用浏览器登录会话。
### 首次设置(登录)
每个平台首次使用时扫码登录一次,Profile 落盘到 `profiles//`,之后所有运行自动复用:
```bash
# 知乎
python -m generators.social.zhihu.scraper --login
# B 站
python -m generators.social.bilibili.scraper --login
# 小红书
python -m generators.social.xiaohongshu.scraper --login
# 知识星球
python -m generators.social.zsxq.scraper --login
# 抖音(视频下载需 ffmpeg)
python -m generators.social.douyin.scraper --login
# 快手
python -m generators.social.kuaishou.scraper --login
# 微博
python -m generators.social.weibo.scraper --login
```
> **小宇宙** 无需登录 / 浏览器 / 任何 setup —— curl_cffi 一击就过(吃 Next.js SSR
> 数据),见下方独立章节。
>
> **雪球** 无需登录,DrissionPage headless 模式直接过 Aliyun WAF,**CI 可跑**,
> 见下方独立章节。
### 验证登录态
随时确认 Profile 还有效(包含杀进程后重启验证、关键词命中报告):
```bash
python tools/test_login_check.py zhihu
python tools/test_login_check.py bilibili
python tools/test_login_check.py xiaohongshu
python tools/test_login_check.py zsxq
```
### 使用方式
```bash
# 知乎热榜(无需额外配置)
python scripts/run_single.py zhihu_hot --max 50
# 知乎用户动态
ZHIHU_USER_ID=excited-vczh python scripts/run_single.py zhihu_user --max 20
# B 站 UP 主视频(多个用逗号分隔)
BILIBILI_UP_MID="546195,12345678" python scripts/run_single.py bilibili_up --max 20
# 小红书用户笔记(接受纯 user_id 或完整主页 URL,URL 形式更稳)
XHS_USER_ID="664f367c00000000070064da" python scripts/run_single.py xiaohongshu_user --max 10
XHS_USER_ID="https://www.xiaohongshu.com/user/profile/664f367c00000000070064da?xsec_token=..." \
python scripts/run_single.py xiaohongshu_user --max 10
# 知识星球话题(接受纯 group_id 或完整 URL,可下载帖内附件)
ZSXQ_GROUP_ID="88514182418182" ZSXQ_DOWNLOAD_ATTACHMENTS=true \
python scripts/run_single.py zsxq_topics --max 20
# 抖音用户视频(接受 sec_uid / 完整 URL / 分享短链;下载需 ffmpeg)
DOUYIN_SEC_UID="MS4wLjABAAAAxxxx" python scripts/run_single.py douyin_user --max 10
# 或:DOUYIN_SEC_UID="https://v.douyin.com//" ...
DOUYIN_SEC_UID="MS4wLjABAAAAxxxx" DOUYIN_DOWNLOAD_VIDEOS=true \
python scripts/run_single.py douyin_user --max 5
# 快手用户视频(接受用户 id / 完整 URL / 分享短链;单文件 mp4,免 ffmpeg)
KUAISHOU_USER_ID="3xxxxxxxxxxxxxx" python scripts/run_single.py kuaishou_user --max 10
KUAISHOU_USER_ID="https://v.kuaishou.com//" KUAISHOU_DOWNLOAD_VIDEOS=true \
python scripts/run_single.py kuaishou_user --max 5
# 微博用户(自动识别纯文字 / 图文 / 纯图 / 视频四种帖型)
WEIBO_USER_ID="1234567890" python scripts/run_single.py weibo_user --max 10
# 或粘贴完整 URL:
WEIBO_USER_ID="https://weibo.com/u/1234567890" python scripts/run_single.py weibo_user --max 10
```
### 内容说明
- **知乎热榜**:包含排名、标题、热度、摘要、封面图
- **知乎用户动态**:包含回答、文章、赞同等活动
- **B 站 UP 主**:视频标题、BV 链接、封面、播放/弹幕/时长,可选下载 mp4
- **小红书用户**:笔记标题、作者、完整 URL(带 xsec_token 防失效),可选下载图片/视频
- **知识星球**:话题文本、作者、发布时间,可选下载帖内 PDF / 音频 / 图片附件(按 `<群名>_<群ID>/<话题>_/` 归档)
- **抖音**:自动识别两种贴型 —— **视频帖** `/video/`(标题含 hashtag、作者、真实视频 URL;可选 mp4 下载,通过 CDP 拦截 douyinvod.com CDN 流,video + audio 分两路用 curl_cffi 下载后 ffmpeg 合并,**需本机安装 ffmpeg**);**图文笔记** `/note/`(自动进详情页拉取全部画廊图片 + 文案 + 发布时间塞进 RSS;可选 `DOUYIN_DOWNLOAD_IMAGES=true` 落盘到 `downloads/douyin//notes//`)
- **快手**:视频标题、作者、`/short-video/` 真实链接;可选 mp4 下载——CDP 拦截 djvod.ndcimgs.com,**单文件 mp4 免 ffmpeg**
- **微博**:标题(前 50 字正文 / 「N 张图片」/「视频」自适应)、作者、`weibo.com//` 链接;图文帖自动嵌入图片(最多 9 张,自动升级到 /large/);可选 `WEIBO_DOWNLOAD_VIDEOS=true` 下载视频帖的 mp4
### 法律风险提示
⚠️ **重要提醒**:
- 上述平台均明确禁止爬取,知乎已有相关法律判例(2025 年判刑 3 年)
- 本功能**仅供个人学习研究**,用户自用自担风险
- **禁止商业化使用**,禁止转卖数据
- 建议低频使用(每日 1–4 次为宜),避免触发风控
---
## 巨潮资讯(公司公告)
支持三种订阅模式(详见 [`generators/finance/README.md`](generators/finance/README.md)):
```bash
# 1) 按主题关键词(推荐):股权激励、回购、业绩快报等
CNINFO_KEYWORDS="股权激励,业绩快报" python scripts/run_single.py cninfo_announcements
# 2) 按分类:全市场年报、半年报、季报等
CNINFO_CATEGORY=category_ndbg_szsh python scripts/run_single.py cninfo_announcements
# 3) 默认:按市场拉最新(sze + sse)
python scripts/run_single.py cninfo_announcements
# 同时下载 PDF(默认 true)
CNINFO_DOWNLOAD_PDF=true python scripts/run_single.py cninfo_announcements
```
PDF 自动归档到 `downloads/cninfo_pdfs/<公司名>_<股票代码>/<标题>.pdf`。
---
## 雪球用户动态订阅(**无需登录 / 无需浏览器登录**)
雪球用户主页走的是阿里云 WAF,不能直接 curl 抓。用 DrissionPage **headless** 模式启动一次真实 Chrome 进程过 WAF 拿到 HTML,再解析时间线。整个流程不需要登录态、不需要 cookie、不依赖 Display,**CI 可跑**。
```bash
# 订阅一个用户,自动追新(接受 uid / 完整 URL)
XUEQIU_USER_ID="8353550788" python scripts/run_single.py xueqiu_user --max 20
XUEQIU_USER_ID="https://xueqiu.com/u/8353550788" python scripts/run_single.py xueqiu_user --max 20
# 多账号合并到同一 Feed(逗号分隔)
XUEQIU_USER_ID="8353550788,1247347556" python scripts/run_single.py xueqiu_user --max 20
```
每条 RSS item 自适应两种帖型:
- **长文型**(机构号常见):列表只给摘要,自动追抓详情页拿完整正文 + 标题;保留页内股票链接 `$股票名(代码)$` 等富文本
- **回复型**(个人 V 常见):直接使用列表 DOM(已含完整对话上下文),**不**追抓详情页(详情页只剩自己说的话,反而丢失被回复人原帖上下文);嵌套引用的他人帖子保留作者 + 时间 + 计数 + 跳转链接,不再递归
### 局限
- 仅抓主页第一屏(约 20 条),不翻页 — 对「追新」场景够用,对历史回溯不够
- 付费内容 / 仅好友可见 — 抓不到(需登录态)
- "关注的博主回复在最上方"这种登录后个性化排序拿不到 — RSS 按时间倒序天然合理
---
## 小宇宙播客订阅(**无需登录 / 无需浏览器**)
小宇宙 web 是 Next.js SSG,节目页 HTML 已经包含最近 15 集的完整元数据(标题/封面/简介/音频 URL)。整个抓取流程是纯 curl_cffi + JSON 解析,**0 资源占用,CI 可跑**。
```bash
# 订阅一个节目,自动追新
XIAOYUZHOU_PODCAST_ID="63b7c6697dcc05cd33b51cd5" \
python scripts/run_single.py xiaoyuzhou --max 10
# 也可以直接粘贴节目主页 URL
XIAOYUZHOU_PODCAST_ID="https://www.xiaoyuzhoufm.com/podcast/63b7c6697dcc05cd33b51cd5" \
python scripts/run_single.py xiaoyuzhou --max 10
# 可选:下载每集 mp3 到本地(默认 false)
XIAOYUZHOU_PODCAST_ID="" XIAOYUZHOU_DOWNLOAD_AUDIO=true \
python scripts/run_single.py xiaoyuzhou --max 5
```
每条 RSS item 包含:
- 节目品牌色 header strip + 主播列表
- Episode 封面 + 时长 + shownotes 全文
- HTML5 `