Skip to content

About

TrendSentinel 是一个面向运营场景的短视频公开账号内容监控与预警平台。系统支持通过关键词发现对口账号,自动提取并去重 `sec_user_id`,建立监控账号,创建异步采集任务,采集账号资料、主页作品和互动指标,并在发现新作品或指标变化时生成预警记录。

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

TrendSentinel:热点数据采集与账号预警平台

TrendSentinel 是一个面向运营场景的短视频公开账号内容监控与预警平台。系统支持通过关键词发现对口账号,自动提取并去重 sec_user_id,建立监控账号,创建异步采集任务,采集账号资料、主页作品和互动指标,并在发现新作品或指标变化时生成预警记录。

当前版本:v4.3.1-discovery-progress
默认地址:http://localhost:8000
API 文档:http://localhost:8000/docs
RabbitMQ 管理台:http://localhost:15672

项目演示

项目功能展示视频位于:

video/video.mp4

▶ 点击观看 TrendSentinel 项目展示视频

核心能力

  • 关键词发现账号:输入搜索关键词和目标账号数量,系统按搜索结果顺序提取前 N 个不同账号,并按 sec_user_id 去重。
  • 自动建立监控账号:发现账号后自动写入账号库,重复账号不会反复创建。
  • 异步采集任务:通过 RabbitMQ 将账号采集、数据处理和预警评估解耦,支持任务状态、进度、结果和失败原因记录。
  • 公开账号主页采集:基于本地浏览器 cURL 模板采集公开账号资料和主页作品列表。
  • 互动指标入库:保存作品标题、封面、发布时间、分享链接、点赞数、评论数指标、分享数等字段。
  • 新作品预警:发现新作品后自动生成预警,支持查看、关闭、批量关闭和删除。
  • 账号与任务 CRUD:前端提供账号新增、编辑、启用/停用、删除,以及任务创建、取消、删除和详情查看。
  • 低频采集策略:支持请求间隔、采集页数、评论采集开关、账号同步间隔等配置。
  • 双采集通道保留:公开 Web Collector 是当前主流程;抖音 OAuth/OpenAPI 通道保留用于自有授权账号。
  • 学习友好前端:Vue 3 页面按工作台、关键词发现、账号管理、采集任务、内容中心、预警中心、预警规则和系统状态拆分。

产品页面

页面 功能
工作台 展示监控账号、本地作品、累计互动、未处理预警、账号同步状态、采集策略、服务健康和最近任务
关键词发现 输入关键词和目标账号数,自动发现去重账号,并批量创建采集任务
账号管理 添加公开监控账号、修改备注名、设置同步间隔、启用/停用、删除、手动全量/增量同步
采集任务 新建采集任务、查看任务进度、查看任务详情、取消任务、删除任务记录
内容中心 查看本地入库作品、按账号筛选、查看标题/封面/互动指标、打开作品、删除本地作品记录
预警中心 查看新作品和规则命中预警,支持按状态筛选、关闭、批量关闭和删除
预警规则 新增、编辑、启用/停用和删除预警规则
系统状态 查看 API、MySQL、Redis、RabbitMQ 健康状态、版本信息、采集配置和架构说明

系统架构

flowchart LR
    U[运营用户] --> WEB[Vue 3 管理后台]
    WEB --> API[FastAPI]

    API --> DB[(MySQL)]
    API --> CACHE[(Redis)]
    API --> MQ[(RabbitMQ)]

    MQ --> WC[Python Web Collector]
    MQ --> OC[Node OpenAPI Collector]
    MQ --> PW[Pipeline Worker]
    MQ --> SCH[Scheduler]

    WC --> SIGN[reverse.js / signer_cli.js]
    WC --> TPL[web-templates cURL 模板]
    WC --> DOUYIN[公开 Web 接口]

    OC --> OPENAPI[抖音 OpenAPI]

    WC --> MQ
    OC --> MQ
    MQ --> PW
    PW --> DB
    PW --> ALERT[预警评估]
    ALERT --> DB
    ALERT --> NOTICE[飞书 / 邮件 可选]

    DB --> API
    CACHE --> API
    API --> WEB
Loading

关键词发现与自动采集流程

flowchart TD
    A[输入关键词和目标账号数] --> B[读取 request_search.txt 搜索模板]
    B --> C[按页请求搜索结果]
    C --> D[解析用户信息]
    D --> E[提取 sec_user_id / 昵称 / 粉丝数 / 作品数]
    E --> F{是否重复账号?}
    F -- 是 --> G[记录 duplicate_count]
    F -- 否 --> H[写入 discovery_items]
    H --> I{达到目标账号数?}
    I -- 否 --> C
    I -- 是 --> J[自动创建监控账号]
    J --> K[为每个账号创建 FULL_SYNC 任务]
    K --> L[RabbitMQ 顺序执行作品采集]
    L --> M[作品入库并触发新作品预警]
Loading

一次账号采集任务的流程

flowchart TD
    A[前端创建 FULL_SYNC / INCREMENTAL_SYNC] --> B[FastAPI 写入 crawl_tasks]
    B --> C[发布 RabbitMQ 消息]
    C --> D[Web Collector 接收任务]
    D --> E[请求账号资料 profile/other]
    E --> F[请求主页作品 aweme/post]
    F --> G[投递 data.process]
    G --> H[Pipeline Worker 清洗与 Upsert]
    H --> I[写入账号、作品、指标快照]
    I --> J[任务状态更新]
    J --> K[触发 alert.evaluate]
    K --> L[生成新作品或规则预警]
Loading

技术栈

层级 技术
后端接口 Python 3.12、FastAPI、Pydantic、Uvicorn
ORM 与数据库 SQLAlchemy 2.0、PyMySQL、MySQL 8.0
异步任务 RabbitMQ、Pika、Direct Exchange、持久化队列
缓存与状态 Redis 7
Web 公开采集 Python Web Collector、Chrome cURL 模板、动态 a_bogus 签名
签名辅助 Node.js、reverse.js、signer_cli.js
官方通道 Node.js Collector、Douyin OAuth/OpenAPI(可选)
前端 Vue 3、Vue Router、Vite、原生 CSS
部署 Docker Compose、MySQL / Redis / RabbitMQ 数据卷
测试数据 tests/fixtures 保存脱敏后的 OpenAPI 响应结构样例

数据模型

核心表包括:

表 说明
accounts 监控账号,保存平台、昵称、open_id、粉丝数、平台作品数、同步间隔和状态
account_authorizations OAuth 授权信息,用于官方 OpenAPI 通道
crawl_tasks 采集任务,保存任务类型、阶段、进度、结果、错误码和耗时
videos 本地作品库,保存作品 ID、标题、封面、分享链接、发布时间和互动指标
comments 评论内容表,当前默认关闭,作为备选能力保留
account_metric_snapshots 账号指标快照
video_metric_snapshots 作品指标快照
discovery_runs 关键词发现批次,保存关键词、目标数、状态、页数、去重数量和任务数量
discovery_items 单次发现结果,保存去重后的 sec_user_id、昵称、账号创建状态和任务创建状态
alert_rules 预警规则配置
alerts 预警记录,保存新作品、任务失败或规则命中的处理状态
notification_logs 飞书或邮件通知发送记录

快速启动

1. 环境要求

  • Windows 10/11 + Docker Desktop;
  • Docker Compose Plugin;
  • 可用网络环境,首次构建需要拉取 python:3.12-slim-bookworm、node:22-bookworm-slim、mysql:8.0、redis:7-alpine、rabbitmq:3-management-alpine;
  • 已准备好的 Douyin PC Web cURL 模板。关键词发现至少需要 request_search.txt,作品采集至少需要 request_profile.txt 和 request_posts.txt。

2. 准备配置

常用低频演示配置:

DOUYIN_WEB_ENABLED=true
DOUYIN_WEB_MAX_PAGES=1
DOUYIN_WEB_POSTS_PAGE_SIZE=18
DOUYIN_WEB_SYNC_COMMENTS=false
DOUYIN_WEB_COMMENT_MAX_PAGES=1
DOUYIN_WEB_COMMENTS_PAGE_SIZE=10
DOUYIN_WEB_REQUEST_INTERVAL_SECONDS=60
DEFAULT_SYNC_INTERVAL_MINUTES=360
SCHEDULER_SCAN_SECONDS=60

3. 准备 Web 模板

web-templates/ 中的模板来自 Chrome DevTools 的 Copy as cURL (cmd)。

必需模板:

文件 用途
request_search.txt 关键词搜索接口 /aweme/v1/web/general/search/single/
request_profile.txt 账号资料接口 /aweme/v1/web/user/profile/other/
request_posts.txt 主页作品接口 /aweme/v1/web/aweme/post/

可选模板:

文件 用途
request_comments.txt 一级评论接口 /aweme/v1/web/comment/list/
request_posts_page2.txt 主页作品第二页,用于排查分页参数
screen_info.txt 浏览器屏幕指纹辅助信息

4. 启动项目

Windows:

cd /d D:\projects\TrendSentinel
start.cmd

跨平台 Docker Compose:

docker compose up -d --build

首次启动会完成:

  1. 创建 MySQL、Redis 和 RabbitMQ;
  2. 执行 migrate.py 创建业务表;
  3. 构建 Vue 前端并由 FastAPI 托管;
  4. 启动 API、Pipeline Worker、Scheduler、Web Collector 和 OpenAPI Collector。

5. 验证

powershell -NoProfile -Command "Invoke-RestMethod 'http://localhost:8000/health'"

健康状态为 ok 时,打开:

http://localhost:8000/

FastAPI 文档:

http://localhost:8000/docs

RabbitMQ 管理台:

http://localhost:15672

关键词发现使用方式

进入前端:

关键词发现

填写:

搜索关键词:影视解说 / 短剧解说 / 武则天 / 好剧推荐
目标账号数:30
搜索页数上限:8
每页搜索数量:10
搜索请求间隔:3 秒
账号同步间隔:720 分钟
任务类型:FULL_SYNC
发现后立即创建采集任务:开启

执行后,系统会:

  1. 从搜索结果中提取账号;
  2. 按 sec_user_id 去重;
  3. 展示发现批次和去重账号列表;
  4. 自动创建监控账号;
  5. 自动为每个账号创建作品采集任务;
  6. 后续作品采集进入 RabbitMQ 队列逐个执行。

发现账号的进度在“关键词发现”页面查看;作品采集进度在“采集任务”页面查看。

项目管理命令

常用命令:

cd /d D:\projects\TrendSentinel

start.cmd                                      构建并启动完整系统
docker compose ps                             查看容器状态
docker compose logs -f --tail=200 api         查看 API 日志
docker compose logs -f --tail=200 web-collector pipeline-worker
docker compose run --rm migrate               执行数据库迁移
docker compose stop scheduler web-collector   停止自动调度和采集器
docker compose up -d web-collector            重新开启 Web Collector
docker compose down                           停止并保留数据卷

项目结构

TrendSentinel/
├── backend/
│   ├── app/
│   │   ├── main.py              # FastAPI 入口,挂载前端静态资源
│   │   ├── config.py            # Pydantic 配置与环境变量
│   │   ├── db.py                # SQLAlchemy Base、Session 和健康检查
│   │   ├── models.py            # 账号、任务、作品、发现批次、预警等数据模型
│   │   ├── schemas.py           # Pydantic 响应模型
│   │   ├── mq.py                # RabbitMQ 交换机、队列和发布逻辑
│   │   ├── services.py          # 任务创建、任务完成、默认规则和预警逻辑
│   │   ├── douyin_oauth.py      # OAuth/OpenAPI 授权能力
│   │   └── routers/
│   │       ├── accounts.py      # 账号管理接口
│   │       ├── discovery.py     # 关键词发现和自动建档接口
│   │       ├── tasks.py         # 采集任务接口
│   │       ├── content.py       # 作品和评论查询接口
│   │       ├── alerts.py        # 预警和预警规则接口
│   │       ├── dashboard.py     # 工作台统计接口
│   │       ├── system.py        # 系统状态、版本和采集配置接口
│   │       └── oauth.py         # 抖音 OAuth 授权入口
│   ├── web_signer/
│   │   ├── reverse.js           # a_bogus 生成逻辑
│   │   └── signer_cli.js        # 签名命令行入口
│   ├── migrate.py               # 建表和默认规则初始化
│   ├── web_collector.py         # PC Web 公开账号采集器
│   ├── worker.py                # 数据清洗、入库和预警处理 Worker
│   └── scheduler.py             # 定时扫描账号并创建增量任务
├── collector-node/
│   └── src/                     # Node.js OpenAPI Collector 和诊断工具
├── frontend/
│   └── src/
│       ├── pages/               # 工作台、关键词发现、账号、任务、内容、预警、规则、系统页面
│       ├── services/api.js      # 前端 API 封装
│       ├── router.js            # Vue Router
│       └── styles.css           # 简洁后台样式
├── web-templates/               # 本地 cURL 请求模板,禁止公开提交真实 Cookie
├── docs/                        # 架构说明、OpenAPI 配置、验证记录和简历口径
├── tests/fixtures/              # 脱敏响应样例
├── video/                       # 项目演示视频
├── docker-compose.yml           # 唯一部署架构
├── start.cmd                    # Windows 一键启动脚本
├── VERSION
└── README.md

主要 API

方法 路径 说明
GET /health Docker 健康检查
GET /api/system/version 应用名称与版本
GET /api/system/health API、MySQL、Redis、RabbitMQ 健康状态
GET /api/system/collection-config 当前采集配置
GET /api/dashboard/summary 工作台统计数据
POST /api/discovery/run 创建关键词发现批次,并可自动创建采集任务
GET /api/discovery/latest 获取最近一次关键词发现结果
GET /api/discovery/runs/{run_id} 获取指定发现批次
GET /api/accounts 查询监控账号
POST /api/accounts/web 添加公开 Web 监控账号
PATCH /api/accounts/{account_id} 修改账号备注、同步间隔和状态
DELETE /api/accounts/{account_id} 删除账号
GET /api/tasks 查询采集任务
POST /api/tasks 创建采集任务
POST /api/tasks/{task_id}/cancel 取消任务
DELETE /api/tasks/{task_id} 删除任务记录
GET /api/content/videos 查询本地作品
DELETE /api/content/videos/{video_id} 删除本地作品记录
GET /api/alerts 查询预警
POST /api/alerts/{alert_id}/close 关闭单条预警
POST /api/alerts/close-all 批量关闭预警
DELETE /api/alerts/{alert_id} 删除预警
GET /api/rules 查询预警规则
POST /api/rules 新增预警规则
PATCH /api/rules/{rule_id} 修改预警规则
DELETE /api/rules/{rule_id} 删除预警规则

自动接口文档:

http://localhost:8000/docs

版本演进

版本 定位 主要变化 状态
v4.0 基础监控平台 建立账号、任务、作品、评论、预警和系统状态的基础后台 已合并
v4.1 WebCollector 公开 Web 采集 合入 PC Web Collector,支持 cURL 模板、a_bogus、主页作品和评论采集 已合并
v4.2 UI CRUD 后台工程化 重构前端页面,补齐账号、任务、内容、预警、规则等 CRUD 能力 已合并
v4.3 Keyword Discovery 关键词发现 新增关键词发现页面,支持搜索前 N 个不同账号、去重建档和自动创建采集任务 已合并
v4.3.1 Discovery Progress 当前版本 将发现批次和发现结果持久化,切换页面后仍可查看发现进度和去重账号列表 当前版本

About

TrendSentinel 是一个面向运营场景的短视频公开账号内容监控与预警平台。系统支持通过关键词发现对口账号,自动提取并去重 `sec_user_id`,建立监控账号,创建异步采集任务,采集账号资料、主页作品和互动指标,并在发现新作品或指标变化时生成预警记录。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages