您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
识别多种时间格式,UI简化。
这是一个UserScript脚本,用于在Bilibili(B站)视频页面中,通过分析弹幕(danmu)自动识别并跳过内置广告。脚本基于弹幕中的时间指令(如“快进到X分”)来检测可能的广告起始点(A)和结束点(B),并在视频播放到A时自动跳转到B。版本0.1新增了“快进指令提权”(优先保留并提升“快进到”等指令的权重)和“发布时长剔除”(排除视频开头表示“发布X分钟”的无关弹幕)功能。
脚本不修改视频内容,仅监控播放时间并调整currentTime。适用于B站视频页面(https://www.bilibili.com/video/*)。
安装Tampermonkey或其他UserScript管理器:
安装脚本:
权限:
GM_xmlhttpRequest
和GM_addStyle
权限,用于获取弹幕XML和添加UI样式。安装后,访问B站视频页面,脚本会自动运行。
自动运行:
UI交互:
跳过触发:
手动干预:
调试:
maxDanmuLoad
加载更多弹幕)。注意:脚本依赖弹幕质量。如果视频弹幕少/无关/被屏蔽,检测准确率降低。B站可能更新API导致CID/弹幕获取失败,请报告issue。
脚本的CONFIG对象定义了核心参数,可在脚本开头修改:
maxDanmuLoad
: 最大加载弹幕数(默认6000,避免性能问题)。fetchRetries
: 弹幕请求重试次数(默认3)。triggerWindow
: 触发时间聚类窗口(秒,默认2)。minDeltaSeconds
: 最小跳过时长(默认5秒)。maxDeltaSeconds
: 最大跳过时长(默认300秒)。weightWindowSeconds
: 权重支持弹幕窗口(默认20秒)。minSkipDuration
: 最小有效跳过时长(默认5秒)。maxSkipFraction
: 最大跳过比例(默认视频长度的0.5)。baseWeight
: 基础权重(默认0.6)。timeKwExtra
: 时间关键词额外权重(默认2.0)。targetKwExtra
: 目标关键词额外权重(默认2.0)。weightDanmuBoost
: 支持弹幕权重提升(默认2.5)。clusterBoostFactor
: 聚类大小提升因子(默认0.5)。forbiddenTokens
: 禁止标记列表(e.g., '+', '%', 用于排除无关弹幕)。measurementTokens
: 测量标记列表(用于排除数据类弹幕)。maxNonTimeCharsAllowed
: 最大非时间字符数(默认3,超过则降权)。nonTimeCharsPenaltyFactor
: 非时间字符惩罚因子(默认0.2)。acceptWeightThreshold
: 接受权重阈值(默认0.75)。fastForwardBoost
: 快进指令权重提升(默认1.2)。POSTAGE_WINDOW_SECONDS
: 发布时长窗口(默认25秒,视频开头内检查)。POSTAGE_TARGET_SECONDS
: 发布时长目标(默认60秒,主要针对“1分钟”)。关键词列表:
TIME_KEYWORDS
: 时间指令关键词(e.g., '快进', '跳到')。WEIGHT_A_KEYWORDS
: A点权重关键词(e.g., '广告', '起手')。WEIGHT_B_KEYWORDS
: B点权重关键词(e.g., '欢迎回来')。脚本逻辑分为初始化、数据获取、分析处理和应用跳过四个阶段。以下逐一分解:
<video>
加载,绑定timeupdate
事件监听当前时间。https://api.bilibili.com/x/v1/dm/list.so?oid={cid}
),重试机制。<d>
标签的时间(p属性)和文本。上下文判断:
isMeasurementContext
: 检查是否为测量数据(e.g., “100米/秒”),排除。isScoreContext
: 检查是否为打分(e.g., “打8分”),排除。isFastForwardInstruction
: 检查是否为快进指令(e.g., “快进到X分”),保留并提权(+fastForwardBoost)。isPostAgeContext
: 检查是否为发布时长(e.g., “发布一分钟”),结合A时间 <= POSTAGE_WINDOW_SECONDS 排除。时间格式识别:使用正则匹配多种格式,提取目标时间B(target),触发时间A为弹幕出现时间。
X:Y
X分Y秒
X分
(特殊处理:打分/发布时长剔除,快进提权)X Y
/ X.Y
XYZ
(3位)或WXYZ
(4位)解析为分钟:秒向右X
/ 右X下
(计算B = A + 5*X)X点Y分Z秒
过滤候选:
权重计算:
选择跳点:
更新UI:显示候选列表、匹配弹幕、日志。
以下使用Mermaid语法生成流程图(在GitHub Markdown中渲染)。如果无法渲染,可复制到Mermaid Live Editor查看。
flowchart TD
A[初始化: 创建UI, 监听视频元素] --> B[解析CID: 从页面/API获取]
B --> C{获取成功?}
C -->|否| D[日志: 无法获取CID, 终止]
C -->|是| E[获取弹幕: 请求XML, 重试3次]
E --> F{弹幕数量 >0?}
F -->|否| G[日志: 无弹幕, 终止]
F -->|是| H[解析弹幕: 提取时间A和文本]
H --> I[标准化文本 & 中文数字转换]
I --> J[识别时间格式: 正则匹配多种格式, 提取B]
J --> K[上下文判断: 排除打分/测量/发布时长, 提权快进指令]
K --> L[过滤候选: delta范围, 禁止标记, 非时间字符降权]
L --> M{候选 >0?}
M -->|否| N[日志: 无有效候选, 终止]
M -->|是| O[权重计算: 基础 + 关键词 + 聚类 + 支持弹幕]
O --> P[排序候选: 权重 > 数量 > 最早A]
P --> Q[选择跳点: 验证阈值/簇/支持, 选最高权重]
Q --> R[更新UI: 显示候选/匹配/日志]
R --> S[监听timeupdate: 当前时间 ≈ A 时跳转到B]
S --> T[日志: 跳转成功, 清空规则]
如果有问题,打开issue讨论!