基于指定 B 站 UP 主主页,开发一款能自动爬取该 UP 主所有投稿视频、按「发布时间倒序」连续播放、并持久化记录播放进度的工具,减少用户手动换视频的操作。
本项目是一个 Tampermonkey 脚本,旨在通过自动收集指定 UP 主页面的所有视频、支持按发布时间倒序(从新到旧)连续播放,并持久化记录每个视频的播放进度,从而增强 Bilibili 观看体验。
- 自动视频收集:从 UP 主页面爬取所有视频,提取标题、BV 号和发布时间等关键信息
- 智能播放系统:按发布时间倒序播放视频,当前视频结束后自动跳转到下一个
- 进度追踪:持久化记录每个视频的播放进度,允许用户从上次离开的位置继续观看
- 多 UP 主支持:为不同 UP 主维护独立数据,支持在不同 UP 主页面间无缝切换
- 关注多个 UP 主并希望更高效观看所有视频的 Bilibili 用户
- 希望跨会话跟踪观看进度的用户
- 喜欢按时间顺序观看视频且不想手动操作的用户
- 自动爬取:遍历 UP 主所有投稿页面,收集完整的视频信息
- 智能筛选:仅收集独立投稿视频,排除直播回放、合集子视频和预告短片等非完整内容
- 数据验证:确保收集的视频数据完整有效后再存储
- 去重机制:自动移除收集过程中的重复视频
- 倒序播放:默认按发布时间从新到旧的顺序播放视频
- 自动续播:当前视频结束后,若 5 秒内无用户操作,自动播放下一个视频
- 进度恢复:对未看完的视频,从上次保存的位置继续播放
- 观看状态:播放进度达到视频总时长的 75% 时,自动标记为已观看
- 持久化存储:使用 Tampermonkey 的 GM_setValue/GM_getValue API 进行本地数据持久化
- 多 UP 主隔离:每个 UP 主的数据使用唯一键单独存储
- 备份机制:将数据同步到 localStorage 作为备份
- 数据迁移:自动将旧数据格式升级为新格式
- 浮动控制面板:可从任何 Bilibili UP 主页面访问
- UP 主列表:显示所有已存储的 UP 主,带有播放和删除选项
- 可折叠区域:允许用户折叠/展开各部分以获得更好的组织性
- 进度统计:显示已收集视频数量、已观看/未观看状态
- 自定义延迟:允许用户设置页面爬取之间的随机延迟,以避免被检测
- 实时更新:延迟设置无需重启脚本即可立即生效
脚本根据当前页面类型以两种不同模式运行:
- UP 主空间页面:用于视频收集和管理
- 视频播放页面:用于进度跟踪和自动播放下一个视频
1. 解析当前页面 DOM 中的视频卡片
2. 提取视频信息(BV 号、标题、发布时间)
3. 验证并筛选有效的视频条目
4. 检查是否存在可用的"下一页"按钮
5. 如果有,点击"下一页"按钮
6. 使用 MutationObserver 等待 DOM 变化
7. 重复步骤 1-6 直到没有更多页面
8. 使用 Set 数据结构移除重复视频
9. 与现有视频列表合并,保留观看状态
10. 使用 GM_setValue 存储最终列表
1. 从 URL 中获取当前视频的 BV 号
2. 使用 HTML5 视频事件跟踪播放进度
3. 计算相对于总时长的播放百分比
4. 达到阈值时更新存储中的进度
5. 播放进度超过总时长的 75% 时标记为已观看
collectAllVideos():协调整个视频收集过程的主函数parseCurrentPageVideos():从当前页面 DOM 中提取视频信息getNextPageButton():使用多种选择器策略定位"下一页"按钮isNextButtonDisabled():判断"下一页"按钮是否可点击waitForVideoListChange():使用 MutationObserver 等待页面导航后的 DOM 更新
getAllStoredUpInfo():获取所有存储的 UP 主信息,支持格式转换deleteUpData():完全删除特定 UP 主的所有相关数据markCurrentVideoWatched():更新当前视频的观看状态和进度
addCollectButton():创建带有所有交互元素的浮动控制面板renderUpList():动态渲染存储的 UP 主列表及其控制项showCollectedInfoPanel():显示已收集视频的统计信息
getCurrentMid():从当前 URL 中提取 UP 主 IDrandomDelay():生成页面爬取之间的随机延迟getFirstUnwatchedVideoByUpId():查找特定 UP 主的第一个未观看视频
{
bv: "BV1xx411c7mT", // 视频唯一标识符
title: "视频标题", // 视频标题
pubTimeText: "2023-01-01", // 发布时间文本
watched: false, // 观看状态 (true/false)
watchProgress: 0 // 观看进度 (0-100%)
}| 数据类型 | 存储键格式 | 说明 |
|---|---|---|
| 视频列表 | 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 |
跨页面传递视频列表键 |
{
id: "1629347259", // UP 主唯一标识符
name: "UP 主名称" // UP 主昵称
}- 双重存储策略:同时使用 GM_setValue(用于跨浏览器持久化)和 localStorage(作为备份)
- 灵活选择器:实现多种选择器策略,以适应不同 Bilibili 页面布局的 DOM 解析
- 速率限制:包含可配置的随机延迟,以防止服务器过载和检测
- 渐进增强:优雅处理缺失元素和意外页面结构
- Tampermonkey 扩展:安装 Tampermonkey 浏览器扩展(支持 Chrome、Firefox、Edge 等)
- Bilibili 账号:建议拥有 Bilibili 账号以访问所有功能
- 为您的浏览器安装 Tampermonkey 扩展
- 在 Tampermonkey 中创建新脚本
- 将整个
main.js内容复制粘贴到脚本编辑器中 - 保存脚本并启用它
- 导航到任何 Bilibili UP 主的投稿页面(URL 格式:
https://space.bilibili.com/[UP主ID]/upload/video) - 点击右上角出现的"UP 视频收集"按钮
- 点击"🚀 开始收集"开始爬取该 UP 主的所有视频
- 等待收集过程完成(进度显示在浏览器控制台中)
- 点击"📊 查看收集信息"查看已收集视频的统计数据
- 收集视频后,点击"
▶️ 开始播放"从第一个未观看视频开始播放 - 脚本会在当前视频结束后自动播放下一个视频
- 如果手动导航离开,脚本会记住您的进度
- 观看视频时长达到 75% 时,视频会被标记为已观看
- 脚本会自动从 URL 中检测当前 UP 主 ID
- 每个 UP 主的数据分开存储,因此您可以在不同 UP 主页面间切换而不会丢失进度
- "📋 已存储 UP 主列表"部分显示所有已保存的 UP 主及其播放和删除选项
- 点击折叠/展开按钮可显示/隐藏 UP 主列表
- 在控制面板中,找到"⏱️ 随机延时"部分
- 在输入框中输入最大延迟时间(以毫秒为单位)
- 点击"💾 保存"应用设置
- 此延迟会在页面爬取之间随机应用,以避免被检测
- 查看统计:点击"📊 查看收集信息"查看总视频数、已观看/未观看数量
- 删除 UP 主数据:使用列表中任何 UP 主旁边的 🗑️ 按钮删除所有相关数据
- 手动重置进度:目前,您需要使用浏览器开发者工具直接修改存储值
- 当前状态:脚本目前不提取视频时长
- 技术要求:需要修改
parseCurrentPageVideos()从视频卡片中提取时长 - 实现考虑:时长信息将使进度跟踪更准确,并支持更智能的播放决策
- 当前状态:仅支持按发布时间倒序播放
- 技术要求:添加不同排序(正序、随机等)的 UI 选项,并存储自定义偏好
- 实现考虑:需要修改
getFirstUnwatchedVideoByUpId()中的视频选择逻辑
- 当前状态:没有用于管理视频列表的批量操作
- 技术要求:添加用于选择多个视频并标记为已观看/未观看的 UI
- 实现考虑:需要对大型视频列表进行重大 UI 增强和存储优化
- 当前状态:已收集视频中没有搜索功能
- 技术要求:添加基于标题、发布日期等的搜索输入和过滤选项
- 实现考虑:需要实现客户端搜索算法和 UI 组件
- 当前状态:无法在浏览器之间导出或导入视频数据
- 技术要求:添加用于导出数据为 JSON 并导入的 UI
- 实现考虑:需要实现数据序列化和反序列化函数
- 跳过片头/片尾:自动检测并跳过重复片段
- 播放速度控制:允许为每个 UP 主设置默认播放速度
- 字幕偏好:记住每个 UP 主的字幕设置
- 分享进度:允许与朋友分享观看进度
- 评论集成:在播放过程中显示相关评论
- 通知系统:当关注的 UP 主上传新视频时通知用户
- 观看统计:关于观看习惯和时间花费的详细报告
- 视频推荐:基于观看历史推荐视频
- 进度可视化:所有视频观看进度的图形表示
- 与 Bilibili API 集成以获得更可靠的数据提取
- 使用官方 API 端点获取视频信息,而不是 DOM 解析
- 实现 OAuth2 认证以访问受限 API 功能
- 使用 indexedDB 提高大型视频列表的性能
- 添加缓存机制以减少冗余 API 调用
- 实现数据压缩以提高存储效率
- 为控制面板实现更现代、响应式的设计
- 添加深色/浅色主题支持
- 为常用操作实现键盘快捷键
- 添加工具提示和帮助文本以获得更好的用户指导
- 将脚本转换为独立浏览器扩展以获得更广泛的兼容性
- 添加浏览器特定功能(例如 Chrome 通知、Firefox 侧边栏集成)
- 为移动浏览器适配脚本或创建专用移动应用
- 实现云同步以实现设备间的无缝过渡
- 与笔记应用集成,允许为视频添加笔记
- 与日历应用连接以安排视频观看会话
- 与分析服务集成以获得高级观看统计
- 症状:控制面板显示找不到 UP 主 ID 的错误
- 解决方案:确保您访问的是正确的 URL 格式:
https://space.bilibili.com/[UP主ID]/upload/video - 技术解释:脚本使用正则表达式从 URL 路径中提取 UP 主 ID
- 症状:收集过程快速完成,收集到 0 个视频
- 解决方案:检查 UP 主的"投稿"部分是否有视频;尝试刷新页面
- 技术解释:脚本依赖特定的 DOM 选择器,如果页面结构发生变化,可能会失败
- 症状:视频结束后不会自动播放下一个视频
- 解决方案:确保您没有禁用 JavaScript;检查视频时长是否被正确检测
- 技术解释:脚本使用 HTML5 视频事件检测视频何时结束
- 症状:刷新或关闭浏览器时,播放进度丢失
- 解决方案:确保 Tampermonkey 已启用存储权限;尝试清除浏览器缓存
- 技术解释:脚本使用 Tampermonkey 的 GM_setValue API,这需要适当的权限
不会。所有数据都使用 Tampermonkey 的存储 API 和 localStorage 存储在本地。没有数据会上传到任何外部服务器。
是的,但数据是按浏览器存储的。您需要重新收集视频或手动在浏览器之间传输数据。
与该 UP 主相关的所有数据都会被永久删除,包括视频列表、观看状态和进度。
目前不行。阈值硬编码为视频时长的 75%。未来版本可能会使其可配置。
不适用。脚本仅收集 UP 主投稿页面上可见的公共视频。
- 打开浏览器开发者工具(F12 或 Ctrl+Shift+I)
- 切换到"控制台"选项卡
- 查找以"[UP 视频收集]"开头的消息,查看脚本活动和潜在错误
- 在 Tampermonkey 仪表板中,转到脚本的存储选项卡
- 查找以"bili_up_"开头的键,查看存储的数据
- 如有需要,您可以手动编辑或删除数据
- 使用浏览器的元素检查器检查视频卡片是否使用预期的类名
- 验证"下一页"按钮是否有预期的选择器
- 检查 UP 主名称是否在预期位置
- 检查浏览器控制台是否有错误消息
- 验证您使用的是脚本的最新版本
- 确保 Tampermonkey 已更新到最新版本
- 提供详细的问题信息,包括:
- 浏览器和版本
- Tampermonkey 版本
- 发生问题的 URL
- 控制台错误消息
- 重现问题的步骤
- 随时修改和改进脚本供个人使用
- 考虑与社区分享改进
- 遵循 Tampermonkey 脚本开发的最佳实践
本脚本按"原样"提供,不提供任何保证。使用风险自负。
- 本脚本的使用应符合 Bilibili 的服务条款
- 不要将脚本用于过度爬取或任何可能给 Bilibili 服务器带来压力的活动
- 尊重版权法和 UP 主的知识产权
- 脚本不会收集或传输任何个人信息
- 所有数据都存储在您的设备本地
- 您负责本地数据的安全性
注意:本脚本仅供个人使用。开发者不对任何滥用或违反 Bilibili 服务条款的行为负责。