// ==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.8
// @description 功能很少有缺陷,先看粗体字再决定是否要安装。解除B站大会员观影限制,理论支持番剧和放映厅,不支持的视频请反馈留地址让我修复,或自行在代码搜索‘大会员’并添加识别div与语句。
// @author p7
// @require https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js
// @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/*
// @match https://www.cuan.la/*
// @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
// @namespace https://greasyfork.org/users/789132
// @downloadURL none
// ==/UserScript==
(function () {
/*1.11.6 mod区域*/
let originalInterfaceList = [{
"name": "Mao播放器",
"category": "1",
"url": " https://www.cuan.la/m3u8.php?url="
}, {
"name": "Parwix",
"category": "1",
"url": "https://vip.parwix.com:4433/player/?url="
},
{
"name": "m1907",
"category": "1",
"url": "https://z1.m1907.cn/?jx="
},
{
"name": "月亮",
"category": "1",
"url": "https://api.yueliangjx.com/?url="
},
{
"name": "showxi",
"category": "1",
"url": "https://showxi.xyz/mov/s/?sv=3&url=",
"special": "多线"
},
{
"name": "OK",
"category": "1",
"url": "https://okjx.cc/?url=",
"special": "多线"
},
];
let repeatp = 0 //去重概率[0-100]
/*mod区域结束*/
var player
var playerRect
var minpool = [];
var domPool = [];
var domtopdownPool = [];
var listobj
//1.11.6修复弹幕重复问题
let minpoolout = [];
let lastvideotime = 0;
//1.11.7全屏问题
//let lastplaywidth = 0;
var distance = 25
var fontSize = 25;
var buiSwitch = true;
//console.log(1, window.location.href)
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;
};
//1.11.7 稳定发送
function postdownmessage(obj) {
for (var posta = 0; posta <= 3; posta++) {
try {
window.frames[posta].postMessage(obj, '*');
} catch {}
for (var postb = 0; postb <= 3; postb++) {
try {
window.frames[posta].frames[postb].postMessage(obj, '*');
} catch {}
for (var postc = 0; postc <= 3; postc++) {
try {
window.frames[posta].frames[postb].frames[postc].postMessage(obj, '*');
} catch {}
}
}
}
}
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)
//console.log(window.frames.length, listjson.i.d.length);
postdownmessage({
obj: listjson,
str: 'xmllist'
})
}
})
})
} else {
setTimeout(function () {
getBV()
},
500)
}
}
function receiveInfoFromAnotherDomain() {
//首先让window添加一个事件监听函数,表明它可以监听窗口对象的message事件
//它受到事件时,会先判断是否来自指定的Domain(不是所有Domain丢过来的事件它都处理的)
window.addEventListener("message",
function (ev) {
switch (window.location.host) {
case 'www.bilibili.com':
console.log(ev.origin, ' message to', window.location.href, ev.data);
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({
fromweb: 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;
}
}
})
window.top.postMessage({
fromweb: window.location.href,
obj: 'iframe监听初始化',
str: '来自iframe:',
},
'*');
}
function detecH5Player(findplayertime) {
player = document.querySelector('video');
if (player) {
//console.log(window.location.href+'发现h5')
receiveInfoFromAnotherDomain();
window.top.postMessage({
str: 'hasplayer',
fromweb: 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.style.left = `${domLeft}px`
$(element).css('transition', `transform 0s linear`);
})
});
//1.11.7
document.addEventListener("fullscreenchange", function (e) {
refreshDom() //player.clientWidth-lastplaywidth
})
//lastplaywidth = player.clientWidth
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 - newS}px)`;
})
});
player.addEventListener('timeupdate',
function () {
//1.11.6 修复弹幕重复、前进后退清屏、后退重载弹幕
let lastlen = parseInt(lastvideotime / 60)
let startlen = parseInt(player.currentTime / 60)
if (lastvideotime > player.currentTime) {
for (var c = startlen; c <= lastlen; c++) {
if (minpoolout[c].length != 0) {
minpool[c] = minpool[c].concat(minpoolout[c])
minpoolout[c].length = 0
}
}
refreshDomscreen()
} else if (lastvideotime + 2 < player.currentTime) {
refreshDomscreen()
}
lastvideotime = player.currentTime
if (minpool.length == 0 && listobj) {
minpool = new Array(parseInt(player.duration / 60));
let minlen = minpool.length
for (var a = 0; a <= minlen; a++) {
minpool[a] = []
}
minpoolout = new Array(minlen);
for (var b = 0; b <= minlen; b++) {
minpoolout[b] = []
}
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']
};
if (repeatp == 100 || repeatp > Math.floor(Math.random() * 100)) {
let len2 = minpool[parseInt(arrp[0] / 60)].length
let needpush = true
for (var i = 0; i < len2; i++) {
if (minpool[parseInt(arrp[0] / 60)][i].text == arrpJson.text) {
needpush = false;
break;
}
}
if (needpush == true) {
minpool[parseInt(arrp[0] / 60)].push(arrpJson);
}
} else {
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);
minpoolout[nowlen].push(minpool[nowlen][j])
minpool[nowlen].splice(j, 1);
}
} 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);
minpoolout[nowlen].push(minpool[nowlen][j])
minpool[nowlen].splice(j, 1);
}
}
}
}
} else if (buiSwitch == false) {
refreshDomscreen();
}
})
} else {
// 轮询检测
setTimeout(function () {
//console.log(window.location.href + '开始检测h5', findplayertime, new Date().getTime() - findplayertime);
if (new Date().getTime() - findplayertime <= 5000) {
detecH5Player(findplayertime)
}
},
500)
}
}
function refreshDomscreen() {
//1.11.6 清除在场弹幕
$('.left').each(function (index, element) {
$(element).css('transition', `transform 0s linear`);
$(element).addClass('right');
element.style.left = 0
element.style.willChange = 'transform'
element.style.transition = null;
element.style.willChange = 'auto'
element.style.transform = `translateX(${player.clientWidth}px)`
//element.style.left = `${player.clientWidth}px`
element.innerText = ''
element.className = 'right';
})
for (let i = 0; i < CHANNEL_COUNT; i++) {
domtopdownPool[i].innerText = ''
}
$('.right').each(function (index, element) {
element.style.left = 0
element.style.transform = `translateX(${player.clientWidth}px)`
})
$('.left').each(function (index, element) {
element.removeEventListener('transitionend', recoverLiftdom(element));
element.addEventListener('transitionend', recoverLiftdom(element));
})
}
var MAX_DM_COUNT = 10
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() {
window.top.postMessage({
obj: 'refreshDom',
str: '来自iframe:',
from: window.location.href
}, '*');
if (Math.floor(player.clientHeight / fontSize) - CHANNEL_COUNT > 0) {
// 先new一些span 重复利用这些DOM
for (let j = Math.floor(player.clientHeight / fontSize); 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.left = `${player.clientWidth}px`
dom.style.willChange = 'auto'
// 初始化dom的位置 通过设置className
dom.className = 'right';
// DOM的通道是固定的 所以设置好top就不需要再改变了
dom.style.top = (-j + Math.floor(player.clientHeight / fontSize) + 1) * fontSize + 'px';
player.parentNode.appendChild(dom);
// 放入改通道的DOM池
doms.push(dom);
// 每次到transition结束的时候 就是弹幕划出屏幕了 将DOM位置重置 再放回DOM池
dom.addEventListener('transitionend', recoverLiftdom(dom));
}
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 + Math.floor(player.clientHeight / fontSize) + 1) * fontSize + 'px';
dom2.style.left = `${(player.clientWidth - dom2.clientWidth) / 2}px`;
dom2.className = 'topdown';
player.parentNode.appendChild(dom2);
domtopdownPool.push(dom2);
}
} else {
//1.11.7 删除多余dom
for (let j2 = Math.floor(player.clientHeight / fontSize); j2 < CHANNEL_COUNT; j2++) {
for (let i2 = 0; i2 < MAX_DM_COUNT; i2++) {
let thisdom = domPool[j2][i2]
thisdom.parentNode.removeChild(thisdom)
}
domPool[j2].length = 0
domPool.splice(j2, 1);
//refreshDomscreen()
domtopdownPool[j2].parentNode.removeChild(domtopdownPool[j2])
domtopdownPool.splice(j2, 1);
}
}
CHANNEL_COUNT = Math.floor(player.clientHeight / fontSize);
/*//1.11.7 修改弹幕默认位置
$('.right').each(function (index, element) {
element.style.transform = `translateX(${player.clientWidth}px)`
})
$('.left').each(function (index, element) {
element.removeEventListener('transitionend',recoverLiftdom(element));
element.addEventListener('transitionend',recoverLiftdom(element));
})
$('.topdown').each(function (index, element) {
element.style.left = `${(player.clientWidth - element.clientWidth) / 2}px`;
})*/
refreshDomscreen()
let refreshDom_time = parseInt(player.currentTime / 60)
if (minpool.length != 0) {
minpool[refreshDom_time] = minpool[refreshDom_time].concat(minpoolout[refreshDom_time])
minpoolout[refreshDom_time].length = 0
}
}
function recoverLiftdom(dom) {
dom.style.transition = null;
dom.style.willChange = 'auto'
//dom.style.transform = `translateX(${player.clientWidth}px)`
dom.style.left = `${player.clientWidth}px`
dom.innerText = ''
dom.className = 'right';
}
/**
* 获取一个可以发射弹幕的通道 没有则返回-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.0084 * (dom.clientWidth + player.clientWidth)}s linear`;
// 设置弹幕的位置信息 性能优化 left -> transform
dom.style.transform = `translateX(${-dom.clientWidth - player.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)`;
dom.style.left = `${(player.clientWidth - dom.clientWidth) / 2}px`;
}
var $ = $ || window.$;
/**
* 共有方法
*/
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.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 htmlMould = `