跳过正文
Background Image
  1. Posts/

feedflow 技术文档:多平台媒体订阅自动化工作流

·4362 字·9 分钟·
目录

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)同左
推送通知GotifyGotify(独立 Token 支持)

1.3 适用场景
#

  • 财经 UP 主内容追踪与摘要
  • 知识型博主内容自动化归档
  • 多平台媒体内容聚合与分析

2. 系统架构
#

2.1 整体架构
#

入口层(run_check.py / cron_run.sh)→ 核心编排层(core/pipeline.py)→ 平台适配层(platforms/bilibili/platforms/xiaohongshu/)→ 公共处理层(core/transcriber.pycore/summarizer.pycore/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 站 SDKbilibili-api-python >= 17.0B 站 API 调用
视频下载yt-dlp >= 2024.0B 站视频下载
转写引擎modelscope + funasr + torchSenseVoice 转写
AI 分析CodeBuddy CLIAI 摘要生成
RSS 解析feedparser >= 6.0RSS 内容解析
HTTP 客户端requests + urllib3HTTP 请求
CLI 框架click >= 8.0命令行接口
终端美化rich >= 13.0终端输出美化
配置文件PyYAML >= 6.0YAML 配置解析
小红书签名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_URLGOTIFY_TOKEN_BILIGOTIFY_TOKEN_XHSXHS_COOKIE

7.2 转写模块(core/transcriber.py
#

使用阿里通义实验室的 SenseVoiceSmall 模型:

  1. 视频文件 → 提取音频(FFmpeg → 16kHz mono WAV)
  2. 加载 SenseVoice 模型(全局缓存,避免重复加载)
  3. 转写(自动语言识别)
  4. 解析结果 + 繁体转简体(opencc)
  5. 保存 .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
#

  1. 多实例并发:同时请求 20+ 公共 RSSHub 实例
  2. 健康度评分:基于成功率、响应时间、最近成功时间
  3. 内容新鲜度优先:选择最新发布时间最大的 feed
  4. 复查机制:上一轮失败的 UP 主,下一轮优先检测 + 更长超时
  5. 全部失败降级:抛出 RSSAllFailedError → pipeline 捕获 → 切换到 API 模式

7.6 小红书监控(platforms/xiaohongshu/monitor.py
#

  • 方式 1:Spider_XHS API(优先)
  • 方式 2:直接 HTTP 请求(降级,需要 Spider_XHS 的签名函数生成 sign 参数)

7.7 小红书下载(platforms/xiaohongshu/downloader.py
#

三层降级策略:

  1. XHS-Downloader Python 库
  2. XHS-Downloader API Server
  3. 直接 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_URLGotify 服务地址高于 config.yaml
GOTIFY_TOKEN_BILIB 站推送 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 中添加模型加载和推理逻辑,支持 sensevoicewhisperparaformer 等引擎切换。

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 助手,需要基于本项目进行扩展或调试,请关注以下关键点:

  1. 平台无关性:核心流程在 core/ 中实现,平台特定逻辑在 platforms/
  2. 降级策略:任何外部依赖都必须有降级方案(RSS → API → 本地)
  3. 幂等性:基于 known_*.json 的去重机制,重复运行不会重复处理
  4. 异步优先: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