feedflow 技术文档#
多平台媒体订阅自动化工作流系统 — 适用于博客发布与 AI 上下文理解
1. 项目概述#
1.1 项目定位#
feedflow 是一个多平台媒体订阅自动化工作流系统,支持 B 站 UP 主和小红书博主的订阅监控,实现从内容发现 → 下载 → 转写 → AI 分析 → 推送通知的完整自动化流程。
1.2 核心特性#
| 特性 | B 站 | 小红书 |
|---|---|---|
| 内容监控 | RSS + API 双保险 | Spider_XHS + HTTP 降级 |
| 媒体处理 | yt-dlp 下载 | XHS-Downloader 三层降级 |
| 转写引擎 | SenseVoice(中文优化) | 视频笔记用 SenseVoice,图文直接提取正文 |
| AI 分析 | CodeBuddy CLI (glm-5.1-ioa) | 同左 |
| 推送通知 | Gotify | Gotify(独立 Token 支持) |
1.3 适用场景#
- 财经 UP 主内容追踪与摘要
- 知识型博主内容自动化归档
- 多平台媒体内容聚合与分析
2. 系统架构#
2.1 整体架构#
入口层(run_check.py / cron_run.sh)→ 核心编排层(core/pipeline.py)→ 平台适配层(platforms/bilibili/ 和 platforms/xiaohongshu/)→ 公共处理层(core/transcriber.py、core/summarizer.py、core/notifier.py)→ 配置与工具层(shared/、platforms/*/auth.py)
2.2 数据流#
订阅配置 ──▶ 监控模块 ──▶ 新内容发现
│
▼
下载模块 (yt-dlp / XHS-Downloader)
│
▼
转写模块 (SenseVoice)
│
▼
AI 摘要 (CodeBuddy CLI)
│
▼
推送模块 (Gotify)
│
▼
清理模块 (可选)
3. 技术栈#
3.1 核心依赖#
| 类别 | 技术 | 用途 |
|---|---|---|
| 语言 | Python 3.12+ | 主开发语言 |
| 包管理 | uv | 依赖管理与虚拟环境 |
| 异步框架 | asyncio | 异步 I/O 处理 |
| B 站 SDK | bilibili-api-python >= 17.0 | B 站 API 调用 |
| 视频下载 | yt-dlp >= 2024.0 | B 站视频下载 |
| 转写引擎 | modelscope + funasr + torch | SenseVoice 转写 |
| AI 分析 | CodeBuddy CLI | AI 摘要生成 |
| RSS 解析 | feedparser >= 6.0 | RSS 内容解析 |
| HTTP 客户端 | requests + urllib3 | HTTP 请求 |
| CLI 框架 | click >= 8.0 | 命令行接口 |
| 终端美化 | rich >= 13.0 | 终端输出美化 |
| 配置文件 | PyYAML >= 6.0 | YAML 配置解析 |
| 小红书签名 | Spider_XHS | 小红书 API 签名逆向 |
| 推送服务 | Gotify | 消息推送 |
3.2 外部依赖#
- FFmpeg: 音频提取(SenseVoice 输入预处理)
- Node.js 20+: Spider_XHS 签名 JavaScript 执行环境
- Gotify Server: 推送通知服务端(需自行部署)
4. 项目结构#
feedflow/
├── platforms/ # 平台适配层
│ ├── bilibili/ # B 站平台实现
│ │ ├── auth.py # Cookie 凭证管理
│ │ ├── monitor.py # API 模式视频监控
│ │ ├── rss_monitor.py # RSS 模式视频监控 + 健康度评分
│ │ ├── dynamic.py # 动态监控
│ │ ├── comments.py # 评论区亮点抓取
│ │ └── (可选) live.py # 直播监控(待扩展)
│ └── xiaohongshu/ # 小红书平台实现
│ ├── auth.py # Cookie + 签名参数获取
│ ├── monitor.py # 笔记列表监控
│ ├── downloader.py # 笔记内容下载(三层降级)
│ ├── parser.py # 笔记内容解析
│ └── comments.py # 评论亮点抓取
│
├── core/ # 平台无关核心流程
│ ├── pipeline.py # 流程编排(B 站 + 小红书)
│ ├── transcriber.py # SenseVoice 转写
│ ├── summarizer.py # AI 摘要生成
│ └── notifier.py # Gotify 推送
│
├── shared/ # 共享模块
│ ├── config.py # 配置管理(dataclass 驱动)
│ └── downloader.py # yt-dlp 下载封装
│
├── vendor/ # 第三方依赖(git submodule)
│ └── spider_xhs/ # Spider_XHS 签名模块
│
├── config.yaml # 配置文件(不提交到 git)
├── config.yaml.example # 配置模板
├── run_check.py # 主入口脚本
├── cron_run.sh # Cron 调度脚本
├── pyproject.toml # 项目元数据 + 依赖
└── README.md # 用户文档
5. 核心数据模型#
5.1 B 站数据模型#
@dataclass
class VideoInfo:
bvid: str # BV 号(如 BV1xx4y1a7AB)
title: str # 视频标题
uid: int # UP 主 UID
author: str # UP 主名称
pubdate: int # 发布时间(Unix timestamp)
duration: int # 时长(秒)
desc: str = "" # 视频描述
pic: str = "" # 封面图 URL
@dataclass
class DynamicInfo:
dynamic_id: str # 动态 ID
title: str # 动态标题/摘要
author: str # UP 主名称
uid: int # UP 主 UID
pubdate: int # 发布时间
link: str # 动态链接
content: str = "" # 动态正文
image_urls: list[str] = field(default_factory=list) # 配图
linked_bvid: str = "" # 关联视频 BV 号
5.2 小红书数据模型#
@dataclass
class NoteInfo:
note_id: str # 笔记 ID
title: str # 笔记标题
author: str # 博主昵称
user_id: str # 博主 ID
note_type: str # "video" | "normal"
pubdate: int # 发布时间
desc: str = "" # 笔记描述
cover_url: str = "" # 封面图 URL
liked_count: int = 0 # 点赞数
xsec_token: str = "" # 访问令牌
5.3 通用结果模型#
@dataclass
class DownloadResult:
success: bool
bvid: str
title: str
filepath: Optional[Path] = None
error: Optional[str] = None
access_limited: bool = False # 是否权限受限
access_note: str = "" # 权限说明
@dataclass
class TranscriptResult:
success: bool
bvid: str
title: str
transcript_path: Optional[Path] = None
json_path: Optional[Path] = None
text: str = "" # 转写文本
language: str = "" # 检测语言
duration_seconds: float = 0.0
error: Optional[str] = None
6. 核心流程详解#
6.1 B 站视频处理流程#
async def process_video(bvid, config, title, author, uid, pubdate, duration, store, warning_tracker):
# Step 1: 下载视频(优先音频)
dl_result = await download_video(bvid, config)
if not dl_result.success:
# 永久性失败(付费/404)标记已知,避免无限重试
return result
# Step 2: SenseVoice 转写
tr_result = transcribe_file(dl_result.filepath, config, bvid, title, author)
if not tr_result.success:
return result
# Step 3: 抓取评论区亮点
comment_result = fetch_comment_highlights(bvid, config)
# Step 4: AI 摘要生成(CodeBuddy CLI)
summary, summary_source, is_ai = post_transcribe_hook(...)
# Step 5: 提炼关键词
keywords = extract_keywords_codebuddy(summary, title, author)
# Step 6: Gotify 推送通知
notified = notify_new_video(bvid, title, author, summary, ...)
# Step 7: 清理原始文件
if config.transcribe.delete_after_transcribe:
cleanup_media(dl_result.filepath, bvid)
# Step 8: 标记为已知视频
store.mark_known(VideoInfo(...))
6.2 RSS 监控与降级策略#
核心设计:RSS 优先,失败时 API 补漏。
- 并发请求 20+ 公共 RSSHub 实例
- 选择「最新发布时间最大」的 feed(避免缓存滞后)
- 记录失败 UP 主,返回给 API 补漏
- 全部 RSS 实例不可用时,自动降级到 API 模式(抛出
RSSAllFailedError)
6.3 RSSHub 实例健康度评分#
class InstanceHealth:
success_count: int = 0
fail_count: int = 0
last_success: float = 0
avg_response_time: float = 0
@property
def score(self) -> float:
# 基础成功率权重 70%
score = (self.success_count / total) * 70
# 近期活跃度权重 30%
if now - last_success < 3600: # 1 小时内
score += 30
elif now - last_success < 7200: # 2 小时内
score += 15
return score
健康度数据持久化到 data/instance_health.json,跨运行保持。
6.4 小红书笔记处理流程#
async def process_xhs_note(note, config, store):
# Step 1: 下载笔记内容
dl_result = await download_note(note, config)
# Step 2: 解析笔记内容
# - 图文笔记:直接提取正文
# - 视频笔记:返回视频路径供转写
content = parse_note_content(note, dl_result)
# Step 3: 视频笔记转写
if content.is_video and content.video_path:
tr_result = transcribe_file(content.video_path, ...)
content.text = tr_result.text
# Step 4: 评论亮点
comment_result = xhs_fetch_comment_highlights(note.note_id, config)
# Step 5: AI 摘要
summary = post_transcribe_hook(...)
# Step 6: 关键词
keywords = extract_keywords_codebuddy(...)
# Step 7: 推送
notify_new_xhs_note(note, content, summary, ...)
# Step 8: 清理
if content.video_path and config.transcribe.delete_after_transcribe:
cleanup_media(content.video_path, note.note_id)
# Step 9: 标记已知
store.mark_known(note)
7. 模块详解#
7.1 配置管理(shared/config.py)#
配置系统使用 dataclass 驱动,支持环境变量覆盖:
@dataclass
class Config:
credential: Credential # B 站凭证
download: DownloadConfig # 下载配置
transcribe: TranscribeConfig # 转写配置
subscriptions: list[Subscription] # B 站订阅列表
monitor: MonitorConfig # 监控配置
analysis: AnalysisConfig # AI 分析配置
notification: NotificationConfig # 推送配置
xiaohongshu: XhsConfig # 小红书配置
环境变量覆盖优先级 > 配置文件:GOTIFY_URL、GOTIFY_TOKEN_BILI、GOTIFY_TOKEN_XHS、XHS_COOKIE
7.2 转写模块(core/transcriber.py)#
使用阿里通义实验室的 SenseVoiceSmall 模型:
- 视频文件 → 提取音频(FFmpeg → 16kHz mono WAV)
- 加载 SenseVoice 模型(全局缓存,避免重复加载)
- 转写(自动语言识别)
- 解析结果 + 繁体转简体(opencc)
- 保存 .txt + .json(带时间戳分段)
SenseVoice 优势:中文识别率显著高于 Whisper;自动繁简转换;多语言自动识别;速度快 2-3 倍。
7.3 摘要模块(core/summarizer.py)#
支持两种模式,AI 失败时自动降级:
- 优先:CodeBuddy CLI(glm-5.1-ioa 模型)
- 降级:本地提取式摘要(按标点分句 → 关键词权重打分 → 取高分片段拼接)
AI 摘要 Prompt:
请总结以下B站视频的核心观点和关键信息。
内容尽量详尽,把重要观点都覆盖到,请分点列出。
只输出总结内容,不要额外的说明。
7.4 推送模块(core/notifier.py)#
统一 Gotify 推送接口,支持 Markdown 渲染,3 次重试机制。
通知消息结构:
**UP主:** 名称
**链接:** [BV号](URL)
**发布时间:** YYYY-MM-DD HH:MM
**关键词:** 关键词A;关键词B;关键词C
---
**详情:**
AI 生成的摘要内容...
**评论区补充:**
置顶评论|UP主
评论内容...
7.5 B 站 RSS 监控(platforms/bilibili/rss_monitor.py)#
- 多实例并发:同时请求 20+ 公共 RSSHub 实例
- 健康度评分:基于成功率、响应时间、最近成功时间
- 内容新鲜度优先:选择最新发布时间最大的 feed
- 复查机制:上一轮失败的 UP 主,下一轮优先检测 + 更长超时
- 全部失败降级:抛出
RSSAllFailedError→ pipeline 捕获 → 切换到 API 模式
7.6 小红书监控(platforms/xiaohongshu/monitor.py)#
- 方式 1:Spider_XHS API(优先)
- 方式 2:直接 HTTP 请求(降级,需要 Spider_XHS 的签名函数生成 sign 参数)
7.7 小红书下载(platforms/xiaohongshu/downloader.py)#
三层降级策略:
- XHS-Downloader Python 库
- XHS-Downloader API Server
- 直接 HTTP 下载(兜底)
图文笔记:获取笔记详情 → 提取正文 + 图片 URL → 下载图片
8. 配置说明#
8.1 配置文件结构(config.yaml)#
# 凭证配置
credential:
sessdata: "你的B站SESSDATA"
bili_jct: "你的bili_jct"
buvid3: "你的buvid3"
dedeuserid: "你的DedeUserID"
cookies_file: '' # 或指定 cookies.txt 路径
# 下载配置
download:
dir: ./downloads
quality: worst # 优先级:省空间
format: bestaudio/worst # 优先只下音频
max_concurrent: 3
# 转写配置
transcribe:
model: base
language: zh
output_dir: ./transcripts
delete_after_transcribe: true
# B 站订阅配置(示例)
subscriptions:
- uid: 12345678
name: "示例UP主A"
# 监控配置
monitor:
mode: rss # rss(推荐)/ api
rsshub_base: https://rsshub.yfi.moe
interval_minutes: 3
watch_dynamic: true
max_videos_per_check: 10
# AI 分析配置
analysis:
enabled: true
# 推送配置
notification:
enabled: true
gotify_url: ''
gotify_token: ''
priority: 5
# 小红书配置(示例)
xiaohongshu:
enabled: true
cookie: '' # 或环境变量 XHS_COOKIE
subscriptions:
- user_id: "示例user_id"
name: "示例博主"
monitor:
mode: api
interval_minutes: 10
notification:
gotify_token: '' # 或环境变量 GOTIFY_TOKEN_XHS
8.2 环境变量#
| 变量名 | 说明 | 优先级 |
|---|---|---|
GOTIFY_URL | Gotify 服务地址 | 高于 config.yaml |
GOTIFY_TOKEN_BILI | B 站推送 Token | 高于 config.yaml |
GOTIFY_TOKEN_XHS | 小红书推送 Token | 高于 config.yaml |
XHS_COOKIE | 小红书 Cookie | 高于 config.yaml |
9. 部署与运行#
9.1 环境准备#
# 安装 uv(Python 包管理器)
# macOS: brew install uv
# 其他: https://docs.astral.sh/uv/getting-started/installation/
# 安装 FFmpeg(音频提取)
# macOS: brew install ffmpeg
# Ubuntu: apt install ffmpeg
# 安装 Node.js 20+(小红书签名依赖)
# nvm install 22
9.2 运行方式#
# 手动执行一次
uv run python run_check.py
uv run python run_check.py --platform bili
uv run python run_check.py --platform xhs
# Cron 定时执行(推荐)
# 每 3 分钟执行一次
*/3 * * * * cd /path/to/feedflow && uv run python run_check.py --platform all >> cron.log 2>&1
9.3 Gotify 推送服务部署#
docker run -d \
--name gotify \
-p 8080:80 \
-v gotify-data:/app/data \
-e GOTIFY_DEFAULTUSER_NAME=admin \
-e GOTIFY_DEFAULTUSER_PASS=<your-password> \
gotify/server:latest
# 访问 http://your-server:8080,登录后在 Settings → Apps 创建 Token
10. 扩展开发指南#
10.1 添加新平台#
以添加「YouTube 平台」为例,需实现:
# platforms/youtube/monitor.py
@dataclass
class VideoInfo:
video_id: str
title: str
channel_id: str
author: str
pubdate: int
duration: int
class SubscriptionStore:
def is_known(self, video_id: str) -> bool: ...
def mark_known(self, video: VideoInfo): ...
def check_new_videos(config, store) -> list[VideoInfo]: ...
然后在 core/pipeline.py 中添加 run_youtube_check_once(),并在 run_check.py 中添加入口。
10.2 添加新转写引擎#
在 core/transcriber.py 中添加模型加载和推理逻辑,支持 sensevoice、whisper、paraformer 等引擎切换。
10.3 添加新推送渠道#
在 core/notifier.py 中添加 send_xxx() 函数,支持 Gotify、Telegram、WeChat 等渠道。
11. 故障排查#
| 问题 | 原因 | 解决方案 |
|---|---|---|
| B 站下载失败 | Cookie 过期 | 重新获取 Cookie 并更新 config.yaml |
| RSS 全部失败 | RSSHub 实例不可用 | 自动降级到 API 模式,或更新实例列表 |
| SenseVoice 转写失败 | 模型未下载 / FFmpeg 缺失 | 检查 modelscope 缓存;安装 FFmpeg |
| AI 摘要失败 | CodeBuddy CLI 未登录 | 执行 codebuddy /login |
| 小红书 Cookie 失效 | Cookie 有效期短 | 重新获取 Cookie(需扫码登录网页版) |
| Gotify 推送失败 | 服务地址/Token 错误 | 检查 config.yaml 和环境变量 |
12. AI 上下文提示词#
如果你是一个 AI 助手,需要基于本项目进行扩展或调试,请关注以下关键点:
- 平台无关性:核心流程在
core/中实现,平台特定逻辑在platforms/中 - 降级策略:任何外部依赖都必须有降级方案(RSS → API → 本地)
- 幂等性:基于
known_*.json的去重机制,重复运行不会重复处理 - 异步优先:I/O 密集操作使用 asyncio,下载并发控制通过 Semaphore
调试技巧#
# 单独测试转写
from core.transcriber import transcribe_file
result = transcribe_file(Path("test.mp4"), config)
# 单独测试摘要
from core.summarizer import generate_summary
summary, source, is_ai = generate_summary(bvid, title, author, text, config)
# 单独测试推送
from core.notifier import send_gotify
send_gotify("测试", "这是一条测试消息", config)
文档生成时间:2026-04-20
