🏠 Home 

BiliBili自动跳过广告

自动跳过视频中的广告


安装此脚本?
  1. // ==UserScript==
  2. // @name BiliBili自动跳过广告
  3. // @namespace AWang_Dog/bilibili-StepOverADS
  4. // @version 0.2.3
  5. // @description 自动跳过视频中的广告
  6. // @author AWang_Dog
  7. // @license GPLv3
  8. // @icon data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABMLAAATCwAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A1qEAANahAADWoQAG1qEAb9ahAMvWoQD01qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD01qEAy9ahAG/WoQAG1qEAANahAADWoQAA1qEAG9ahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahANDWoQAb1qEAANahAAfWoQDQ1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahANHWoQAH1qEAbtahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAG7WoQDH1qEA/9ahAP/WoQD/1qEAtdahABjWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABvWoQC11qEA/9ahAP/WoQD/1qEAx9ahAPnWoQD/1qEA/9ahAP/WoQAZ1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABjWoQD/1qEA/9ahAP/WoQDz1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAErWoQDn1qEA5NahAErWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAErWoQDn1qEA5NahAErWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA59ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA59ahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA5tahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA5tahAP/WoQD/1qEA5tahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAADWoQAA1qEAANahAADWoQBJ1qEA5tahAObWoQBJ1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQBJ1qEA5tahAObWoQBJ1qEAANahAADWoQAA1qEAANahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQD/1qEA/9ahAP/WoQD/1qEA+dahAP/WoQD/1qEA/9ahABnWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAGdahAP/WoQD/1qEA/9ahAPjWoQDH1qEA/9ahAP/WoQD/1qEAttahABnWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahABnWoQC21qEA/9ahAP/WoQD/1qEAx9ahAG3WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQBt1qEABtahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA0NahAAfWoQAA1qEAG9ahAM/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAM/WoQAb1qEAANahAADWoQAA1qEABtahAG7WoQDH1qEA89ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA/9ahAP/WoQD/1qEA89ahAMfWoQBu1qEABtahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAA/WoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAA/WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAAbWoQDF1qEA/9ahAP/WoQD/1qEA/9ahAMXWoQAP1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAxdahAAbWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAYtahAP/WoQD/1qEA/9ahAP/WoQDF1qEADtahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQD/1qEAY9ahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQBf1qEA/9ahAP/WoQD/1qEAxdahAA7WoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAMXWoQD/1qEA/9ahAP/WoQBf1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAATWoQCg1qEA6tahAKjWoQAO1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEAANahAADWoQAA1qEADtahAKjWoQDr1qEAoNahAATWoQAA1qEAANahAADWoQAA1qEAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A///////////AAAADgAAAAQAAAAAAAAAAA///wAf//+AP///wD///8A////AP///wDw/w8A8P8PAPD/DwDw/w8A8P8PAPD/DwD///8A////AH///gA///wAAAAAAAAAAAgAAAAcAAAAP8A8A/+AfgH/gP8B/4H/gf+D/8H/////8=
  9. // @match *://*.bilibili.com/video/*
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_unregisterMenuCommand
  12. // @grant GM_xmlhttpRequest
  13. // @grant GM_getValue
  14. // @grant GM_setValue
  15. // @website https://github.com/AWangDog/bilibili-StepOverADS
  16. // @supportURL https://github.com/AWangDog/bilibili-StepOverADS/issues
  17. // ==/UserScript==
  18. var jmpStart_ID
  19. var jmpADS_ID
  20. var jmpEND_ID
  21. var startActived
  22. (async function() {
  23. 'use strict';
  24. console.log('StepOverADS-脚本开始执行');
  25. startActived = GM_getValue('startActived', {jmpStart: false, jmpADS: true, jmpEnd: false});
  26. GM_setValue('startActived', startActived);
  27. // 初始化
  28. registerMenuCommand(startActived); // 注册菜单
  29. const videoId = getVideoId(); // 获取视频id
  30. var player = getPlayer(); // 获取视频播放器
  31. const adInfo = await getADInfo(videoId); // 获取跳转时间信息
  32. listen(player, adInfo)
  33. })();
  34. function listen(player, adInfo) {
  35. const TimeInter = getTimeInter(adInfo) // 获取全部时间区间
  36. // 监听视频播放器
  37. player.addEventListener('timeupdate', function() {
  38. for (let interval of TimeInter) {
  39. if (player.currentTime >= interval[1] && player.currentTime <= interval[2]) {
  40. console.log("StepOverADS-当前位于需跳转时间段中");
  41. if (interval[0] == "start" && startActived.jmpStart) {
  42. console.log("StepOverADS-跳过片头: 已由" + player.currentTime + "跳到" + interval[2]);
  43. player.currentTime = interval[2]
  44. }
  45. else if (interval[0] == "ads" && startActived.jmpADS) {
  46. console.log("StepOverADS-跳过广告: 已由" + player.currentTime + "跳到" + interval[2]);
  47. player.currentTime = interval[2]
  48. }
  49. else if (interval[0] == "end" && startActived.jmpEnd) {
  50. console.log("StepOverADS-跳过片尾: 已由" + player.currentTime + "跳到" + interval[2]);
  51. player.currentTime = interval[2]
  52. }
  53. }
  54. }
  55. });
  56. }
  57. // 获取视频播放器
  58. function getPlayer() {
  59. var video = document.querySelector('video');
  60. if (video) {
  61. console.info('StepOverADS-视频播放器已加载');
  62. return video;
  63. } else {
  64. console.error('StepOverADS-视频播放器未加载');
  65. return null;
  66. };
  67. };
  68. // 获取视频id
  69. function getVideoId() {
  70. const url = window.location.href;
  71. console.info('StepOverADS-视频url:', url);
  72. const match = url.match(/BV\w+/);
  73. if (match) {
  74. console.info('StepOverADS-视频id:', match[0]);
  75. return match[0].trim();
  76. } else {
  77. console.error('StepOverADS-未找到视频id');
  78. return null;
  79. };
  80. };
  81. // 获取广告信息
  82. async function getADInfo(videoId) {
  83. try {
  84. // 使用fetch API获取JSON文件
  85. const response = await fetch('https://raw.githubusercontent.com/AWangDog/bilibili-StepOverADS/main/ads_jump.json');
  86. // 检查响应是否成功
  87. if (!response.ok) {
  88. console.error(`StepOverADS-HTTP error: ${response.status}`);
  89. }
  90. // 将响应解析为JSON并返回
  91. const data = await response.json();
  92. console.info('StepOverADS-广告信息获取成功: ', data);
  93. if (data.hasOwnProperty(videoId)) {
  94. console.info('StepOverADS-找到此视频广告信息: ', data[videoId]);
  95. return data[videoId];
  96. } else {
  97. console.warn('StepOverADS-未找到广告信息');
  98. return null;
  99. }
  100. } catch (error) {
  101. console.error('StepOverADS-Error fetching AD info:', error);
  102. return null;
  103. }
  104. }
  105. // 注册脚本菜单
  106. function registerMenuCommand(startActived) {
  107. if (jmpStart_ID) {GM_unregisterMenuCommand(jmpStart_ID); GM_unregisterMenuCommand(jmpADS_ID); GM_unregisterMenuCommand(jmpEND_ID)}
  108. jmpStart_ID = GM_registerMenuCommand(`${startActived.jmpStart?'✅':'❌'} 跳过片头`, function() {startActived.jmpStart = !startActived.jmpStart; GM_setValue('startActived', startActived);registerMenuCommand(startActived)});
  109. jmpADS_ID = GM_registerMenuCommand(`${startActived.jmpADS?'✅':'❌'} 跳过广告`, function() {startActived.jmpADS = !startActived.jmpADS; GM_setValue('startActived', startActived);registerMenuCommand(startActived)});
  110. jmpEND_ID = GM_registerMenuCommand(`${startActived.jmpEnd?'✅':'❌'} 跳过片尾`, function() {startActived.jmpEnd = !startActived.jmpEnd; GM_setValue('startActived', startActived);registerMenuCommand(startActived)});
  111. }
  112. // 获取时间区间
  113. function getTimeInter(data) {
  114. let r###lt = [];
  115. let maxEndTime = 10000000000; // 定义一个非常大的结束时间
  116. // 处理 "start"
  117. try {
  118. if (data.start && Array.isArray(data.start)) {
  119. // 将 "start" 部分合并成一个时间段
  120. let startTimes = data.start.sort((a, b) => a - b);
  121. r###lt.push(["start", startTimes[0], startTimes[startTimes.length - 1]]);
  122. } else {console.warn("StepOverADS-未找到片头信息: ")}
  123. } catch (error) {
  124. console.warn("StepOverADS-未找到片头信息: ", error);
  125. }
  126. // 处理 "ads"
  127. try {
  128. if (data.ads && Array.isArray(data.ads)) {
  129. data.ads.forEach(ad => {
  130. if (Array.isArray(ad) && ad.length === 2) {
  131. const ads = ["ads", ad[0], ad[1]]
  132. r###lt.push(ads);
  133. }
  134. });
  135. } else {console.warn("StepOverADS-未找到广告信息: ")}
  136. } catch (error) {
  137. console.warn("StepOverADS-未找到广告信息: ", error);
  138. }
  139. // 处理 "end"
  140. try {
  141. if (data.end && Array.isArray(data.end)) {
  142. data.end.forEach(endTime => {
  143. r###lt.push(["end", endTime, maxEndTime]);
  144. });
  145. } else {console.warn("StepOverADS-未找到片尾信息: ")}
  146. } catch (error) {
  147. console.warn("StepOverADS-未找到片尾信息: ", error);
  148. }
  149. console.info('StepOverADS-全部时间段: ', r###lt);
  150. return r###lt;
  151. }