// ==UserScript== // @name 解锁b站vip视频并附带弹幕 // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACS0lEQVRYR8WXz2oTURTGv3MnpqhNKy1UWmxRTGdaiLSQRKkKIoK4FVrRPoHu7BMYn0B3+gQquuiuiC6kaFVsAhGEZkKqG/+Vrtp0YWsyR27KlEwz0xnnT3LgwjB37vl+97tzz9whdDiow/pwBCjofN0AJohwKQgkMxYF8Dmt0bxdnhaAQoWTXMczENJBhFvGMgqk4GY6SZXmPgvAmy/cnYijGqrwvmTVHSQup2jLvG0ByJf5EYDbUQIAeJxR6U4LQHGV1VodesTijfQxBdrkaSrL6z0Hlst8i4An7QBgYDar0lMrgM45ItxrCwDjflajnC+AtR8Gvn8zGpz9xwVOjor/Zma/ANt/GIsLNWxt8p7o4IiAmlLQP+C9pvkG+FoyUPxYs52xhFDPKIh3uRviG2ClWIdsTpHoJYymFNdliQzABBsaEZg4p+DwUftliRxAggwOC0xdidma1RaAI92Ea9OHOgcwPqlANruI1AElhsa2dBKXQJEBnDglGlvxWN/BNcE3gKyCS69b64AUlMISwEv4BpDJ3778i/Xfu5XQtFtaLq+9RiCA6gZj/dcuQN8Audod6kvodYZuz9k7UOK7JPDAbXAY/WxgLjtGDy2f408VPi8MLIUh4JbDELhwNknvLQDyQNoTh87AkFuCIP0E/NzcgWYeTC0bdrkNp6Lm9bc4YM4qr/NzEGaCzNJxLONFRqMbzf22JSu/wlcphhwzpsIAIcIHriGXGadX+/MdWDPflTjRxcH+kLYJhYtj5Piz4/0gF4YVNjk6DvAPDb0aMEr8/nEAAAAASUVORK5CYII= // @version 1.11.5.1 // @description 解除B站大会员观影限制,理论支持番剧和放映厅,不支持的视频请反馈留地址让我修复 // @author p7 // @match https://www.bilibili.com/bangumi/* // @match https://vip.parwix.com:4433/* // @match https://z1.m1907.cn/* // @match https://api.yueliangjx.com/* // @match https://showxi.xyz/* // @match https://okjx.cc/* // @run-at document-end // @grant GM_openInTab // @grant GM.openInTab // @grant GM_getValue // @grant GM.getValue // @grant GM_setValue // @grant GM.setValue // @grant GM_addStyle // @require https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js // @namespace https://greasyfork.org/users/789132 // @downloadURL none // ==/UserScript== (function () { var player var playerRect var minpool = [] var domPool = []; var domtopdownPool = []; var listobj var distance = 25 var fontSize = 25; var buiSwitch = true; function xmlToJson(xml) { // Create the return object var obj = {}; if (xml.nodeType == 1) { // element // do attributes if (xml.attributes.length > 0) { obj["@attributes"] = {}; for (var j = 0; j < xml.attributes.length; j++) { var attribute = xml.attributes.item(j); obj["@attributes"][attribute.nodeName] = attribute.nodeValue; } } } else if (xml.nodeType == 3) { // text obj = xml.nodeValue; } // do children if (xml.hasChildNodes()) { for (var i = 0; i < xml.childNodes.length; i++) { var item = xml.childNodes.item(i); var nodeName = item.nodeName; if (typeof (obj[nodeName]) == "undefined") { obj[nodeName] = xmlToJson(item); } else { if (typeof (obj[nodeName].push) == "undefined") { var old = obj[nodeName]; obj[nodeName] = []; obj[nodeName].push(old); } obj[nodeName].push(xmlToJson(item)); } } } return obj; }; function getBV() { let bv = $("a.av-link[target='_blank']")[0] if (bv) { //console.log(bv.innerText); $.getJSON("https://api.bilibili.com/x/player/pagelist?bvid=" + bv.innerText, function (result) { var xmlhtml = `https://api.bilibili.com/x/v1/dm/list.so?oid=${result.data[0].cid}` //ajax解析xml文件 console.log(xmlhtml); $.ajax({ url: xmlhtml, dataType: "xml", success: function (xml) { //console.log('xmllist', xmlToJson(xml)); let listjson = xmlToJson(xml) console.log($('.bilibili-player-video-info-danmaku-number'), listjson.i.d.length) $('.bilibili-player-video-info-danmaku-number').text(listjson.i.d.length) window.frames[0].postMessage({ obj: listjson, str: 'xmllist' }, '*'); window.frames[0].frames[0].postMessage({ obj: listjson, str: 'xmllist' }, '*'); } }) }) } else { setTimeout(function () { getBV(vipiframe) }, 500) } } function receiveInfoFromAnotherDomain() { //首先让window添加一个事件监听函数,表明它可以监听窗口对象的message事件 //它受到事件时,会先判断是否来自指定的Domain(不是所有Domain丢过来的事件它都处理的) window.addEventListener("message", function (ev) { switch (window.location.host) { case 'www.bilibili.com': if (ev.origin != 'https://www.bilibili.com' && ev.origin != 'https://message.bilibili.com') { console.log(ev.origin, ' message to', window.location.href, ev.data); if (ev.data.str == 'hasplayer') { getBV() } } break default: window.top.postMessage({ web: window.location.href, obj: ev.data, str: '来自iframe:', from: ev.origin }, '*'); switch (ev.data.str) { case 'xmllist': listobj = ev.data.obj; break; case 'checktrue': buiSwitch = true; break; case 'checkfalse': buiSwitch = false; break; } } }) } function detecH5Player(findplayertime) { player = document.querySelector('video'); if (player) { //console.log(window.location.href+'发现h5') receiveInfoFromAnotherDomain(); window.top.postMessage({ str: 'hasplayer', web: window.location.href }, '*'); playerRect = player.getBoundingClientRect(); initcss(); player.addEventListener('pause', function () { //暂停开始执行的函数 $('.left').each(function (index, element) { element.style.willChange = 'auto' let domRect = element.getBoundingClientRect(); let domLeft = domRect.left - playerRect.left; $(element).css('transform', `translateX(${domLeft}px)`); $(element).css('transition', `transform 0s linear`); }) }); player.addEventListener('playing', function () { //暂停开始执行的函数 playtime = (new Date()).getTime() $('.left').each(function (index, element) { let domRect = element.getBoundingClientRect() let domLeft = domRect.left - playerRect.left let oldS = element.clientWidth + player.clientWidth let newS = element.clientWidth + domLeft let oldT = 0.0074 * (element.clientWidth + player.clientWidth) let newT = newS / oldS * oldT //console.log(element.clientWidth+','+player.clientWidth+','+oldS+','+newS+','+oldT+','+newT) $(element).css('transition', `transform ${newT}s linear`); $(element).addClass('left'); element.style.willChange = 'transform' element.style.transform = `translateX(${-element.clientWidth}px)`; }) }); player.addEventListener('timeupdate', function () { if (minpool.length == 0 && listobj) { //window.top.postMessage({obj:'player.duration:'+player.duration,str:'来自iframe:',from:window.location.href},'*'); minpool = new Array(parseInt(player.duration / 60)); let minlen = minpool.length for (var a = 0; a <= minlen; a++) { minpool[a] = [] } let len = listobj.i.d.length //window.top.postMessage({obj:'listobj.i.d.length:'+listobj.i.d.length,str:'来自iframe:',from:window.location.href},'*'); for (var j = 0; j < len; j++) { let strp = listobj.i.d[j]['@attributes'].p let arrp = strp.split(','); let arrpJson = { "time": arrp[0], "type": arrp[1], "size": arrp[2], "rgb": arrp[3], "pool": arrp[5], "text": listobj.i.d[j]['#text'] }; minpool[parseInt(arrp[0] / 60)].push(arrpJson); /*window.top.postMessage({ obj: 'minpool push:' + minpool[parseInt(arrp[0] / 60)][minpool[parseInt(arrp[0] / 60)].length - 1], str: '来自iframe:', from: window.location.href }, '*');*/ } } //window.top.postMessage({obj:'currentTime:'+player.currentTime+' '+minpool.length+' '+domPool.length,str:'来自iframe:',from:window.location.href},'*'); $('.topdown').each(function (index, element) { if (element.innerText != '') { let nowtime = (new Date()).getTime(); let lasttime = parseInt(nowtime) - parseInt($(element).prop("name")) //console.log('lasttime:'+lasttime+' '+typeof lasttime); if (lasttime >= 4500) { //console.log('lasttime2:'+lasttime+' '+typeof lasttime); element.innerText = '' element.name = '' } } }); //window.top.postMessage({obj:buiSwitch.prop("checked"),str:'来自iframe:',from:window.location.href},'*'); if (minpool.length != 0 && domPool.length != 0 && buiSwitch == true) { let channel; let nowlen = parseInt(player.currentTime / 60); //console.log('currentTime:'+player.currentTime); //window.top.postMessage({obj:'currentTime:'+player.currentTime+' '+minpool[nowlen].length,str:'来自iframe:',from:window.location.href},'*'); if (!$(player).paused) { for (var j = minpool[nowlen].length - 1; j > -1; j--) { //console.log('pool:'+minpool[nowlen][j].pool) //window.top.postMessage({obj:minpool[nowlen][j],str:'来自iframe:',from:window.location.href},'*'); if (minpool[nowlen][j].time >= player.currentTime && minpool[nowlen][j].time <= player.currentTime + 0.5 && minpool[nowlen][j].type == '1') { channel = getChannel() //console.log('channel:'+channel) if (channel != -1) { let arrpJson = minpool[nowlen][j] //console.log(minpool[nowlen][j].time+','+player.currentTime+' biu~ [' + minpool[nowlen][j].text + ']'); let dom = domPool[channel].shift() //把数组的第一个元素从其中删除 domPool[channel].push(dom); //向数组的末尾添加一个或多个元素 shootDanmu(dom, arrpJson, channel); } } else if (minpool[nowlen][j].time >= player.currentTime && minpool[nowlen][j].time <= player.currentTime + 0.5 && minpool[nowlen][j].type != '1') { channel = gettopdownChannel(minpool[nowlen][j].type); console.log('gettopdownChannel:' + channel); if (channel != -1) { let arrpJson = minpool[nowlen][j] //console.log(minpool[nowlen][j].time+','+player.currentTime+' biu~ [' + danmu + ']'); let dom = domtopdownPool[channel]; shoottopdownDanmu(dom, arrpJson, channel); } } } } } else if (buiSwitch == false) { $('.left').each(function (index, element) { $(element).css('transition', `transform 0s linear`); $(element).addClass('right'); element.style.willChange = 'transform' element.style.transform = `translateX(${-element.clientWidth}px)`; element.style.transition = null; element.style.willChange = 'auto' element.style.transform = `translateX(${player.clientWidth}px)` element.innerText = '' element.className = 'right'; }) $('.topdown').each(function (index, element) { element.innerText = '' }) } }) } else { // 轮询检测 setTimeout(function () { //console.log(window.location.href + '开始检测h5', findplayertime, new Date().getTime() - findplayertime); if (new Date().getTime() - findplayertime <= 5000) { detecH5Player(findplayertime) } }, 500) } } let hasPosition = []; var MAX_DM_COUNT = 8 var CHANNEL_COUNT = 0 function initcss() { let css = `.right { position: absolute; visibility: hidden; white - space: nowrap; /*left: 700px; transform: translateX(700px);*/ }.left { position: absolute; white - space: nowrap; user - select: none; /* transition: transform 7s linear; 时间相同 越长的弹幕滑动距离越长 所以越快~ */ }.topdown { position: absolute; white - space: nowrap; user - select: none; }` GM_addStyle(css); refreshDom(); } function refreshDom() { MAX_DM_COUNT = 10; CHANNEL_COUNT = Math.floor(player.clientHeight / fontSize); // 先new一些span 重复利用这些DOM for (let j = 0; j < CHANNEL_COUNT; j++) { let doms = []; for (let i = 0; i < MAX_DM_COUNT; i++) { // 要全部放进player let dom = document.createElement('div'); //alert(fontSize) dom.style.fontSize = fontSize + 'px'; dom.style.color = 'rgb(255,255,255)'; dom.style.fontFamily = 'SimHei, "Microsoft JhengHei", Arial, Helvetica, sans-serif' dom.style.fontWeight = 'bold' dom.style.opacity = '1' //不透明度 dom.style.textShadow = 'rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px'; dom.style.transform = `translateX(${player.clientWidth}px)` dom.style.willChange = 'auto' // 初始化dom的位置 通过设置className dom.className = 'right'; // DOM的通道是固定的 所以设置好top就不需要再改变了 dom.style.top = j * fontSize + 'px'; player.parentNode.appendChild(dom); // 放入改通道的DOM池 doms.push(dom); // 每次到transition结束的时候 就是弹幕划出屏幕了 将DOM位置重置 再放回DOM池 dom.addEventListener('transitionend', () => { dom.style.transition = null; dom.style.willChange = 'auto' dom.style.transform = `translateX(${player.clientWidth}px)` dom.innerText = '' dom.className = 'right'; }); } domPool.push(doms); let dom2 = document.createElement('div'); dom2.style.fontSize = fontSize + 'px'; dom2.style.color = 'rgb(255,255,255)'; dom2.style.fontFamily = 'SimHei, "Microsoft JhengHei", Arial, Helvetica, sans-serif' dom2.style.fontWeight = 'bold' dom2.style.opacity = '1' //不透明度 dom2.style.textShadow = 'rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px'; dom2.style.willChange = 'auto' dom2.style.top = j * fontSize + 'px'; dom2.className = 'topdown'; player.parentNode.appendChild(dom2); domtopdownPool.push(dom2); } } /** * 获取一个可以发射弹幕的通道 没有则返回-1 */ function getChannel() { for (let i = 0; i < CHANNEL_COUNT; i++) { let lastNumPos = domPool[i].length - 1 let lastDom = domPool[i][lastNumPos]; //console.log('lastDom:'+lastDom) if (lastDom) { if (lastDom.className == 'right') { //console.log('捷径') return i } let lastDomPos = lastDom.getBoundingClientRect(); //console.log('lastDomPos.right:'+lastDomPos.right+'playerRect.right:'+playerRect.right) // 轨道中最后一个元素要求已经全部进入展示区域 if (lastDomPos.right > playerRect.right) { continue } let occupyS = lastDomPos.right - playerRect.left //console.log('playerRect.left:'+occupyS+'player.clientWidth:'+player.clientWidth) // 追及问题 if (player.clientWidth - occupyS < distance) { continue } for (let j = 0; j < domPool[i].length; j++) { if (domPool[i][j].className == 'right') { return i } } } } return -1; } function gettopdownChannel(type) { for (let i = 0; i < CHANNEL_COUNT; i++) { if (type == 4) { let lastNumPos = domtopdownPool.length - i - 1 let downDom = domtopdownPool[lastNumPos]; if (downDom.innerText == '') { return i } } else if (type == 5) { let lastNumPos2 = i let topDom = domtopdownPool[lastNumPos2]; if (topDom.innerText == '') { return i } } } return -1; } /** * 根据DOM和弹幕信息 发射弹幕 */ function shootDanmu(dom, arrpJson, channel) { dom.innerText = arrpJson.text; console.log(' biu1~ [' + arrpJson.text + ']'); let num16 = parseInt(arrpJson.rgb).toString(16); dom.style.color = '#' + (Array(6).join(0) + num16).slice(-6); dom.style.fontSize = arrpJson.size + 'px'; // 如果为每个弹幕设置 transition 可以保证每个弹幕的速度相同 这里没有保证速度相同 dom.style.transition = `transform ${0.0074*(dom.clientWidth+player.clientWidth)}s linear`; // 设置弹幕的位置信息 性能优化 left -> transform dom.style.transform = `translateX(${-dom.clientWidth}px)`; dom.style.willChange = 'transform'; dom.className = 'left'; } function shoottopdownDanmu(dom, arrpJson, channel) { //1.11.5 格式化居然把这function丢失了 dom.innerText = arrpJson.text; dom.name = new Date().getTime(); console.log(' biu2~ [' + arrpJson.text + ']'); let num16 = parseInt(arrpJson.rgb).toString(16); dom.style.fontSize = arrpJson.size + 'px'; dom.style.color = '#' + (Array(6).join(0) + num16).slice(-6); dom.style.transform = `translateX(${(player.clientWidth-dom.clientWidth)/2}px)`; } var $ = $ || window.$; var originalInterfaceList = [{ "name": "Parwix", "category": "1", "url": "https://vip.parwix.com:4433/player/?url=" }, { "name": "月亮", "category": "1", "url": "https://api.yueliangjx.com/?url=" }, { "name": "1907", "category": "1", "url": "https://z1.m1907.cn/?jx=" }, { "name": "showxi[多线]", "category": "1", "url": "https://showxi.xyz/mov/s/?sv=3&url=" }, { "name": "OK[多线]", "category": "1", "url": "https://okjx.cc/?url=" }, ]; /** * 共有方法 */ function commonFunction() { this.GMgetValue = function (name, value) { //得到存在本地的数据 if (typeof GM_getValue === "function") { return GM_getValue(name, value); } else { return GM.getValue(name, value); } }; this.GMsetValue = function (name, value) { //设置存在本地的数据 if (typeof GM_setValue === "function") { return GM_setValue(name, value); } else { return GM.setValue(name, value); } }; this.GMaddStyle = function (css) { //插入css var myStyle = document.createElement('style'); myStyle.textContent = css; var doc = document.head || document.documentElement; doc.appendChild(myStyle); }; this.GMopenInTab = function (url, open_in_background) { //新标签页打开网址 if (typeof GM_openInTab === "function") { GM_openInTab(url, open_in_background); } else { GM.openInTab(url, open_in_background); } }; this.addScript = function (url) { //添加脚本 var s = document.createElement('script'); s.setAttribute('src', url); document.body.appendChild(s); }; } //全局统一变量 const commonFunctionObject = new commonFunction(); /** * 超级解析助手 * @param {Object} originalInterfaceList * @param {Object} playerNodes */ function superVideoHelper() { this.originalInterfaceList = originalInterfaceList; this.node = "#player_module"; this.elementId = Math.ceil(Math.random() * 100000000); this.innerParse = function (url) { //内嵌解析 $("#iframe-player").attr("src", url); }; this.addHtmlElements = function () { var vipVideoImageBase64 = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC9klEQVRoQ+2ZPWgVQRDH/7/CWqOIYOFHFbRSjJhGMGDpByoIago70cqvUtQgdipWFqawMWghGIidhcHKQAJqEURBRfED1CCCjc3IPu4em31775J7d3m8cAtX3O7szP7nPzszx6EeH/T4+VUD6DaDTQbMbE+3D7MY+8Ckkw8BPFuMki7KDtUAuuh9Z3oZMtBljxY2X9eBwq4raWPNQEmOLKxm+TBgZqsknQ1dAVzNco+ZhWsm6ZakHZLC1mQyrZ5OX2RvzMxnSa8lzQJ/YwLzGDCze5JOeoI/gbVtAMxJ6vPW7wKnkr4qbEuaxccDcGWBsfNV0mjMmSGAg5LGA6XbgFehITPbLel5MN84ZAUAUjMPgWO+zZY7YGbvJW0OvRoB8EjSEW9+BhhIvOvCp0wGfPPbgZfpRAzATUnn56GEmJyLd39cBNxeF99FADTa42BskuQef4wDh9oB2CXpRbDpMPA4nTOz05LuBDLrgW+dAACGIkxfkHTDm/8DrMwEkBxgOskkqdwEcMAD4GLf3YF0PACOe+uFGMgA4Bj4EAAbAGbcXLQOmNklSdeCTRuBT2bWL+lNsLYfeFIRgH2SJgJ7GwCXYjMBrJb0K9jUiHEzG5F02VubA9b4skXvQMiAmW2VdFSSn24/As0kk1mJzeyppL3ewaaBnWY2K2mLNz8S5ueCAMLwz3q/DZxreweSe3BC0v1Ai7tkYXrsB96WwMBCAfQBv3MBJCD+SVrhaXaZ54z3PgUMhpYrZKCF7bbNnJk5BhwT6fghyW8thoGxigE4my6tXwemQlt5AGI1oamDSIFLmCuURiW5BOGPL8C7drGV206b2XdJ6yJKxoDhmPKCIeS61ZZClncxFgLAtcyxrnEwRmknDFQFIFYTWnJ/CVmoGgYSj7Z81OR86Lg7sOgPmnY6s0IpN4TyYrDb6zWAmoEOPVCHUIcO7Hh7/YemYxcWU7AMf3BkNGDF/FP9rkwGqjddkoWWv5Ql6V1yNXUdWHKXBwZ7noH/dP+HQNqheToAAAAASUVORK5CYII=`; var category_1_html = ""; this.originalInterfaceList.forEach((item, index) => { if (item.category === "1") { category_1_html += "
  • " + item.name + "
  • "; } }); //获得自定义位置 var left = 0; var top = 100; var Position = commonFunctionObject.GMgetValue("Position_" + window.location.host); if (!!Position) { left = Position.left; top = Position.top; } var cssMould = `#vip_movie_box` + this.elementId + ` {cursor:pointer; position:fixed; top:` + top + `px; left:` + left + `px; width:0px; z-index:2147483647; font-size:16px; text-align:left;} #vip_movie_box` + this.elementId + ` .item_text {} #vip_movie_box` + this.elementId + ` .item_text .img_box{width:26px; height:35px;line-height:35px;text-align:center;background-color:#E5212E;} #vip_movie_box` + this.elementId + ` .item_text .img_box >img {width:20px; display:inline-block; vertical-align:middle;} #vip_movie_box` + this.elementId + ` .vip_mod_box_action {display:none; position:absolute; left:26px; top:0; text-align:center; background-color:#272930; border:1px solid gray;} #vip_movie_box` + this.elementId + ` .vip_mod_box_action li{border-radius:2px; font-size:12px; color:#DCDCDC; text-align:center; width:60px; line-height:21px; float:left; border:1px solid gray; padding:0 4px; margin:4px 2px;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;} #vip_movie_box` + this.elementId + ` .vip_mod_box_action li:hover{color:#E5212E; border:1px solid #E5212E;} #vip_movie_box` + this.elementId + ` li.selected{color:#E5212E; border:1px solid #E5212E;} #vip_movie_box` + this.elementId + ` .selected_text {margin-top:5px;} #vip_movie_box` + this.elementId + ` .selected_text .img_box{width:26px; height:35px;line-height:35px;text-align:center;background-color:#E5212E;} #vip_movie_box` + this.elementId + ` .selected_text .img_box >img {width:20px; height:20px;display:inline-block; vertical-align:middle;} #vip_movie_box` + this.elementId + ` .vip_mod_box_selected {display:none;position:absolute; left:26px; top:0; text-align:center; background-color:#F5F6CE; border:1px solid gray;} #vip_movie_box` + this.elementId + ` .vip_mod_box_selected ul{overflow-y: auto;} #vip_movie_box` + this.elementId + ` .vip_mod_box_selected li{border-radius:2px; font-size:12px; color:#393AE6; text-align:center; width:95px; line-height:27px; float:left; border:1px dashed gray; padding:0 4px; margin:4px 2px;display:block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;} #vip_movie_box` + this.elementId + ` .vip_mod_box_selected li:hover{color:#E5212E; border:1px solid #E5212E;} #vip_movie_box` + this.elementId + ` .default-scrollbar-55678::-webkit-scrollbar{width:5px; height:1px;} #vip_movie_box` + this.elementId + ` .default-scrollbar-55678::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#A8A8A8;} #vip_movie_box` + this.elementId + ` .default-scrollbar-55678::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#F1F1F1;} `; commonFunctionObject.GMaddStyle(cssMould); var htmlMould = `
    线路
      ` + category_1_html + `
    `; $("body").append(htmlMould); }; this.mouseEvent = function () { $(".item_text").on("mouseover", () => { $(".vip_mod_box_action").show(); }); $(".item_text").on("mouseout", () => { $(".vip_mod_box_action").hide(); }); $(".vip_mod_box_action li").each((liIndex, item) => { item.addEventListener("click", () => { //1.11.5同一操作 var index = parseInt($(item).attr("data-index")); commonFunctionObject.GMsetValue("index", index); this.videoreplace(); }); }); }; this.operatOther = function () { switch (window.location.host) { case 'www.bilibili.com': receiveInfoFromAnotherDomain(); this.addHtmlElements(); //console.log("检测是否为vip视频"); let findviptime = new Date().getTime(); let waitlimit = setInterval(() => { let arr1 = [$(".bpx-player-toast-confirm").text(), $(".twp-title").text(), $(".video-float-hint-btn.hint-red").text(),$('.new-twp-btn.right.vip.blue').children('.current').text()] let arr2 = ['成为大会员', '付费观看', '成为大会员抢先看', '开通大会员观看'] //let arr2=['成为大会员', '开通大会员观看','正在观看预览,大会员免费看全片', '正在观看预览,付费观看完整版'] let intersection = arr1.filter(item => new Set(arr2).has(item)) //console.log(arr1,arr2,intersection); if (intersection.length != 0) { console.log("是vip视频"); this.videoreplace(); clearInterval(waitlimit); } if (new Date().getTime() - findviptime >= 5000) { clearInterval(waitlimit) } }, 250); break default: try { detecH5Player(new Date().getTime()) } catch (err) { console.log('h5:' + err) } break } } this.videoreplace = function () { let safediv = window.document.querySelector("#player_placeholder") let videoPlayer = $("
    "); let index = commonFunctionObject.GMgetValue("index"); $(".vip_mod_box_action li").removeClass("selected"); $(".vip_mod_box_action li").eq(index).addClass("selected"); if (index == null) { index = 0 } let url2 = this.originalInterfaceList[index].url + window.location.href; console.log(index, url2); if (document.getElementById("iframe-player") == null) { //1.11.5 尝试修复多重视频声音 www.cnblogs.com/dzyany/p/14187782.html let playerb = document.querySelector('video'); if (playerb) { playerb.pause(); playerb.removeAttribute('src'); playerb.currentSrc = ''; playerb.innerHTML = ''; } let playera = $(this.node); //console.log(playera) playera.empty(); playera.append(videoPlayer); //1.11.5添加底部区域 this.bottomArea() } this.innerParse(url2); //1.11.5 修复移除vip提示bug let removetime = new Date().getTime(); let waitlimit = setInterval(() => { $(".player-limit-mask").remove(); $(".player-limit-mask pay").remove(); $(".twp-container").remove(); $(".twp-mask.twp-float").remove(); if (new Date().getTime() - removetime >= 5000) { clearInterval(waitlimit) } }, 250); } this.bottomArea = function () { let playera = $(this.node); //1.11.5添加bottomArea let bottomcss = `/*底部背景阴影*/ .bilibili-player-video-bottom-area { width:100%; height: 46px; background-color:#fff; -webkit-box-shadow: 0 0 8px #e5e9ef; box-shadow: 0 0 8px #e5e9ef; -ms-flex-negative: 0; flex-shrink: 0; position: relative; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } /*弹幕字体*/ .bilibili-player-video-info-danmaku-number { height: 14px; line-height: 14px; font-size: 14px; font-weight: 600; } /*视频信息文本格式*/ .bilibili-player-video-info { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-flex: 0; -ms-flex: none; flex: none; -ms-flex-negative: 1; flex-shrink: 1; font-size: 12px; height: 16px; line-height: 14px; color: #505050; -webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start; -webkit-box-align: center; -ms-flex-align: center; align-items: center; margin-right: 12px; width: 208px; white-space: nowrap; -webkit-box-align: end; -ms-flex-align: end; align-items: flex-end; overflow: hidden; padding: 0 12px 0 20px; } /*弹幕按钮本体*/ .bui-switch .bui-switch-input { position: absolute; width: 30px; height: 20px; border-radius: 10px; opacity: 0; margin: 0; cursor: pointer; z-index: 1; } /*弹幕按钮主体*/ .bui-switch .bui-switch-body { display: inline-block; width: 30px; height: 20px; outline: none; border-radius: 10px; -webkit-box-sizing: border-box; box-sizing: border-box; background: #757575; margin-right: 11px; } .bui-switch .bui-switch-input:checked+.bui-switch-label .bui-switch-body { background: #00a1d6; } /*弹幕按钮dot*/ .bui-switch .bui-switch-dot { top: 2px; left: 2px; border-radius: 100%; width: 16px; height: 16px; background-color: #fff; color: #757575; fill: #757575; line-height: 16px; text-align: center; -webkit-box-shadow: 0 3px 1px 0 rgba(0,0,0,.05), 0 2px 2px 0 rgba(0,0,0,.1), 0 3px 3px 0 rgba(0,0,0,.05); box-shadow: 0 3px 1px 0 rgba(0,0,0,.05), 0 2px 2px 0 rgba(0,0,0,.1), 0 3px 3px 0 rgba(0,0,0,.05); display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; } .bui-switch .bui-switch-body, .bui-switch .bui-switch-dot { position: relative; -webkit-transition: all .3s; -o-transition: all .3s; transition: all .3s; -webkit-transform: translateZ(0); transform: translateZ(0); } .bui-switch .bui-switch-input:checked+.bui-switch-label .bui-switch-body .bui-switch-dot { left: 100%; margin-left: -18px; color: #00a1d6; fill: #00a1d6; } /*弹幕按钮图片*/ .bui-switch .bui-switch-dot span { display: inline-block; width: 10px; height: 10px; font-size: 0; } /*设置主体*/ .bilibili-player-video-danmaku-setting .bp-svgicon span { display: inline-block; width: 24px; font-size: 0; position: absolute; cursor: pointer; z-index: 1; margin: middle; top: 13px; margin-right: 11px; } .bilibili-player-video-danmaku-setting:hover .bp-svgicon span { color: #00a1d6; fill: #00a1d6; }` GM_addStyle(bottomcss); let bottomdiv = `
    条弹幕存在此弹幕池
    `; playera.append(bottomdiv); //1.11.5修复移除关键div导致脚本失效 let playerPlaceholder = document.createElement('div'); playerPlaceholder.id = 'player_placeholder'; playera.append(playerPlaceholder); //console.log($(".bui-switch-input").prop("checked"),document.querySelector("#player_module > div.bilibili-player-video-bottom-area > div.bui-switch > input").checked) //1.11.5 弹幕开关 let buiSwitchbtn = $(".bui-switch-input"); buiSwitchbtn.click(function () { //let buiSwitchbtn = $(".bui-switch-input").prop("checked"); //console.log(buiSwitchbtn); if ($(".bui-switch-input").prop("checked")) { window.frames[0].postMessage({ str: 'checktrue' }, '*'); window.frames[0].frames[0].postMessage({ str: 'checktrue' }, '*'); } else { window.frames[0].postMessage({ str: 'checkfalse' }, '*'); window.frames[0].frames[0].postMessage({ str: 'checkfalse' }, '*'); } }); } this.start = function () { this.operatOther(); this.mouseEvent(); } }; (new superVideoHelper()).start(); })()