Skip to content

油猴脚本-B站up主页视频收集并顺序播放该up的所有视频

Notifications You must be signed in to change notification settings

yourongchao/bili-up-video-collector

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

一、项目核心目标

基于指定 B 站 UP 主主页,开发一款能自动爬取该 UP 主所有投稿视频、按「发布时间倒序」连续播放、并持久化记录播放进度的工具,减少用户手动换视频的操作。

1. 项目概述

1.1 项目目的

本项目是一个 Tampermonkey 脚本,旨在通过自动收集指定 UP 主页面的所有视频、支持按发布时间倒序(从新到旧)连续播放,并持久化记录每个视频的播放进度,从而增强 Bilibili 观看体验。

1.2 核心功能

  • 自动视频收集:从 UP 主页面爬取所有视频,提取标题、BV 号和发布时间等关键信息
  • 智能播放系统:按发布时间倒序播放视频,当前视频结束后自动跳转到下一个
  • 进度追踪:持久化记录每个视频的播放进度,允许用户从上次离开的位置继续观看
  • 多 UP 主支持:为不同 UP 主维护独立数据,支持在不同 UP 主页面间无缝切换

1.3 目标用户

  • 关注多个 UP 主并希望更高效观看所有视频的 Bilibili 用户
  • 希望跨会话跟踪观看进度的用户
  • 喜欢按时间顺序观看视频且不想手动操作的用户

2. 功能与特性

2.1 视频收集

  • 自动爬取:遍历 UP 主所有投稿页面,收集完整的视频信息
  • 智能筛选:仅收集独立投稿视频,排除直播回放、合集子视频和预告短片等非完整内容
  • 数据验证:确保收集的视频数据完整有效后再存储
  • 去重机制:自动移除收集过程中的重复视频

2.2 播放管理

  • 倒序播放:默认按发布时间从新到旧的顺序播放视频
  • 自动续播:当前视频结束后,若 5 秒内无用户操作,自动播放下一个视频
  • 进度恢复:对未看完的视频,从上次保存的位置继续播放
  • 观看状态:播放进度达到视频总时长的 75% 时,自动标记为已观看

2.3 存储系统

  • 持久化存储:使用 Tampermonkey 的 GM_setValue/GM_getValue API 进行本地数据持久化
  • 多 UP 主隔离:每个 UP 主的数据使用唯一键单独存储
  • 备份机制:将数据同步到 localStorage 作为备份
  • 数据迁移:自动将旧数据格式升级为新格式

2.4 用户界面

  • 浮动控制面板:可从任何 Bilibili UP 主页面访问
  • UP 主列表:显示所有已存储的 UP 主,带有播放和删除选项
  • 可折叠区域:允许用户折叠/展开各部分以获得更好的组织性
  • 进度统计:显示已收集视频数量、已观看/未观看状态

2.5 配置选项

  • 自定义延迟:允许用户设置页面爬取之间的随机延迟,以避免被检测
  • 实时更新:延迟设置无需重启脚本即可立即生效

3. 技术实现

3.1 架构概述

脚本根据当前页面类型以两种不同模式运行:

  • UP 主空间页面:用于视频收集和管理
  • 视频播放页面:用于进度跟踪和自动播放下一个视频

3.2 核心算法与逻辑流程

3.2.1 视频收集算法

1. 解析当前页面 DOM 中的视频卡片
2. 提取视频信息(BV 号、标题、发布时间)
3. 验证并筛选有效的视频条目
4. 检查是否存在可用的"下一页"按钮
5. 如果有,点击"下一页"按钮
6. 使用 MutationObserver 等待 DOM 变化
7. 重复步骤 1-6 直到没有更多页面
8. 使用 Set 数据结构移除重复视频
9. 与现有视频列表合并,保留观看状态
10. 使用 GM_setValue 存储最终列表

3.2.2 播放进度跟踪

1. 从 URL 中获取当前视频的 BV 号
2. 使用 HTML5 视频事件跟踪播放进度
3. 计算相对于总时长的播放百分比
4. 达到阈值时更新存储中的进度
5. 播放进度超过总时长的 75% 时标记为已观看

3.3 关键函数及其用途

3.3.1 视频收集函数

  • collectAllVideos():协调整个视频收集过程的主函数
  • parseCurrentPageVideos():从当前页面 DOM 中提取视频信息
  • getNextPageButton():使用多种选择器策略定位"下一页"按钮
  • isNextButtonDisabled():判断"下一页"按钮是否可点击
  • waitForVideoListChange():使用 MutationObserver 等待页面导航后的 DOM 更新

3.3.2 存储函数

  • getAllStoredUpInfo():获取所有存储的 UP 主信息,支持格式转换
  • deleteUpData():完全删除特定 UP 主的所有相关数据
  • markCurrentVideoWatched():更新当前视频的观看状态和进度

3.3.3 UI 函数

  • addCollectButton():创建带有所有交互元素的浮动控制面板
  • renderUpList():动态渲染存储的 UP 主列表及其控制项
  • showCollectedInfoPanel():显示已收集视频的统计信息

3.3.4 工具函数

  • getCurrentMid():从当前 URL 中提取 UP 主 ID
  • randomDelay():生成页面爬取之间的随机延迟
  • getFirstUnwatchedVideoByUpId():查找特定 UP 主的第一个未观看视频

3.4 数据结构

3.4.1 视频对象

{
  bv: "BV1xx411c7mT",          // 视频唯一标识符
  title: "视频标题",            // 视频标题
  pubTimeText: "2023-01-01",   // 发布时间文本
  watched: false,              // 观看状态 (true/false)
  watchProgress: 0             // 观看进度 (0-100%)
}

3.4.2 存储键

数据类型 存储键格式 说明
视频列表 bili_up_[UP主ID]_video_list_raw 存储该 UP 主的所有视频信息,包括 BV 号、标题、发布时间、观看状态和进度
爬取延时配置 bili_up_[UP主ID]_delay_config 存储该 UP 主爬取视频时的随机延时配置
UP 主列表 bili_up_list 存储所有已收集的 UP 主 ID 和名称
临时 UP 主 ID bili_temp_current_up_id 跨页面传递当前 UP 主 ID(解决 Firefox localStorage 问题)
临时视频列表键 bili_temp_current_list_key 跨页面传递视频列表键

3.4.3 UP 主对象

{
  id: "1629347259",   // UP 主唯一标识符
  name: "UP 主名称"     // UP 主昵称
}

3.5 架构决策

  • 双重存储策略:同时使用 GM_setValue(用于跨浏览器持久化)和 localStorage(作为备份)
  • 灵活选择器:实现多种选择器策略,以适应不同 Bilibili 页面布局的 DOM 解析
  • 速率限制:包含可配置的随机延迟,以防止服务器过载和检测
  • 渐进增强:优雅处理缺失元素和意外页面结构

4. 使用说明

4.1 前置条件

  • Tampermonkey 扩展:安装 Tampermonkey 浏览器扩展(支持 Chrome、Firefox、Edge 等)
  • Bilibili 账号:建议拥有 Bilibili 账号以访问所有功能

4.2 安装步骤

  1. 为您的浏览器安装 Tampermonkey 扩展
  2. 在 Tampermonkey 中创建新脚本
  3. 将整个 main.js 内容复制粘贴到脚本编辑器中
  4. 保存脚本并启用它

4.3 基本使用

4.3.1 收集视频

  1. 导航到任何 Bilibili UP 主的投稿页面(URL 格式:https://space.bilibili.com/[UP主ID]/upload/video
  2. 点击右上角出现的"UP 视频收集"按钮
  3. 点击"🚀 开始收集"开始爬取该 UP 主的所有视频
  4. 等待收集过程完成(进度显示在浏览器控制台中)
  5. 点击"📊 查看收集信息"查看已收集视频的统计数据

4.3.2 播放视频

  1. 收集视频后,点击"▶️ 开始播放"从第一个未观看视频开始播放
  2. 脚本会在当前视频结束后自动播放下一个视频
  3. 如果手动导航离开,脚本会记住您的进度
  4. 观看视频时长达到 75% 时,视频会被标记为已观看

4.3.3 管理多个 UP 主

  1. 脚本会自动从 URL 中检测当前 UP 主 ID
  2. 每个 UP 主的数据分开存储,因此您可以在不同 UP 主页面间切换而不会丢失进度
  3. "📋 已存储 UP 主列表"部分显示所有已保存的 UP 主及其播放和删除选项
  4. 点击折叠/展开按钮可显示/隐藏 UP 主列表

4.4 配置

4.4.1 设置随机延迟

  1. 在控制面板中,找到"⏱️ 随机延时"部分
  2. 在输入框中输入最大延迟时间(以毫秒为单位)
  3. 点击"💾 保存"应用设置
  4. 此延迟会在页面爬取之间随机应用,以避免被检测

4.5 数据管理

  • 查看统计:点击"📊 查看收集信息"查看总视频数、已观看/未观看数量
  • 删除 UP 主数据:使用列表中任何 UP 主旁边的 🗑️ 按钮删除所有相关数据
  • 手动重置进度:目前,您需要使用浏览器开发者工具直接修改存储值

5. 未实现功能

5.1 视频时长提取

  • 当前状态:脚本目前不提取视频时长
  • 技术要求:需要修改 parseCurrentPageVideos() 从视频卡片中提取时长
  • 实现考虑:时长信息将使进度跟踪更准确,并支持更智能的播放决策

5.2 自定义播放顺序

  • 当前状态:仅支持按发布时间倒序播放
  • 技术要求:添加不同排序(正序、随机等)的 UI 选项,并存储自定义偏好
  • 实现考虑:需要修改 getFirstUnwatchedVideoByUpId() 中的视频选择逻辑

5.3 批量操作

  • 当前状态:没有用于管理视频列表的批量操作
  • 技术要求:添加用于选择多个视频并标记为已观看/未观看的 UI
  • 实现考虑:需要对大型视频列表进行重大 UI 增强和存储优化

5.4 视频搜索和过滤

  • 当前状态:已收集视频中没有搜索功能
  • 技术要求:添加基于标题、发布日期等的搜索输入和过滤选项
  • 实现考虑:需要实现客户端搜索算法和 UI 组件

5.5 导出/导入功能

  • 当前状态:无法在浏览器之间导出或导入视频数据
  • 技术要求:添加用于导出数据为 JSON 并导入的 UI
  • 实现考虑:需要实现数据序列化和反序列化函数

6. 可扩展性

6.1 潜在功能

6.1.1 增强的播放控制

  • 跳过片头/片尾:自动检测并跳过重复片段
  • 播放速度控制:允许为每个 UP 主设置默认播放速度
  • 字幕偏好:记住每个 UP 主的字幕设置

6.1.2 社交集成

  • 分享进度:允许与朋友分享观看进度
  • 评论集成:在播放过程中显示相关评论
  • 通知系统:当关注的 UP 主上传新视频时通知用户

6.1.3 高级分析

  • 观看统计:关于观看习惯和时间花费的详细报告
  • 视频推荐:基于观看历史推荐视频
  • 进度可视化:所有视频观看进度的图形表示

6.2 技术方法

6.2.1 API 集成

  • 与 Bilibili API 集成以获得更可靠的数据提取
  • 使用官方 API 端点获取视频信息,而不是 DOM 解析
  • 实现 OAuth2 认证以访问受限 API 功能

6.2.2 数据库优化

  • 使用 indexedDB 提高大型视频列表的性能
  • 添加缓存机制以减少冗余 API 调用
  • 实现数据压缩以提高存储效率

6.2.3 UI/UX 改进

  • 为控制面板实现更现代、响应式的设计
  • 添加深色/浅色主题支持
  • 为常用操作实现键盘快捷键
  • 添加工具提示和帮助文本以获得更好的用户指导

6.3 集成可能性

6.3.1 浏览器扩展

  • 将脚本转换为独立浏览器扩展以获得更广泛的兼容性
  • 添加浏览器特定功能(例如 Chrome 通知、Firefox 侧边栏集成)

6.3.2 移动支持

  • 为移动浏览器适配脚本或创建专用移动应用
  • 实现云同步以实现设备间的无缝过渡

6.3.3 第三方服务集成

  • 与笔记应用集成,允许为视频添加笔记
  • 与日历应用连接以安排视频观看会话
  • 与分析服务集成以获得高级观看统计

7. 故障排除和常见问题

7.1 常见问题

7.1.1 脚本无法检测到 UP 主 ID

  • 症状:控制面板显示找不到 UP 主 ID 的错误
  • 解决方案:确保您访问的是正确的 URL 格式:https://space.bilibili.com/[UP主ID]/upload/video
  • 技术解释:脚本使用正则表达式从 URL 路径中提取 UP 主 ID

7.1.2 未收集到任何视频

  • 症状:收集过程快速完成,收集到 0 个视频
  • 解决方案:检查 UP 主的"投稿"部分是否有视频;尝试刷新页面
  • 技术解释:脚本依赖特定的 DOM 选择器,如果页面结构发生变化,可能会失败

7.1.3 自动播放下一个视频不起作用

  • 症状:视频结束后不会自动播放下一个视频
  • 解决方案:确保您没有禁用 JavaScript;检查视频时长是否被正确检测
  • 技术解释:脚本使用 HTML5 视频事件检测视频何时结束

7.1.4 进度未保存

  • 症状:刷新或关闭浏览器时,播放进度丢失
  • 解决方案:确保 Tampermonkey 已启用存储权限;尝试清除浏览器缓存
  • 技术解释:脚本使用 Tampermonkey 的 GM_setValue API,这需要适当的权限

7.2 常见问题解答

7.2.1 脚本是否会将任何数据上传到外部服务器?

不会。所有数据都使用 Tampermonkey 的存储 API 和 localStorage 存储在本地。没有数据会上传到任何外部服务器。

7.2.2 我可以在多个浏览器上使用该脚本吗?

是的,但数据是按浏览器存储的。您需要重新收集视频或手动在浏览器之间传输数据。

7.2.3 如果我从列表中删除一个 UP 主会发生什么?

与该 UP 主相关的所有数据都会被永久删除,包括视频列表、观看状态和进度。

7.2.4 我可以自定义"已观看"的阈值吗?

目前不行。阈值硬编码为视频时长的 75%。未来版本可能会使其可配置。

7.2.5 脚本是否适用于私有视频?

不适用。脚本仅收集 UP 主投稿页面上可见的公共视频。

7.3 调试技巧

7.3.1 检查控制台输出

  1. 打开浏览器开发者工具(F12 或 Ctrl+Shift+I)
  2. 切换到"控制台"选项卡
  3. 查找以"[UP 视频收集]"开头的消息,查看脚本活动和潜在错误

7.3.2 验证存储数据

  1. 在 Tampermonkey 仪表板中,转到脚本的存储选项卡
  2. 查找以"bili_up_"开头的键,查看存储的数据
  3. 如有需要,您可以手动编辑或删除数据

7.3.3 测试选择器

  1. 使用浏览器的元素检查器检查视频卡片是否使用预期的类名
  2. 验证"下一页"按钮是否有预期的选择器
  3. 检查 UP 主名称是否在预期位置

8. 技术支持

8.1 报告问题

  • 检查浏览器控制台是否有错误消息
  • 验证您使用的是脚本的最新版本
  • 确保 Tampermonkey 已更新到最新版本
  • 提供详细的问题信息,包括:
    • 浏览器和版本
    • Tampermonkey 版本
    • 发生问题的 URL
    • 控制台错误消息
    • 重现问题的步骤

8.2 贡献

  • 随时修改和改进脚本供个人使用
  • 考虑与社区分享改进
  • 遵循 Tampermonkey 脚本开发的最佳实践

9. 许可证和使用条款

9.1 许可证

本脚本按"原样"提供,不提供任何保证。使用风险自负。

9.2 Bilibili 服务条款

  • 本脚本的使用应符合 Bilibili 的服务条款
  • 不要将脚本用于过度爬取或任何可能给 Bilibili 服务器带来压力的活动
  • 尊重版权法和 UP 主的知识产权

9.3 隐私政策

  • 脚本不会收集或传输任何个人信息
  • 所有数据都存储在您的设备本地
  • 您负责本地数据的安全性

注意:本脚本仅供个人使用。开发者不对任何滥用或违反 Bilibili 服务条款的行为负责。

如需更多信息,请参阅 Bilibili 服务条款隐私政策

About

油猴脚本-B站up主页视频收集并顺序播放该up的所有视频

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published