Bilibili Watcher 是一个开源的 Bilibili 视频观看时长追踪与分析工具。它能够自动记录你在 Bilibili 上观看某个视频的时长数据,并通过直观的图表和数据分析,帮助你了解自己的观看习惯和偏好。
|Light|Dark|
|—-|—-|
||
|
git clone https://github.com/krisxia0506/bilibili-watcher.git
cd bilibili-watcher
cp .env.example .env
编辑 .env
文件,设置以下必要参数:
BILIBILI_SESSDATA
:你的 Bilibili SESSDATA(用于获取观看进度)BILIBILI_BVID
:要追踪的视频 BVIDdocker-compose up -d
SESSDATA
字段的值并复制,例如:
SESSDATA=bb723733%2C1762308022%2Ce456d%2A51CjBn_Tu3wVQ012OWHJ1ZQ7VZLWEADQQbEVSrwACbJSY0oqhw5An18gPkUogW2JU5qzASVmo3cVZmbFdkY3ZJdy12YWlOcElYMW5ydWRQWUoySFhuZU9oeFFaWUI3Q1RhVHI2VWpkLXU3QWFxQWMzSngyT24zNDRPOExmcEV2RldsME1zWERwSVh12345
⚠️ 注意:请妥善保管你的 SESSDATA,不要分享给他人。
/healthz
端点,用于监控服务运行状态和数据库连接情况。下图展示了本项目的核心数据处理流程:
graph TD
A[Bilibili API] -->|视频数据/进度| B(Go 后端服务);
B -->|SESSDATA, BVID| C{定时任务调度器};
C -- 定时触发 --> D[应用层: VideoProgressService];
D -- 调用 --> E[基础设施层: BilibiliClient];
E -- HTTP请求 --> A;
D -- 获取数据 --> F[领域模型: VideoProgress];
F -- 转换 --> G[基础设施层: VideoProgressRepository];
G -- GORM操作 --> H[(MySQL 数据库)];
I[用户/前端应用] -->|API 请求 (查询观看时长)| J(Go 后端服务: Gin Router);
J --> K[接口层: VideoAnalyticsHandler];
K --> L[应用层: VideoAnalyticsService];
L --> M[领域服务: WatchTimeCalculator];
L --> N[基础设施层: VideoProgressRepository];
N -- 查询历史进度 --> H;
M -- 计算时长 --> L;
L -- DTO --> K;
K -- JSON响应 --> I;
下图展示了用户请求”获取观看分段时长”接口时的主要交互时序:
sequenceDiagram
participant User as 用户/前端
participant GinRouter as Gin 路由
participant APIHandler as 接口层 Handler
participant AppService as 应用层服务
participant DomainRepo as 领域仓库
participant BiliClient as Bilibili 客户端
participant DB as MySQL 数据库
User->>+GinRouter: POST /api/v1/video/watch-segments (请求体含BVID, 时间范围)
GinRouter->>+APIHandler: 路由到 VideoAnalyticsHandler.GetWatchedSegments
APIHandler->>+AppService: 调用 VideoAnalyticsService.GetWatchedSegments(ctx, reqDTO)
AppService->>+BiliClient: GetVideoView(ctx, bvid) 获取视频信息 (AID, 分P列表等)
BiliClient-->>-AppService: 返回 VideoViewDTO
AppService->>+DomainRepo: ListByBVIDAndTimestampRange(ctx, bvid, start, end)
DomainRepo->>+DB: 执行 SQL 查询历史进度
DB-->>-DomainRepo: 返回进度记录列表 (model.VideoProgress)
DomainRepo-->>-AppService: 返回领域模型列表
AppService->>AppService: (调用领域服务 WatchTimeCalculator) 计算有效观看时长和分段
AppService-->>-APIHandler: 返回 WatchSegmentsResultDTO
APIHandler-->>-GinRouter: 返回 JSON 响应
GinRouter-->>-User: 响应观看时长数据
robfig/cron/v3
.
├── cmd/ # 程序入口 (例如: cmd/main.go)
├── internal/ # 项目内部代码,不对外暴露
│ ├── application/ # 应用层: Use Cases, Application Services
│ ├── config/ # 配置加载与管理
│ ├── domain/ # 领域层: Entities, Value Objects, Domain Events, Repository Interfaces
│ │ ├── model/ # 领域模型
│ │ ├── repository/ # 仓储接口定义
│ │ └── service/ # 领域服务
│ ├── infrastructure/ # 基础设施层
│ │ ├── bilibili/ # Bilibili API 客户端实现
│ │ ├── persistence/ # 持久化实现 (GORM)
│ │ └── scheduler/ # 定时任务调度器实现
│ └── interfaces/ # 接口层 (例如 REST API Handlers)
│ └── api/ # API 相关
│ └── rest/ # RESTful API 实现
│ └── dto/ # API 数据传输对象
├── pkg/ # 可共享的库代码 (如果需要,例如通用响应格式)
│ └── response/ # API 标准响应结构
├── sql/ # SQL schema 定义和迁移脚本
├── web/ # 前端 Remix 项目根目录
│ ├── app/ # Remix 应用核心代码
│ │ ├── components/ # React 组件 (包括 Shadcn UI 组件)
│ │ ├── lib/ # 工具函数、常量等
│ │ ├── locales/ # i18n 翻译文件
│ │ ├── routes/ # 路由文件 (例如 _index.tsx)
│ │ └── styles/ # 全局样式 (Tailwind)
│ ├── public/ # 静态资源
│ ├── .eslintrc.js # ESLint 配置文件
│ ├── package.json # 前端依赖
│ ├── pnpm-lock.yaml # pnpm 锁定文件
│ ├── remix.config.js # Remix 配置
│ ├── tailwind.config.js # Tailwind CSS 配置
│ └── tsconfig.json # TypeScript 配置
├── Dockerfile.backend # 后端 Dockerfile
├── Dockerfile.frontend # 前端 Dockerfile
├── docker-compose.yml # Docker Compose 配置
├── go.mod # Go 模块定义
├── go.sum # Go 模块校验和
└── README.md # 项目说明文件
feat:
, fix:
, refactor:
, docs:
, test:
, chore:
等)。.env.example
为 .env
,并根据需要修改其中的环境变量,特别是 Bilibili 相关配置和数据库密码。docker-compose up --build -d
。http://localhost:3000
(或其他在 .env
中配置的端口)http://localhost:8080
(或其他在 .env
中配置的端口)docker-compose down
。