"use strict";
// ==UserScript==
// @name DouyuEx-斗鱼直播间增强插件
// @namespace https://github.com/qianjiachun
// @icon https://s2.ax1x.com/2020/01/12/loQI3V.png
// @version 2020.03.29.01
// @description 弹幕自动变色防检测循环发送 一键续牌 查看真实人数/查看主播数据 已播时长 一键签到(直播间/车队/鱼吧/客户端) 一键领取鱼粮(宝箱/气泡/任务) 一键寻宝 送出指定数量的礼物 一键清空背包 屏蔽广告 调节弹幕大小 自动更新 同屏画中画/多直播间小窗观看/可在斗鱼看多个平台直播(b站虎牙) 获取真实直播流地址 自动抢礼物红包 跳转随机火力全开房间
// @author 小淳
// @match *://*.douyu.com/0*
// @match *://*.douyu.com/1*
// @match *://*.douyu.com/2*
// @match *://*.douyu.com/3*
// @match *://*.douyu.com/4*
// @match *://*.douyu.com/5*
// @match *://*.douyu.com/6*
// @match *://*.douyu.com/7*
// @match *://*.douyu.com/8*
// @match *://*.douyu.com/9*
// @match *://*.douyu.com/topic/*
// @match *://msg.douyu.com/*
// @require https://cdn.jsdelivr.net/npm/flv.js@1.5.0/dist/flv.min.js
// @grant GM_openInTab
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @downloadURL none
// ==/UserScript==
function initPkg() {
initPkg_ExIcon();
initPkg_ExPanel();
initPkg_RemoveAD();
initPkg_RealAudience();
initPkg_Update();
initPkg_FirePower();
initPkg_PopupPlayer();
initPkg_ExpandTool();
initPkg_BarrageLoop();
initPkg_FansContinue();
initPkg_FishFood();
initPkg_FishPond();
initPkg_Sign();
}
function initPkg_Timer() {
initPkg_FishPond_Timer();
}
function initTimer() {
initPkg_Timer();
exTimer = setInterval(initPkg_Timer, 20000);
}
function initStyles() {
let style = document.createElement("style");
style.appendChild(document.createTextNode(`
.bloop {
background-color: rgba(255,255,255,0.9);
width: 100%;
height: 200px;
position: relative;
bottom: 200px;
display: none;
}
.bloop__switch {
position: absolute;
right: 0;
bottom: 0;
}
.ex-icon {
display: inline-block;
vertical-align: middle;
margin-right: 8px;
}
.extool {
background-color: rgba(255,255,255,0.9);
width: 100%;
height: 200px;
position: relative;
bottom: 200px;
display: none;
}
.extool__switch {
position: absolute;
right: 0;
bottom: 0;
}
.extool__bsize,.extool__sendgift {
margin-bottom: 5px;
}
.ex-panel {
width: 550px;
height: 50px;
position: absolute;
bottom: 35px;
right: 50px;
background-color: rgba(255,255,255,0.9);
display: none;
border: 2px rgb(234,173,26) solid;
}
.ex-panel__wrap {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
.ex-panel__icon {
margin: 0 10px;
display: block;
position: relative;
padding: 5px;
}
.ex-panel__tip {
display:none;
background:#f00;
border-radius:50%;
width:8px;
height:8px;
top:0px;
right:0px;
position:absolute;
}
.videoDiv {
width: 400px;
height: 200px;
background-color: rgba(255, 255, 255, 0);
position: absolute;
z-index: 7777;
}
.videoPlayer {
width: 100%;
height: 100%;
cursor: move;
}
.videoScale {
width: 10px;
height: 10px;
overflow: hidden;
cursor: se-resize;
position: absolute;
right: 0;
bottom: 0;
background-color: rgb(231, 57, 57);
}
.videoInfo {
width: 100%;
height: 30px;
background-color: gray;
position: absolute;
top: -30px;
line-height: 30px;
}
.videoClose {
width: 30px;
float: right;
color: white;
}
.videoQn, .videoCDN {
margin-left: 5px;
}
.videoRID {
margin: 0px 5px;
font-weight: 800;
font-size: medium;
}
#popup-player__prompt {
display: none;
}
.postbird-box-container{width:100%;height:100%;overflow:hidden;position:fixed;top:0;left:0;z-index:9999;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.postbird-box-container.active{display:block}.postbird-box-content{width:400px;max-width:90%;min-height:170px;background-color:#fff;border:solid 1px #dfdfdf;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin-top:-100px}.postbird-box-header{width:100%;padding:10px 15px;position:relative;font-size:1.1em;letter-spacing:2px}.postbird-box-close-btn{cursor:pointer;font-weight:700;color:#000;float:right;opacity:.5;font-size:1.3em;margin-top:-3px;display:none}.postbird-box-close-btn:hover{opacity:1}.postbird-box-text{box-sizing: border-box;width:100%;padding:0 10%;text-align:center;line-height:40px;font-size:20px;letter-spacing:1px}.postbird-box-footer{width:100%;position:absolute;bottom:0;padding:0;margin:0;display:flex;display:-webkit-flex;justify-content:space-around;border-top:solid 1px #dfdfdf;align-items:flex-end}.postbird-box-footer .btn-footer{line-height:44px;border:0;cursor:pointer;background-color:#fff;color:#0e90d2;font-size:1.1em;letter-spacing:2px;transition:background-color .5s;-webkit-transition:background-color .5s;-o-transition:background-color .5s;-moz-transition:background-color .5s;outline:0}.postbird-box-footer .btn-footer:hover{background-color:#e5e5e5}.postbird-box-footer .btn-block-footer{width:100%}.postbird-box-footer .btn-left-footer,.postbird-box-footer .btn-right-footer{position:relative;width:100%}.postbird-box-footer .btn-left-footer::after{content:"";position:absolute;right:0;top:0;background-color:#e5e5e5;height:100%;width:1px}.postbird-box-footer .btn-footer-cancel{color:#333}.postbird-prompt-input{width:100%;padding:5px;font-size:16px;border:1px solid #ccc;outline:0}
.real-audience {
cursor: pointer;
}
/*
Notice.css
*/
.noticejs-top{top:0;width:100%!important}.noticejs-top .item{border-radius:0!important;margin:0!important}.noticejs-topRight{top:10px;right:10px}.noticejs-topLeft{top:10px;left:10px}.noticejs-topCenter{top:10px;left:50%;transform:translate(-50%)}.noticejs-middleLeft,.noticejs-middleRight{right:10px;top:50%;transform:translateY(-50%)}.noticejs-middleLeft{left:10px}.noticejs-middleCenter{top:50%;left:50%;transform:translate(-50%,-50%)}.noticejs-bottom{bottom:0;width:100%!important}.noticejs-bottom .item{border-radius:0!important;margin:0!important}.noticejs-bottomRight{bottom:10px;right:10px}.noticejs-bottomLeft{bottom:10px;left:10px}.noticejs-bottomCenter{bottom:10px;left:50%;transform:translate(-50%)}.noticejs{font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.noticejs .item{margin:0 0 10px;border-radius:3px;overflow:hidden}.noticejs .item .close{float:right;font-size:18px;font-weight:700;line-height:1;color:#fff;text-shadow:0 1px 0 #fff;opacity:1;margin-right:7px}.noticejs .item .close:hover{opacity:.5;color:#000}.noticejs .item a{color:#fff;border-bottom:1px dashed #fff}.noticejs .item a,.noticejs .item a:hover{text-decoration:none}.noticejs .success{background-color:#64ce83}.noticejs .success .noticejs-heading{background-color:#3da95c;color:#fff;padding:10px}.noticejs .success .noticejs-body{color:#fff;padding:10px}.noticejs .success .noticejs-body:hover{visibility:visible!important}.noticejs .success .noticejs-content{visibility:visible}.noticejs .info{background-color:#3ea2ff}.noticejs .info .noticejs-heading{background-color:#067cea;color:#fff;padding:10px}.noticejs .info .noticejs-body{color:#fff;padding:10px}.noticejs .info .noticejs-body:hover{visibility:visible!important}.noticejs .info .noticejs-content{visibility:visible}.noticejs .warning{background-color:#ff7f48}.noticejs .warning .noticejs-heading{background-color:#f44e06;color:#fff;padding:10px}.noticejs .warning .noticejs-body{color:#fff;padding:10px}.noticejs .warning .noticejs-body:hover{visibility:visible!important}.noticejs .warning .noticejs-content{visibility:visible}.noticejs .error{background-color:#e74c3c}.noticejs .error .noticejs-heading{background-color:#ba2c1d;color:#fff;padding:10px}.noticejs .error .noticejs-body{color:#fff;padding:10px}.noticejs .error .noticejs-body:hover{visibility:visible!important}.noticejs .error .noticejs-content{visibility:visible}.noticejs .progressbar{width:100%}.noticejs .progressbar .bar{width:1%;height:30px;background-color:#4caf50}.noticejs .success .noticejs-progressbar{width:100%;background-color:#64ce83;margin-top:-1px}.noticejs .success .noticejs-progressbar .noticejs-bar{width:100%;height:5px;background:#3da95c}.noticejs .info .noticejs-progressbar{width:100%;background-color:#3ea2ff;margin-top:-1px}.noticejs .info .noticejs-progressbar .noticejs-bar{width:100%;height:5px;background:#067cea}.noticejs .warning .noticejs-progressbar{width:100%;background-color:#ff7f48;margin-top:-1px}.noticejs .warning .noticejs-progressbar .noticejs-bar{width:100%;height:5px;background:#f44e06}.noticejs .error .noticejs-progressbar{width:100%;background-color:#e74c3c;margin-top:-1px}.noticejs .error .noticejs-progressbar .noticejs-bar{width:100%;height:5px;background:#ba2c1d}@keyframes noticejs-fadeOut{0%{opacity:1}to{opacity:0}}.noticejs-fadeOut{animation-name:noticejs-fadeOut}@keyframes noticejs-modal-in{to{opacity:.3}}@keyframes noticejs-modal-out{to{opacity:0}}.noticejs-rtl .noticejs-heading{direction:rtl}.noticejs-rtl .close{float:left!important;margin-left:7px;margin-right:0!important}.noticejs-rtl .noticejs-content{direction:rtl}.noticejs{position:fixed;z-index:10050;width:320px}.noticejs ::-webkit-scrollbar{width:8px}.noticejs ::-webkit-scrollbar-button{width:8px;height:5px}.noticejs ::-webkit-scrollbar-track{border-radius:10px}.noticejs ::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.5);border-radius:10px}.noticejs ::-webkit-scrollbar-thumb:hover{background:#fff}.noticejs-modal{position:fixed;width:100%;height:100%;background-color:#000;z-index:10000;opacity:.3;left:0;top:0}.noticejs-modal-open{opacity:0;animation:noticejs-modal-in .3s ease-out}.noticejs-modal-close{animation:noticejs-modal-out .3s ease-out;animation-fill-mode:forwards}
`));
document.head.appendChild(style);
}
(function() {
if (window.location.host == "msg.douyu.com") {
if (getQueryString("exid") == "chun") {
signMotorcade_Sign(getQueryString("mid"), getQueryString("total"));
}
} else {
if (String(location.href).indexOf("exid=chun") != -1) {
let intID = setInterval(() => {
if (typeof(document.querySelector('div.wfs-2a8e83')) != "undefined") {
document.querySelector('div.wfs-2a8e83').click();
document.querySelector('label.layout-Player-asidetoggleButton').click();
let l = document.querySelectorAll(".tip-e3420a > ul > li").length;
document.querySelectorAll(".tip-e3420a > ul > li")[l - 1].click();
clearInterval(intID);
}
}, 1000);
} else {
let intID = setInterval(() => {
if (typeof(document.getElementsByClassName("ChatToolBar")[0]) != "undefined") {
setTimeout(() => {
initStyles();
initPkg();
initTimer();
}, 1000)
clearInterval(intID);
}
}, 1000);
}
}
})();
// 全局变量及公共函数
var exTimer = 0; // 总时钟句柄
var url = document.getElementsByTagName('html')[0].innerHTML;
var urlLen = ("$ROOM.room_id =").length;
var ridPos = url.indexOf('$ROOM.room_id =');
var rid = url.substring(ridPos + urlLen, url.indexOf(';', ridPos + urlLen));
rid = rid.trim();
var dyToken = getToken();
function showExPanel() {
// 显示功能条
let a = document.getElementsByClassName("ex-panel")[0];
if (a.style.display != "block") {
a.style.display = "block";
} else {
a.style.display = "none";
}
}
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
function formatSeconds(value) {
let secondTime = parseInt(value);
let minuteTime = 0;
let hourTime = 0;
if (secondTime > 60) {
minuteTime = parseInt(secondTime / 60);
secondTime = parseInt(secondTime % 60);
if (minuteTime > 60) {
hourTime = parseInt(minuteTime / 60);
minuteTime = parseInt(minuteTime % 60);
}
}
var result = "" + parseInt(secondTime) + "秒";
if (minuteTime > 0) {
result = "" + parseInt(minuteTime) + "分" + result;
}
if (hourTime > 0) {
result = "" + parseInt(hourTime) + "小时" + result;
}
return result;
}
async function verifyFans(room_id, level) {
let ret = false;
let doc = await fetch('https://www.douyu.com/member/cp/getFansBadgeList',{
method: 'GET',
mode: 'no-cors',
cache: 'default',
credentials: 'include',
}).then(res => {
return res.text();
}).catch(err => {
console.log("请求失败!", err);
})
doc = (new DOMParser()).parseFromString(doc, 'text/html');
let a = doc.getElementsByClassName("fans-badge-list")[0].lastElementChild;
let n = a.children.length;
for (let i = 0; i < n; i++) {
let rid = a.children[i].getAttribute("data-fans-room");
let rlv = a.children[i].getAttribute("data-fans-level");
if (rid == room_id && rlv >= level) {
ret = true;
break;
} else {
ret = false;
}
}
return ret;
}
function getStrMiddle(str, before, after) {
let m = str.match(new RegExp(before + '(.*?)' + after));
return m ? m[1] : false;
}
function getToken() {
// let cookie = document.cookie;
// let ret = getStrMiddle(cookie, "acf_uid=", ";") + "_" + getStrMiddle(cookie, "acf_biz=", ";") + "_" + getStrMiddle(cookie, "acf_stk=", ";") + "_" + getStrMiddle(cookie, "acf_ct=", ";") + "_" + getStrMiddle(cookie, "acf_ltkid=", ";");
let ret = getCookieValue("acf_uid") + "_" + getCookieValue("acf_biz") + "_" + getCookieValue("acf_stk") + "_" + getCookieValue("acf_ct") + "_" + getCookieValue("acf_ltkid");
return ret;
}
function getDyDid() {
// let cookie = document.cookie;
// let ret = getStrMiddle(cookie, "dy_did=", ";");
let ret = getCookieValue("dy_did");
return ret;
}
function setCookie(cookiename, value){
var exp = new Date();
exp.setTime(exp.getTime() + 3*60*60*1000);
document.cookie = cookiename + "="+ escape (value) + "; path=/; expires=" + exp.toGMTString();
}
function getCookieValue(name){
let arr,reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg)) {
return unescape(arr[2]);
} else {
return null;
}
}
function getCCN() {
// let cookie = document.cookie;
// let ret = getStrMiddle(cookie, "acf_ccn=", ";");
let ret = getCookieValue("acf_ccn");
if (ret == null) {
setCookie("acf_ccn", "1");
ret = "1";
}
return ret;
}
function getUID() {
let ret = getCookieValue("acf_uid");
return ret;
}
function showMessage(msg, type) {
// type: success[green] error[red] warning[orange] info[blue]
new NoticeJs({
text: msg,
type: type,
position: 'bottomRight',
}).show();
}
function openPage(url, b) {
GM_openInTab(url, {
active: b
});
}
function closePage() {
if (navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("Chrome") != -1) {
window.location.href = "about:blank";
window.close();
} else {
window.opener = null;
window.open("", "_self");
window.close();
}
}
function getQueryString(name) {
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
if (window.location.hash.indexOf("?") < 0) {
return null;
}
let r = window.location.hash.split("?")[1].match(reg);
if (r != null) return decodeURIComponent(r[2]);
return null;
}
function dateFormat(fmt, date) {
var o = {
"M+": date.getMonth() + 1,
"d+": date.getDate(),
"h+": date.getHours(),
"m+": date.getMinutes(),
"s+": date.getSeconds(),
"q+": Math.floor((date.getMonth() + 3) / 3),
"S": date.getMilliseconds()
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
function isRid(str) {
if (/^[0-9]+$/.test(str)) { //这是用正则表达是检查
return true;
} else {
return false;
}
}
let barrageColorArr = [];
let barrageArr = [];
let barrageColorLength = 0;
let barrageLength = 0;
let bloopTimer;
let barrageOffset = 0;
let barrageColorOffset = 0;
let isChangeColor = true;
let isMatch = false; //是否为赛事直播间
let bloopStopTimer;
function initPkg_BarrageLoop() {
initPkg_BarrageLoop_Dom();
initPkg_BarrageLoop_Func();
initPkg_BarrageLoop_Set();
}
function BarrageLoop_insertModal() {
let html = "";
let a = document.createElement("div");
a.className = "bloop";
html += '
';
html += '
';
html += ''; // header
html += '
';
html += '';
html += '';
html += '';
html += '
'; // text
html += '
'
a.innerHTML = html;
let b = document.getElementsByClassName("layout-Main")[0];
b.insertBefore(a, b.childNodes[0]);
}
function initPkg_PopupPlayer_Func() {
document.getElementsByClassName("popup-player")[0].addEventListener("click", function () {
document.getElementById("popup-player__prompt").style.display = "block";
});
document.getElementById("popup-player__cancel").addEventListener("click", function() {
document.getElementById("popup-player__prompt").style.display = "none";
})
document.getElementById("popup-player__ok").addEventListener("click", function() {
let roomUrl = document.getElementById("popup-player__url").value;
if (roomUrl != "") {
let isIframe = document.getElementById("popup-player__noiframe").checked;
if (isIframe == true) {
if (roomUrl.indexOf("douyu.com") != -1) {
getRealRid_Douyu(roomUrl, (rid) => {
createNewVideo(videoPlayerArr.length, rid, "Douyu");
});
} else if (roomUrl.indexOf("bilibili.com") != -1) {
getRealRid_Bilibili(roomUrl, (rid) => {
createNewVideo(videoPlayerArr.length, rid, "Bilibili");
});
} else if (roomUrl.indexOf("huya.com") != -1) {
createNewVideo(videoPlayerArr.length, roomUrl, "Huya");
}
} else {
createNewVideo_iframe(videoPlayerArr.length, roomUrl);
}
} else {
showMessage("请输入地址", "error");
}
document.getElementById("popup-player__prompt").style.display = "none";
})
document.getElementById("popup-player__prompt").addEventListener("keydown", function(event) {
let theEvent = window.event || e;
let code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
document.getElementById("popup-player__ok").click();
}
})
}
function createNewVideo(id, rid, platform) {
switch (platform) {
case "Douyu":
createNewVideo_Douyu(id, rid);
break;
case "Bilibili":
createNewVideo_Bilibili(id, rid);
break;
case "Huya":
let a = String(rid).split("/");
createNewVideo_Huya(id, rid, a[a.length - 1]);
break;
default:
createNewVideo_Douyu(id, rid);
break;
}
}
function setElementVideo(id, l) {
if (flvjs.isSupported()) {
var videoElement = document.getElementById("videoPlayer" + String(id));
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: l
},{fixAudioTimestampGap: false});
if (id > videoPlayerArr.length - 1) {
videoPlayerArr.push(flvPlayer);
} else {
videoPlayerArr[id] = flvPlayer;
}
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
}
function setElementResize(id) {
let box = document.getElementById("videoDiv" + String(id));
let scale = document.getElementById("videoScale" + String(id));
scale.onmousedown = function (e) {
// 阻止冒泡,避免缩放时触发移动事件
e.stopPropagation();
e.preventDefault();
let pos = {
'w': box.offsetWidth,
'h': box.offsetHeight,
'x': e.clientX,
'y': e.clientY
};
let w;
let h;
document.onmousemove = function (ev) {
ev.stopPropagation();
ev.preventDefault();
w = Math.max(300, ev.clientX - pos.x + pos.w)
h = Math.max(150, ev.clientY - pos.y + pos.h)
w = w >= document.offsetWidth - box.offsetLeft ? document.offsetWidth - box.offsetLeft : w
h = h >= document.offsetHeight - box.offsetTop ? document.offsetHeight - box.offsetTop : h
}
document.onmouseup = function (e) {
e.stopPropagation();
e.preventDefault();
box.style.width = w + 'px';
box.style.height = h + 'px';
document.onmousemove = null;
document.onmouseup = null;
}
}
}
function setElementDrag(id) {
let box = document.getElementById("videoDiv" + String(id));
box.onmousedown = function (event) {
event.stopPropagation();
let xx = event.clientX - box.offsetLeft;
let yy = event.clientY - box.offsetTop;
let mouseX;
let mouseY;
document.onmousemove = function (event) {
event.stopPropagation();
mouseX = event.clientX - xx;
mouseY = event.clientY - yy;
}
document.onmouseup = function (event) {
event.stopPropagation();
box.style.left = mouseX + "px";
box.style.top = mouseY + "px";
document.onmousemove = null;
document.onmouseup = null;
}
}
}
// Douyu
function createNewVideo_Douyu(id, rid) {
getRealLive_Douyu(rid, false, "1", "1", (lurl) => {
if (lurl != "" || lurl != null) {
if (lurl == "None") {
showMessage("房间未开播或其他错误", "error");
return;
}
let lurl_host_arr = String(lurl).split("/live");
let lurl_host = "";
if (lurl_host_arr.length > 0) {
lurl_host = lurl_host_arr[0];
}
let a = document.createElement("div");
let html = "";
a.id = "videoDiv" + String(id);
a.rid = rid;
a.className = "videoDiv";
html += "
";
html += "
";
a.innerHTML = html;
let b = document.getElementsByClassName("layout-Main")[0];
b.insertBefore(a, b.childNodes[0]);
setElementDrag(id);
setElementResize(id);
setElementFunc_Douyu(id, rid);
setElementVideo(id, lurl);
}
});
}
function setElementFunc_Douyu(id, rid) {
let box = document.getElementById("videoDiv" + String(id));
let videoPlayer = document.getElementById("videoPlayer" + String(id));
let info = document.getElementById("videoInfo" + String(id));
let scale = document.getElementById("videoScale" + String(id));
videoPlayer.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if (scale.style.display != "block") {
scale.style.display = "block";
info.style.display = "block";
} else {
scale.style.display = "none";
info.style.display = "none";
}
for (let i = 0; i < videoPlayerArr.length; i++) {
let box = document.getElementById("videoDiv" + String(i));
if (box != null) {
if (i == id) {
box.style.zIndex = 7778;
} else {
box.style.zIndex = 7777;
}
}
}
}
let videoQn = document.getElementById("videoQn" + String(id));
let videoCDN = document.getElementById("videoCDN" + String(id));
let videoClose = document.getElementById("videoClose" + String(id));
videoQn.onchange = function() {
getRealLive_Douyu(rid, false, videoQn.value, videoCDN.value, (lurl) => {
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoCDN.onchange = function() {
getRealLive_Douyu(rid, false, videoQn.value, videoCDN.value, (lurl) => {
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoClose.onclick = function() {
box.remove();
}
let videoRID = document.getElementById("videoRID" + String(id));
videoRID.onclick = function() {
getRealLive_Douyu(rid, false, videoQn.value, videoCDN.value, (lurl) => {
GM_setClipboard(String(lurl).replace("https", "http"));
showMessage("复制成功", "success");
})
}
}
// Bilibili
function createNewVideo_Bilibili(id, rid){
getRealLive_Bilibili(rid, "1", "1", (lurl) => {
if (lurl != "" || lurl != null) {
let a = document.createElement("div");
let html = "";
a.id = "videoDiv" + String(id);
a.rid = rid;
a.className = "videoDiv";
html += "
";
html += "
";
a.innerHTML = html;
let b = document.getElementsByClassName("layout-Main")[0];
b.insertBefore(a, b.childNodes[0]);
setElementDrag(id);
setElementResize(id);
setElementFunc_Bilibili(id, rid);
setElementVideo(id, lurl);
}
});
}
function setElementFunc_Bilibili(id, rid) {
let box = document.getElementById("videoDiv" + String(id));
let videoPlayer = document.getElementById("videoPlayer" + String(id));
let info = document.getElementById("videoInfo" + String(id));
let scale = document.getElementById("videoScale" + String(id));
videoPlayer.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if (scale.style.display != "block") {
scale.style.display = "block";
info.style.display = "block";
} else {
scale.style.display = "none";
info.style.display = "none";
}
for (let i = 0; i < videoPlayerArr.length; i++) {
let box = document.getElementById("videoDiv" + String(i));
if (box != null) {
if (i == id) {
box.style.zIndex = 7778;
} else {
box.style.zIndex = 7777;
}
}
}
}
let videoQn = document.getElementById("videoQn" + String(id));
let videoCDN = document.getElementById("videoCDN" + String(id));
let videoClose = document.getElementById("videoClose" + String(id));
videoQn.onchange = function() {
getRealLive_Bilibili(rid, videoQn.value, videoCDN.value, (lurl) => {
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoCDN.onchange = function() {
getRealLive_Bilibili(rid, videoQn.value, videoCDN.value, (lurl) => {
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoClose.onclick = function() {
box.remove();
}
let videoRID = document.getElementById("videoRID" + String(id));
videoRID.onclick = function() {
getRealLive_Bilibili(rid, videoQn.value, videoCDN.value, (lurl) => {
GM_setClipboard(lurl);
showMessage("复制成功", "success");
})
}
}
// Huya
function createNewVideo_Huya(id, rid, rname){
getRealLive_Huya(rid, "1", "1", (lurl, msg) => {
if (lurl != "" || lurl != null) {
if (msg != "") {
showMessage(msg, "error");
return;
}
let a = document.createElement("div");
let html = "";
a.id = "videoDiv" + String(id);
a.rid = rid;
a.className = "videoDiv";
html += "
";
html += "
";
a.innerHTML = html;
let b = document.getElementsByClassName("layout-Main")[0];
b.insertBefore(a, b.childNodes[0]);
setElementDrag(id);
setElementResize(id);
setElementFunc_Huya(id, rid);
setElementVideo(id, lurl);
}
});
}
function setElementFunc_Huya(id, rid) {
let box = document.getElementById("videoDiv" + String(id));
let videoPlayer = document.getElementById("videoPlayer" + String(id));
let info = document.getElementById("videoInfo" + String(id));
let scale = document.getElementById("videoScale" + String(id));
videoPlayer.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if (scale.style.display != "block") {
scale.style.display = "block";
info.style.display = "block";
} else {
scale.style.display = "none";
info.style.display = "none";
}
for (let i = 0; i < videoPlayerArr.length; i++) {
let box = document.getElementById("videoDiv" + String(i));
if (box != null) {
if (i == id) {
box.style.zIndex = 7778;
} else {
box.style.zIndex = 7777;
}
}
}
}
let videoQn = document.getElementById("videoQn" + String(id));
let videoCDN = document.getElementById("videoCDN" + String(id));
let videoClose = document.getElementById("videoClose" + String(id));
videoQn.onchange = function() {
getRealLive_Huya(rid, videoQn.value, videoCDN.value, (lurl, msg) => {
if (msg != "") {
showMessage(msg, "error");
return;
}
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoCDN.onchange = function() {
getRealLive_Huya(rid, videoQn.value, videoCDN.value, (lurl, msg) => {
if (msg != "") {
showMessage(msg, "error");
return;
}
videoPlayerArr[id].destroy();
setElementVideo(id, lurl);
})
}
videoClose.onclick = function() {
box.remove();
}
let videoRID = document.getElementById("videoRID" + String(id));
videoRID.onclick = function() {
getRealLive_Huya(rid, videoQn.value, videoCDN.value, (lurl, msg) => {
if (msg != "") {
showMessage(msg, "error");
return;
}
GM_setClipboard(lurl);
showMessage("复制成功", "success");
})
}
}
// iframe
function createNewVideo_iframe(id, url) {
if (String(url).indexOf("douyu.com") == -1) {
showMessage("有弹幕模式仅支持斗鱼直播", "error");
return;
}
let rid_arr = String(url).split("/");
let rid = rid_arr[rid_arr.length - 1];
let a = document.createElement("div");
let html = "";
a.id = "videoDiv" + String(id);
a.rid = rid;
a.className = "videoDiv";
html += "
" + "斗鱼 - " + rid + "";
html += "
X
"
html += "
";
html += "
"
html += "
";
a.innerHTML = html;
let b = document.getElementsByClassName("layout-Main")[0];
b.insertBefore(a, b.childNodes[0]);
setElementDrag(id);
setElementResize(id);
if (id > videoPlayerArr.length - 1) {
videoPlayerArr.push("iframe");
} else {
videoPlayerArr[id] = "iframe";
}
setElementFunc_iframe(id);
}
function setElementFunc_iframe(id) {
let box = document.getElementById("videoDiv" + String(id));
let videoClose = document.getElementById("videoClose" + String(id));
videoClose.onclick = function() {
box.remove();
}
box.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
for (let i = 0; i < videoPlayerArr.length; i++) {
let box = document.getElementById("videoDiv" + String(i));
if (box != null) {
if (i == id) {
box.style.zIndex = 7778;
} else {
box.style.zIndex = 7777;
}
}
}
}
}
let real_viewIcon = '
'
let real_danmuIcon = '
'
// let real_giftIcon = '
'
let real_money_yc = '
'
let real_info = {
view: "",
showtime: 777,
danmu_person_count: "",
gift_person_count: "",
isShow: 2,
money_yc: 0,
money_bag: 0,
money_total: 0,
}
function initPkg_RealAudience() {
initPkg_RealAudience_Dom();
initPkg_RealAudience_Func();
fetch("https://www.douyu.com/swf_api/h5room/" + rid, {
method: 'GET',
mode: 'no-cors',
credentials: 'include'
}).then(res => {
return res.json();
}).then(retData => {
real_info.showtime = retData.data.show_time;
real_info.isShow = retData.data.show_status;
getRealViewer();
setInterval(getRealViewer, 30000);
}).catch(err => {
console.log("请求失败!", err);
})
}
function initPkg_RealAudience_Dom() {
document.querySelector(".AnchorAnnounce > h3").style.display = "none";
let html = "";
let a = document.createElement("div");
a.className = "real-audience";
html += "
" + real_viewIcon + '****
';
html += "
" + real_danmuIcon + '****
';
// html += "
" + real_giftIcon + '****
';
html += "
" + real_money_yc + '****
';
html += '
' + "已播:" + "****" + "";
a.innerHTML = html;
let b = document.getElementsByClassName("AnchorAnnounce")[0];
b.insertBefore(a, b.childNodes[0]);
}
function initPkg_RealAudience_Func() {
document.getElementsByClassName("AnchorAnnounce")[0].addEventListener("mouseover", function() {document.querySelector(".AnchorAnnounce > h3").style.display="block"});
document.getElementsByClassName("AnchorAnnounce")[0].addEventListener("mouseout", function() {document.querySelector(".AnchorAnnounce > h3").style.display="none"});
document.getElementsByClassName("real-audience")[0].addEventListener("click", function() {
openPage("https://www.xiaohulu.com/liveParticularsIndex/2/" + rid, true);
})
}
function getRealViewer() {
if(document.querySelector(".MatchSystemChatRoomEntry") != null){
document.querySelector(".MatchSystemChatRoomEntry").style.display = "none";
}
fetch("https://bojianger.com/data/api/common/search.do?keyword=" + rid,{
method: 'GET',
}).then(res => {
return res.json();
}).then(retData => {
let showedTime = 0;
if (real_info.isShow == 2) {
showedTime = 0;
} else {
if (real_info.showtime == 777) {
showedTime = 0;
} else {
showedTime = Math.floor(Date.now()/1000) - Number(real_info.showtime);
}
}
real_info.view = retData.data.anchorVo.audience_count;
real_info.danmu_person_count = retData.data.anchorVo.danmu_person_count;
real_info.gift_person_count = retData.data.anchorVo.gift_person_count;
real_info.money_yc = retData.data.anchorVo.gift_new_yc;
if (real_info.money_yc == "undefined" || real_info.money_yc == undefined) {
real_info.money_yc = 0;
real_info.money_bag = 0;
real_info.money_total = 0;
} else {
real_info.money_bag = retData.data.anchorVo.gift_new_bag;
real_info.money_total = retData.data.anchorVo.yc_gift_value;
}
document.getElementById("real-audience__total").innerText = real_info.view;
document.getElementById("real-audience__t").title = "总人数:" + real_info.view + " 弹幕人数:" + real_info.danmu_person_count + " 送礼人数:" + real_info.gift_person_count;
document.getElementById("real-audience__barrage").innerText = real_info.danmu_person_count;
// document.getElementById("real-audience__gift").innerText = real_info.gift_person_count;
document.getElementById("real-audience__money_yc").innerText = real_info.money_yc;
document.getElementById("real-audience__money").title = "总礼物价值:" + real_info.money_total + " 鱼翅礼物:" + real_info.money_yc + " 背包礼物:" + real_info.money_bag;
document.getElementById("real-audience__time").innerText = "已播:" + formatSeconds(showedTime);
}).catch(err => {
console.log("请求失败!", err);
})
}
function initPkg_RemoveAD() {
let t = setInterval(() => {
let a = document.getElementsByClassName("PlayerToolbar-wealthNum")[0];
if (a != undefined) {
removeAD();
clearInterval(t);
}
}, 1000);
}
function removeAD() {
let a;
a = document.getElementsByClassName("recommendAD-54569e")[0]; // 左
if (a != undefined) {
a.remove();
}
a = document.getElementsByClassName("recommendApp-0e23eb")[0]; // 右
if (a != undefined) {
a.remove();
}
a = document.getElementsByClassName("Title-ad")[0]; // 分享左
if (a != undefined) {
a.remove();
}
a = document.getElementsByClassName("Bottom-ad")[0]; // 鱼吧ad
if (a != undefined) {
a.style.display = "none";
}
a = document.getElementsByClassName("SignBarrage")[0];
if (a != undefined) {
a.remove();
}
a = document.getElementsByClassName("corner-ad-495ade")[0];
if (a != undefined) {
a.remove();
}
a = document.getElementsByClassName("SignBaseComponent-sign-ad");
if (a != undefined) {
for (let i = 0; i < a.length; i++) {
// a[i].style.display = "none";
a[i].remove();
}
}
a = document.getElementsByClassName("SuperFansBubble")[0];
if (a != undefined) {
a.remove();
}
// a = document.getElementsByClassName("recommendView-3e8b62")[0]
// if (a != undefined) {
// a.remove();
// }
// a = document.getElementsByClassName("js-room-activity")[0];
// if (a != undefined) {
// a.remove();
// }
a = document.getElementsByClassName("is-noLogin")[0];
if (a != undefined) {
a.style.display = "none"
}
a = document.getElementsByClassName("ChatSend-button")[0];
if (a != undefined) {
a.className = "ChatSend-button";
}
}
function initPkg_Sign() {
initPkg_Sign_Dom();
initPkg_Sign_Func();
}
function initPkg_Sign_Func() {
document.getElementsByClassName("ex-sign")[0].addEventListener("click", function() {
// 这里挂载每个子模块的函数入口
// 入口即为调用
initPkg_Sign_Yuba(); // 鱼吧签到
initPkg_Sign_Client();
initPkg_Sign_Motorcade();
initPkg_Sign_Room();
initPkg_Sign_Ad_666();
initPkg_Sign_Ad_Sign();
initPkg_Sign_Ad_FishPond();
})
}
function initPkg_Sign_Dom() {
Sign_insertIcon();
}
function Sign_insertIcon() {
let a = document.createElement("div");
a.className = "ex-sign"; // 以免有同名冲突,加了ex-
a.innerHTML = '
';
let b = document.getElementsByClassName("ex-panel__wrap")[0];
b.insertBefore(a, b.childNodes[0]);
}
function initPkg_Sign_Ad_666() {
getFishBall_Ad_666();
}
function getFishBall_Ad_666() {
let cnt = 0;
fetch("https://www.douyu.com/japi/tasksys/userStatus?ids=1033&token=" + dyToken + "&client_sys=android", {
method: 'GET',
mode: 'no-cors',
credentials: 'include'
}).then(res => {
return res.json();
}).then(async (retData) => {
cnt = Number(retData.data.list[0].taskLimitNum) - Number(retData.data.list[0].curCompleteNum);
if (cnt <= 0) {
showMessage("【挑战鱼丸】今日次数已用完", "warning");
return;
}
for (let i = 0; i < cnt; i++) {
let posid_ad_666 = "1114318";
let token = dyToken;
let uid = getUID();
let info = await getFishBall_Ad_666_info(posid_ad_666, token, uid);
let mid = info.mid;
let infoBack = info.infoBack;
let isStart = await getFishBall_Ad_666_start(posid_ad_666, token, uid, mid, infoBack);
if (isStart == true) {
showMessage("【挑战鱼丸】开始领取挑战鱼丸,需等待15秒", "info");
await sleep(15555).then(async () => {
let isFinish = await getFishBall_Ad_666_finish(posid_ad_666, token, uid, mid, infoBack);
if (isFinish == true) {
await getFishBall_Ad_666_Bubble(token);
}
})
}
}
}).catch(err => {
console.log("请求失败!", err);
})
}
function getFishBall_Ad_666_info(posid_ad_666, token, uid) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://rtbapi.douyucdn.cn/japi/sign/app/getinfo?token=" + token + "&mdid=phone" + "&client_sys=android",
data: "posid=" + posid_ad_666 + "&roomid=" + rid + "&cate1=1&cate2=1&chanid=30",
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
mid = ret.data[0].mid;
infoBack = encodeURIComponent(JSON.stringify(ret.data));
resolve({mid: mid, infoBack: infoBack});
}
}
});
})
}
function getFishBall_Ad_666_start(posid_ad_666, token, uid, mid, infoBack) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/start?client_sys=android",
data: "token=" + token + "&uid=" + uid + "&roomId=" + rid + "&posCode=" + posid_ad_666 + "&clientType=1&creativeId=" + mid + "&infoBack=" + infoBack,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
resolve(true);
}
}
});
})
}
function getFishBall_Ad_666_finish(posid_ad_666, token, uid, mid, infoBack) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/finish?client_sys=android",
data: "uid=" + uid + "&clientType=1&posCode=" + posid_ad_666 + "&creativeId=" + mid + "&roomId=" + rid + "&token=" + token + "&infoBack=" + infoBack,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
resolve(true);
}
}
});
})
}
function getFishBall_Ad_666_Bubble(token) {
return new Promise(resolve => {
fetch("https://www.douyu.com/japi/tasksys/getPrize?client_sys=android", {
method: 'POST',
mode: 'no-cors',
credentials: 'include',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: "id=1033&roomId=" + rid + "&token=" + token
}).then(res => {
return res.json();
}).then(ret => {
if (ret.error == "0") {
let retJson = JSON.parse(ret.data.ext);
showMessage("【挑战鱼丸】已领取" + retJson.data.items[1].prizeNum + "个" + retJson.data.items[1].prizeName, "success");
} else {
showMessage(ret.msg, "error");
}
resolve();
})
})
}
function initPkg_Sign_Ad_FishPond() {
getFishBall_Ad_FishPond();
}
function getFishBall_Ad_FishPond() {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/tasksys/ytxb/userStatusV3?client_sys=android",
data: "roomId=" + rid + "&token=" + dyToken,
responseType: "json",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: async function(response) {
let ret = response.response.data.taskList;
for (let i = 0; i < ret.length; i++) {
if (ret[i].task.id == "182") {
if (ret[i].task.status == "3") {
showMessage("【鱼塘鱼丸】已领取", "warning");
} else {
let posid_Ad_FishPond = "1114268";
let token = dyToken;
let uid = getUID();
let info = await getFishBall_Ad_FishPond_info(posid_Ad_FishPond, token, uid);
let mid = info.mid;
let infoBack = info.infoBack;
let isStart = await getFishBall_Ad_FishPond_start(posid_Ad_FishPond, token, uid, mid, infoBack);
if (isStart == true) {
showMessage("【鱼塘鱼丸】开始领取鱼塘鱼丸,需等待20秒", "info");
await sleep(20000).then(async () => {
let isFinish = await getFishBall_Ad_FishPond_finish(posid_Ad_FishPond, token, uid, mid, infoBack);
if (isFinish == true) {
await getFishBall_Ad_FishPond_Bubble(token);
}
})
}
}
}
}
}
});
}
function getFishBall_Ad_FishPond_info(posid_Ad_FishPond, token, uid) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://rtbapi.douyucdn.cn/japi/sign/app/getinfo?token=" + token + "&mdid=phone" + "&client_sys=android",
data: "posid=" + posid_Ad_FishPond + "&roomid=" + rid + "&cate1=1&cate2=1&chanid=30",
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
mid = ret.data[0].mid;
infoBack = encodeURIComponent(JSON.stringify(ret.data));
resolve({mid: mid, infoBack: infoBack});
}
}
});
})
}
function getFishBall_Ad_FishPond_start(posid_Ad_FishPond, token, uid, mid, infoBack) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/start?client_sys=android",
data: "token=" + token + "&uid=" + uid + "&roomId=" + rid + "&posCode=" + posid_Ad_FishPond + "&clientType=1&creativeId=" + mid + "&infoBack=" + infoBack,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
resolve(true);
}
}
});
})
}
function getFishBall_Ad_FishPond_finish(posid_Ad_FishPond, token, uid, mid, infoBack) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/finish?client_sys=android",
data: "uid=" + uid + "&clientType=1&posCode=" + posid_Ad_FishPond + "&creativeId=" + mid + "&roomId=" + rid + "&token=" + token + "&infoBack=" + infoBack,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
resolve(true);
}
}
});
})
}
function getFishBall_Ad_FishPond_Bubble(token) {
return new Promise(resolve => {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/tasksys/ytxb/getPrize?client_sys=android",
data: "token=" + token + "&id=182",
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
showMessage("【鱼塘鱼丸】" + ret.data.msg, "success");
} else {
showMessage("【鱼塘鱼丸】" + ret.msg, "error");
}
resolve();
}
});
})
}
function initPkg_Sign_Ad_Sign() {
getFishBall_Ad_Sign();
}
function getFishBall_Ad_Sign() {
let fishBallNum = "0";
let posid_ad_sign = "1064246";
GM_xmlhttpRequest({
method: "GET",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/inspire/getFishBallNum?posId=" + posid_ad_sign + "&ct=1&token=" + dyToken,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
fishBallNum = ret.data.num;
GM_xmlhttpRequest({
method: "GET",
url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/inspire/sendFishBall?uid=" + getUID() + "&posCode=" + posid_ad_sign + "&ct=1&token=" + dyToken,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.error == "0") {
showMessage("【签到鱼丸】成功领取" + fishBallNum + "个鱼丸", "success");
} else {
if (ret.msg == "null") {
showMessage("【签到鱼丸】未绑定手机" , "warning");
} else {
showMessage("【签到鱼丸】" + ret.msg, "warning");
}
}
}
});
}
}
});
}
function initPkg_Sign_Client() {
signClient();
}
function signClient() {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/h5nc/sign/sendSign",
data: 'token=' + dyToken,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
let ret = response.response;
if (ret.data.length == 0) {
showMessage("【客户端】今日已签到", "warning");
// console.log("【客户端】今日已签到");
} else {
if (ret.data.sign_pl.length != 0) {
let recv = "";
for (let i = 0; i < ret.data.sign_pl.length; i++) {
recv = recv + ret.data.sign_pl[i].cnt + "个" + ret.data.sign_pl[i].name + ",";
}
showMessage("【客户端】签到成功! 获得物品:" + recv, "success");
// console.log("【客户端】签到成功! 获得物品:" + recv);
} else {
showMessage("【客户端】签到成功! 可惜没有获得东西", "success");
// console.log("【客户端】签到成功! 可惜没获得东西");
}
}
}
});
}
function initPkg_Sign_Motorcade() {
signMotorcade();
}
function signMotorcade() {
GM_xmlhttpRequest({
method: "GET",
url: "https://msgm.douyu.com/mapi/v1.0/motorcade_battle/home",
responseType: "json",
headers: {
"dy-client": "android",
"dy-token": dyToken,
},
onload: function(response) {
if (Object.keys(response.response).length != 0) {
if (Object.keys(response.response.data.joined_motorcade).length != 0) {
let mid = encodeURIComponent(response.response.data.joined_motorcade.id);
GM_xmlhttpRequest({
method: "GET",
url: "https://msg.douyu.com/v3/motorcade/signs/weekly?mid=" + mid,
responseType: "json",
headers: {
"dy-client": "android",
"dy-token": dyToken,
},
onload: function(response) {
if (response.response.data.is_sign == "1") {
showMessage("【车队签到】车队已签到", "warning");
} else {
showMessage("【车队签到】即将打开车队签到页面", "info");
openPage("https://msg.douyu.com/motorcade/#/motorcade/" + mid + "/task?total=" + String(Number(response.response.data.total) + 1) + "&mid=" + mid + "&exid=chun", false);
}
}
});
}
}
}
});
}
function getCookie(cookieName) {
let csrfToken = "";
let strCookie = document.cookie;
let arrCookie = strCookie.split("; ");
for(let i = 0; i < arrCookie.length; i++) {
let arr = arrCookie[i].split("=");
if(cookieName == arr[0]){
csrfToken = arr[1];
}
}
if(csrfToken == ""){
csrfToken = Math.random().toString(36).substr(2);
document.cookie = "post-csrfToken="+ escape(csrfToken)+";path=/";
}
return csrfToken;
}
function signMotorcade_Sign(m, t) {
fetch('https://msg.douyu.com/v3/msign/add?timestamp=' + Math.random().toFixed(17), {
method: 'POST',
mode: 'cors',
credentials: 'include',
headers: {
'dy-device-id':'-',
"dy-client": "web",
"dy-csrf-token":getCookie("post-csrfToken"),
'Content-Type': 'application/x-www-form-urlencoded'
},
body: "to_mid="+ m +"&expression=" + t
}).then(res => {
return res;
}).then(ret => {
if (Math.floor(ret.status_code / 100) == 2){
console.log("【车队】签到成功")
} else {
console.log(ret.message);
}
closePage();
}).catch(err => {
console.log("请求失败!", err)
closePage();
})
}
function initPkg_Sign_Room() {
signAllRoom();
}
function signAllRoom() {
// 1. get page counts(777)
// 2. for in all pages
// 3. sign each room
let pageCount = 0;
fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/list?page=777',{
method: 'GET',
mode: 'no-cors',
cache: 'default',
credentials: 'include',
}).then(res => {
return res.json();
}).then(ret => {
pageCount = Number(ret.data.pageCount);
for (let nowPage = 1; nowPage <= pageCount; nowPage++) {
fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/list?page=' + String(nowPage),{
method: 'GET',
mode: 'no-cors',
cache: 'default',
credentials: 'include',
}).then(res => {
return res.json();
}).then(ret => {
let roomCount = Number(ret.data.list.length);
for (let i = 0; i < roomCount; i++) {
signRoom(ret.data.list[i].room_id);
if (nowPage == pageCount && i == roomCount - 1) {
showMessage("【房间签到】" + ret.data.total + "个房间签到已完成!", "success");
}
}
}).catch(err => {
console.log("请求失败!", err);
})
}
showMessage("【房间签到】" + ret.data.total + "个房间正在签到中...", "info");
}).catch(err => {
console.log("请求失败!", err);
})
}
function signRoom(r) {
GM_xmlhttpRequest({
method: "POST",
url: "https://apiv2.douyucdn.cn/japi/roomuserlevel/apinc/checkIn",
data: 'rid=' + r + '&ctn=' + getCCN(),
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'token': dyToken,
'cookie': document.cookie
},
onload: function(response) {
}
});
}
function initPkg_Sign_Yuba() {
signYubaList();
}
function signYuba(group_id, t) {
GM_xmlhttpRequest({
method: "POST",
url: "https://yuba.douyu.com/ybapi/topic/sign",
data: 'group_id=' + group_id,
responseType: "json",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"dy-client": "pc",
"dy-token": t,
'Referer': 'https://yuba.douyu.com/group/' + group_id
},
onload: function(response) {
if (response.response.message == "") {
showMessage("【鱼吧】" + group_id + "签到成功! 连续" + response.response.data.count + "天 获得经验" + response.response.data.exp, "success");
// console.log("【鱼吧】" + group_id + "签到成功! 连续" + response.response.data.count + "天 获得经验" + response.response.data.exp);
} else {
showMessage("【鱼吧】" + group_id + response.response.message, "warning");
// console.log("【鱼吧】" + group_id + response.response.message);
}
}
});
}
function signYubaList() {
GM_xmlhttpRequest({
method: "GET",
url: "https://yuba.douyu.com/wbapi/web/group/myFollow?page=1&limit=999",
responseType: "json",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"dy-client": "pc",
"dy-token": dyToken
},
onload: function(response) {
for (let i = 0; i < response.response.data.list.length; i++) {
signYuba(response.response.data.list[i].group_id, dyToken);
}
}
});
}
// 版本号
// 格式 yyyy.MM.dd.**
// var curVersion = "2020.01.12.01";
var curVersion = "2020.03.29.01"
function initPkg_Update() {
initPkg_Update_Dom();
initPkg_Update_Func();
Update_checkVersion(); // 首次检查更新
}
function initPkg_Update_Dom() {
Update_insertIcon();
}
function Update_insertIcon() {
let a = document.createElement("div");
a.className = "ex-update";
a.innerHTML = '
';
let b = document.getElementsByClassName("ex-panel__wrap")[0];
b.insertBefore(a, b.childNodes[0]);
}
function initPkg_Update_Func() {
document.getElementsByClassName("ex-update")[0].addEventListener("click", Update_openUpdatePage);
}
function Update_checkVersion() {
fetch('https://greasyfork.org/zh-CN/scripts/394497',{
method: 'GET',
mode: 'cors',
cache: 'no-store',
credentials: 'omit',
}).then(res => {
return res.text();
}).then(txt => {
txt = (new DOMParser()).parseFromString(txt, 'text/html');
let v = txt.getElementsByClassName("script-show-version")[1];
if(v != undefined){
if (v.innerText != curVersion) {
Update_showTip(true);
}
}
}).catch(err => {
console.error('请求失败', err);
})
}
function Update_openUpdatePage() {
openPage("https://greasyfork.org/zh-CN/scripts/394497", true);
}
function Update_showTip(a) {
let d = document.getElementById("ex-update__tip");
if (a == true) {
if (d.style.display != "block") {
showMessage("【版本更新】插件有新版本,请及时更新~", "error");
d.style.display = "block";
}
} else {
d.style.display = "none";
}
}
/*
md5.js
*/
var hexcase=0;var b64pad="";var chrsz=8;function hex_md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz))}function b64_md5(s){return binl2b64(core_md5(str2binl(s),s.length*chrsz))}function str_md5(s){return binl2str(core_md5(str2binl(s),s.length*chrsz))}function hex_hmac_md5(key,data){return binl2hex(core_hmac_md5(key,data))}function b64_hmac_md5(key,data){return binl2b64(core_hmac_md5(key,data))}function str_hmac_md5(key,data){return binl2str(core_hmac_md5(key,data))}function md5_vm_test(){return hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72"}function core_md5(x,len){x[len>>5]|=0x80<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i
16)bkey=core_md5(bkey,key.length*chrsz);var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++){ipad[i]=bkey[i]^0x36363636;opad[i]=bkey[i]^0x5C5C5C5C}var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);return core_md5(opad.concat(hash),512+128)}function safe_add(x,y){var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF)}function bit_rol(num,cnt){return(num<>>(32-cnt))}function str2binl(str){var bin=Array();var mask=(1<>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin}function binl2str(bin){var str="";var mask=(1<>5]>>>(i%32))&mask);return str}function binl2hex(binarray){var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i>2]>>((i%4)*8+4))&0xF)+hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF)}return str}function binl2b64(binarray){var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";for(var i=0;i>2]>>8*(i%4))&0xFF)<<16)|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);for(var j=0;j<4;j++){if(i*8+j*6>binarray.length*32)str+=b64pad;else str+=tab.charAt((triplet>>6*(3-j))&0x3F)}}return str}
/*
Notice.js
*/
(function webpackUniversalModuleDefinition(root,factory){if(typeof exports==='object'&&typeof module==='object')module.exports=factory();else if(typeof define==='function'&&define.amd)define("NoticeJs",[],factory);else if(typeof exports==='object')exports["NoticeJs"]=factory();else root["NoticeJs"]=factory()})(typeof self!=='undefined'?self:this,function(){return(function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{configurable:false,enumerable:true,get:getter})}};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module['default']}:function getModuleExports(){return module};__webpack_require__.d(getter,'a',getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p="dist/";return __webpack_require__(__webpack_require__.s=2)})([(function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var noticeJsModalClassName=exports.noticeJsModalClassName='noticejs-modal';var closeAnimation=exports.closeAnimation='noticejs-fadeOut';var Defaults=exports.Defaults={title:'',text:'',type:'success',position:'topRight',timeout:30,progressBar:true,closeWith:['button'],animation:null,modal:false,scroll:{maxHeight:300,showOnHover:true},rtl:false,callbacks:{beforeShow:[],onShow:[],afterShow:[],onClose:[],afterClose:[],onClick:[],onHover:[],onTemplate:[]}}}),(function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.appendNoticeJs=exports.addListener=exports.CloseItem=exports.AddModal=undefined;exports.getCallback=getCallback;var _api=__webpack_require__(0);var API=_interopRequireWildcard(_api);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}var options=API.Defaults;function getCallback(ref,eventName){if(ref.callbacks.hasOwnProperty(eventName)){ref.callbacks[eventName].forEach(function(cb){if(typeof cb==='function'){cb.apply(ref)}})}}var AddModal=exports.AddModal=function AddModal(){if(document.getElementsByClassName(API.noticeJsModalClassName).length<=0){var element=document.createElement('div');element.classList.add(API.noticeJsModalClassName);element.classList.add('noticejs-modal-open');document.body.appendChild(element);setTimeout(function(){element.className=API.noticeJsModalClassName},200)}};var CloseItem=exports.CloseItem=function CloseItem(item){getCallback(options,'onClose');if(options.animation!==null&&options.animation.close!==null){item.className+=' '+options.animation.close}setTimeout(function(){item.remove()},200);if(options.modal===true&&document.querySelectorAll("[noticejs-modal='true']").length>=1){document.querySelector('.noticejs-modal').className+=' noticejs-modal-close';setTimeout(function(){document.querySelector('.noticejs-modal').remove()},500)}var position='.'+item.closest('.noticejs').className.replace('noticejs','').trim();setTimeout(function(){if(document.querySelectorAll(position+' .item').length<=0){let p=document.querySelector(position);if(p!=null){p.remove()}}},500)};var addListener=exports.addListener=function addListener(item){if(options.closeWith.includes('button')){item.querySelector('.close').addEventListener('click',function(){CloseItem(item)})}if(options.closeWith.includes('click')){item.style.cursor='pointer';item.addEventListener('click',function(e){if(e.target.className!=='close'){getCallback(options,'onClick');CloseItem(item)}})}else{item.addEventListener('click',function(e){if(e.target.className!=='close'){getCallback(options,'onClick')}})}item.addEventListener('mouseover',function(){getCallback(options,'onHover')})};var appendNoticeJs=exports.appendNoticeJs=function appendNoticeJs(noticeJsHeader,noticeJsBody,noticeJsProgressBar){var target_class='.noticejs-'+options.position;var noticeJsItem=document.createElement('div');noticeJsItem.classList.add('item');noticeJsItem.classList.add(options.type);if(options.rtl===true){noticeJsItem.classList.add('noticejs-rtl')}if(noticeJsHeader&¬iceJsHeader!==''){noticeJsItem.appendChild(noticeJsHeader)}noticeJsItem.appendChild(noticeJsBody);if(noticeJsProgressBar&¬iceJsProgressBar!==''){noticeJsItem.appendChild(noticeJsProgressBar)}if(['top','bottom'].includes(options.position)){document.querySelector(target_class).innerHTML=''}if(options.animation!==null&&options.animation.open!==null){noticeJsItem.className+=' '+options.animation.open}if(options.modal===true){noticeJsItem.setAttribute('noticejs-modal','true');AddModal()}addListener(noticeJsItem,options.closeWith);getCallback(options,'beforeShow');getCallback(options,'onShow');document.querySelector(target_class).appendChild(noticeJsItem);getCallback(options,'afterShow');return noticeJsItem}}),(function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,NoticeJs);this.options=Object.assign(API.Defaults,options);this.component=new _components.Components();this.on('beforeShow',this.options.callbacks.beforeShow);this.on('onShow',this.options.callbacks.onShow);this.on('afterShow',this.options.callbacks.afterShow);this.on('onClose',this.options.callbacks.onClose);this.on('afterClose',this.options.callbacks.afterClose);this.on('onClick',this.options.callbacks.onClick);this.on('onHover',this.options.callbacks.onHover);return this}_createClass(NoticeJs,[{key:'show',value:function show(){var container=this.component.createContainer();if(document.querySelector('.noticejs-'+this.options.position)===null){document.body.appendChild(container)}var noticeJsHeader=void 0;var noticeJsBody=void 0;var noticeJsProgressBar=void 0;noticeJsHeader=this.component.createHeader(this.options.title,this.options.closeWith);noticeJsBody=this.component.createBody(this.options.text);if(this.options.progressBar===true){noticeJsProgressBar=this.component.createProgressBar()}var noticeJs=helper.appendNoticeJs(noticeJsHeader,noticeJsBody,noticeJsProgressBar);return noticeJs}},{key:'on',value:function on(eventName){var cb=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(){};if(typeof cb==='function'&&this.options.callbacks.hasOwnProperty(eventName)){this.options.callbacks[eventName].push(cb)}return this}}]);return NoticeJs}();exports.default=NoticeJs;module.exports=exports['default']}),(function(module,exports){}),(function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.Components=undefined;var _createClass=function(){function defineProperties(target,props){for(var i=0;i {console.log(url)}
let qn_data = "80";
switch (qn) {
case "1":
qn_data = "80";
break;
case "2":
qn_data = "150";
break;
case "3":
qn_data = "250";
break;
case "4":
qn_data = "400";
break;
case "5":
qn_data = "10000";
break;
default:
qn_data = "80";
break;
}
GM_xmlhttpRequest({
method: "GET",
url: "https://api.live.bilibili.com/room/v1/Room/playUrl?cid=" + room_id + "&qn=" + qn_data + "&platform=web",
responseType: "json",
onload: function(response) {
let ret = response.response;
let rurl = "";
if (ret.data.durl != null) {
rurl = ret.data.durl[Number(cdn)].url;
} else {
rurl = "";
}
reallive_callback(rurl);
}
});
}
/*
Get Bilibili Real Room ID
By: 小淳
*/
function getRealRid_Bilibili(url, realrid_callback) {
GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "text",
onload: function(response) {
let ret = response.response;
let rid = "";
rid = getStrMiddle(ret, 'room_id":', ',');
rid = rid.trim();
if (rid == "") {
rid = "-1";
}
realrid_callback(rid);
}
});
}
/*
Get Douyu Real Live URL (http/https)
By: 小淳
*/
function getRealLive_Douyu(room_id, is_https, qn, cdn, reallive_callback) {
// 第一个参数传入string,表示房间号(注意是真实房间号)
// 第二个参数传入bool,表示是否返回https地址。注意https地址只能使用一次,使用过以后需要再次获取;http地址无限制
// 第三个参数传入string(1,2,3,4),表示清晰度 流畅_550p(rate:1) 高清_1200p(rate:2) 超清_2000p(rate:3) 蓝光4M_4000p(rate:4)
// 第四个参数传入string(1,2,3,4),表示线路 1:主线路(ws-h5) 2:备用线路1(tct-h5) 3:备用线路2(ali-h5) 此参数只对HTTPS有效
// 第五个参数传入回调函数,最好是箭头函数,用于处理返回的地址,例: (url) => {console.log(url)}
GM_xmlhttpRequest({
method: "GET",
url: 'https://m.douyu.com/' + room_id,
responseType: "text",
onload: function(response) {
let a = response.response.match(/(function ub9.*)[\s\S](var.*)/i);
let b = String(a[1]).replace(/eval.*;}/, 'strc;}');
let c = b + String(a[2]);
let tt2 = dateFormat("yyyyMMdd", new Date());
let tt0 = String(Math.round(new Date().getTime()/1000).toString());
RealLive_get_sign_url(tt2, room_id, tt0, c, is_https, qn, cdn, reallive_callback); // 传入参数无误
}
});
}
function RealLive_get_sign_url(post_v, r, tt, ub9, is_https, qn, cdn, reallive_callback) {
let sign = RealLive_get_sign(r, post_v, tt, ub9);
if (is_https != true) {
let postData = 'v=2501' + post_v + '&did=10000000000000000000000000001501&tt=' + tt + '&sign=' + sign + '&ver=219032101&rid=' + r + '&rate=-1';
GM_xmlhttpRequest({
method: "POST",
url: "https://m.douyu.com/api/room/ratestream",
data: postData,
responseType: "json",
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Mobile Safari/537.36'
},
onload: function(response) {
let ret = response.response;
let result = "";
if (ret.code == "0") {
let url = ret.data.url;
if (String(url).indexOf("mix=1") != -1) {
result = "PKing"
} else {
let p = /live\/(\d{1,8}[0-9a-zA-Z]+)_?[\d]{0,4}\/playlist/i;
result = String(url).match(p)[1];
}
} else {
result = "0";
}
let cl = "";
switch (qn) {
case "1":
cl = "550p"
break;
case "2":
cl = "1200p"
break;
case "3":
cl = "2000p"
break;
case "4":
cl = "4000p"
break;
default:
cl = "1200p"
break;
}
let realLive = "";
if (result == "0") {
realLive = "None";
} else {
realLive = "https://tx2play1.douyucdn.cn/live/" + result + "_" + cl + ".flv?uuid=";
}
reallive_callback(realLive);
}
});
} else {
fetch("https://www.douyu.com/lapi/live/getH5Play/" + r, {
method: 'POST',
mode: 'no-cors',
credentials: 'include',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: 'v=220120200219&did=' + getDyDid() + '&tt=' + tt + '&sign=' + sign + '&cdn=' + cdn + '&rate=' + qn + '&ver=Douyu_220021805&iar=0&ive=0'
}).then(res => {
return res.json();
}).then(ret => {
if (ret.data != "") {
reallive_callback(ret.data.rtmp_url + "/" + ret.data.rtmp_live);
} else {
showMessage(ret.msg, "error");
console.log(ret.msg);
}
})
}
}
function RealLive_get_sign(r, post_v, tt, ub9) {
let ub9_ex = String(ub9).replace("ub98484234", "ub98484234_ex");
eval1(ub9_ex, "exScript1");
let res2 = ub98484234_ex();
let str3 = String(res2).replace(/\(function[\s\S]*toString\(\)/, "\'");
let md5rb = hex_md5(r + '10000000000000000000000000001501' + tt + '2501' + post_v);
let str4 = 'function get_sign(){var rb=\'' + md5rb + str3;
let str5 = String(str4).replace(/return rt;}[\s\S]*/, 'return re;};');
let str6 = String(str5).replace(/"v=.*&sign="\+/, '');
str6 = String(str6).replace("get_sign", "get_sign_ex")
eval1(str6, "exScript2");
let sign = get_sign_ex(r + "10000000000000000000000000001501", tt);
document.getElementById("exScript1").remove();
document.getElementById("exScript2").remove();
return sign;
}
function eval1(str, iid) {
var sc = document.createElement("script");
sc.id = iid
sc.setAttribute("type","text\/javascript");
sc.appendChild(document.createTextNode(str));
document.body.appendChild(sc);
}
/*
Get Douyu Real Room ID
By: 小淳
*/
function getRealRid_Douyu(url, realrid_callback) {
fetch(url,{
method: 'GET',
mode: 'no-cors',
cache: 'default',
credentials: 'include',
}).then(res => {
return res.text();
}).then(doc => {
doc = (new DOMParser()).parseFromString(doc, 'text/html');
let url = doc.getElementsByTagName('html')[0].innerHTML;
let urlLen = ("$ROOM.room_id =").length;
let ridPos = url.indexOf('$ROOM.room_id =');
let rid = url.substring(ridPos + urlLen, url.indexOf(';', ridPos + urlLen));
rid = rid.trim();
if (isRid(rid) == true) {
realrid_callback(rid);
} else {
showMessage("获取直播间失败,请检查直播间地址是否正确!", "error")
}
}).catch(err => {
console.log("请求失败!", err);
})
}
/*
Get Huya Real Live URL (https)
By: 小淳
*/
function getRealLive_Huya(url, qn, cdn, reallive_callback) {
// 第一个参数传入string,表示房间号(注意是真实房间号)
// 第二个参数传入string(1,2,3,4),表示清晰度 流畅_500(1) 超清_2500(2) 蓝光4M_4500(3) 原画(4)
// 第三个参数传入string(1,2,3,4),表示线路 1:主线路 2:备用线路1 3:备用线路2 4:备用线路3
// 第四个参数传入回调函数,最好是箭头函数,用于处理返回的地址,例: (url, msg) => {console.log(url, msg)}
// 这个回调函数有2个参数,第一个是直播流地址,第二个是信息,用于判断错误
let qn_data = "500";
switch (qn) {
case "1":
qn_data = "500";
break;
case "2":
qn_data = "2500";
break;
case "3":
qn_data = "4500";
break;
case "4":
qn_data = "0";
break;
default:
qn_data = "500";
break;
}
let cdn_data = Number(cdn) - 1;
GM_xmlhttpRequest({
method: "GET",
url: url,
responseType: "text",
onload: function(response) {
let html = String(response.response);
let lurl = ""; // 直播源
let msg = ""; // 信息 预留
let lurl_sFlvUrl = "";
let lurl_sStreamName = "";
let lurl_sFlvUrlSuffix = "";
let lurl_sFlvAntiCode = "";
if (getStrMiddle(html, '"state":"', '",') == "ON") {
let tlen = ("hyPlayerConfig = ").length;
let tpos = html.indexOf("hyPlayerConfig = ");
let json = JSON.parse(html.substring(tpos + tlen, html.indexOf('};', tpos + tlen)) + '}');
if (json.stream != null) {
if (json.stream.data[0].gameStreamInfoList.length >= cdn_data) {
lurl_sFlvUrl = json.stream.data[0].gameStreamInfoList[cdn_data].sFlvUrl;
lurl_sFlvUrl = String(lurl_sFlvUrl).replace("http", "https");
lurl_sStreamName = json.stream.data[0].gameStreamInfoList[cdn_data].sStreamName;
lurl_sFlvUrlSuffix = json.stream.data[0].gameStreamInfoList[cdn_data].sFlvUrlSuffix;
lurl_sFlvAntiCode = json.stream.data[0].gameStreamInfoList[cdn_data].sFlvAntiCode;
lurl = lurl_sFlvUrl + "/" + lurl_sStreamName + "." + lurl_sFlvUrlSuffix + "?" + lurl_sFlvAntiCode;
lurl = lurl.replace(/amp;/g, "");
if (qn_data != "0") {
lurl = lurl + "&ratio=" + qn_data;
}
} else {
msg = "暂无该线路";
}
}
} else {
msg = "该房间未开播";
}
reallive_callback(lurl, msg);
}
});
}