"use strict"; // ==UserScript== // @name DouyuEx-斗鱼直播间增强插件 // @namespace https://github.com/qianjiachun // @icon https://s2.ax1x.com/2020/01/12/loQI3V.png // @version 2020.03.11.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_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: 500px; height: 50px; position: absolute; bottom: 35px; right: 75px; 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 += '
~
'; html += '
'; html += '
'; html += '
'; a.innerHTML = html; let b = document.getElementsByClassName("layout-Player-chat")[0]; b.insertBefore(a, b.childNodes[0]); } function BarrageLoop_insertIcon() { let a = document.createElement("div"); a.className = "bloop-icon"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function getBarrageColorArr() { // 获取已解锁的弹幕颜色 barrageColorArr.length = 0;// 清空数组 barrageColorLength = 0; let a = document.getElementsByClassName("FansBarrageColor-item"); if (a.length == 0) { isMatch = true; let b = document.getElementsByClassName("MatchSystemFansBarrageSwitcher")[0]; if (b != undefined) { b.click(); a = document.getElementsByClassName("MatchSystemFansBarrageColor-item"); } else { isMatch = false; } } else { isMatch = false; } for (let i = 0; i < a.length; i++) { let itemClassName = a[i].className; if (itemClassName.indexOf("is-lock") == -1) { barrageColorArr.push(i); barrageColorLength++; } } barrageColorLength = barrageColorLength - 1; } function getBarrageArr() { // 获取即将发送的弹幕数组 barrageArr.length = 0; barrageLength = 0; let a = document.getElementById("bloop__textarea").value; barrageArr = a.split("\n"); barrageLength = barrageArr.length - 1; } function selectBarrageColor(index) { // 选择粉丝弹幕 let a; if (isMatch == false) { a = document.getElementsByClassName("FansBarrageColor-item")[index]; } else{ document.getElementsByClassName("MatchSystemFansBarrageSwitcher")[0].click() a = document.getElementsByClassName("MatchSystemFansBarrageColor-item")[index]; } if (a != undefined) { a.click(); } } function sendBarrage(text) { // 发送弹幕 document.getElementsByClassName("ChatSend-txt")[0].value = text; document.getElementsByClassName("ChatSend-button")[0].click(); } function getSpeed() { let min = document.getElementById("bloop__text_speed1").value; let max = document.getElementById("bloop__text_speed2").value; let ret = getRandom(Number(min), Number(max)); return ret; } function saveData_BarrageLoop() { let speed1 = document.getElementById("bloop__text_speed1").value; let speed2 = document.getElementById("bloop__text_speed2").value; let stopTime = document.getElementById("bloop__text_stoptime").value; if (speed1 == "undefined") { speed1 = 2000; } if (speed2 == "undefined") { speed2 = 3000; } if (stopTime == "undefined") { stopTime = 5; } let data = { text: document.getElementById("bloop__textarea").value, speed1: speed1, speed2: speed2, stopTime: stopTime, isChangeColor: isChangeColor, } localStorage.setItem("ExSave_BarrageLoop", JSON.stringify(data)); // 存储弹幕列表 } function getStopTime() { let a = document.getElementById("bloop__text_stoptime").value; return Number(a) * 60 * 1000; } function doLoopBarrage() { if (isChangeColor == true) { selectBarrageColor(barrageColorOffset); barrageColorOffset++; if (barrageColorOffset > barrageColorLength) { barrageColorOffset = 0; } } sendBarrage(barrageArr[barrageOffset]); barrageOffset++; if (barrageOffset > barrageLength) { barrageOffset = 0; } bloopTimer = setTimeout(doLoopBarrage, getSpeed()); } function initPkg_BarrageLoop_Func() { // 函数初始化 // 将onclick事件绑定在这里 document.getElementsByClassName("bloop-icon")[0].addEventListener("click", function() { let a = document.getElementsByClassName("bloop")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("extool")[0].style.display == "block") { document.getElementsByClassName("extool")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("bloop__checkbox_changeColor").addEventListener("click", function() { isChangeColor = document.getElementById("bloop__checkbox_changeColor").checked; }); document.getElementById("bloop__checkbox_startSend").addEventListener("click", function() { let ischecked = document.getElementById("bloop__checkbox_startSend").checked; if (ischecked == true) { // 开始发送 barrageOffset = 0; barrageColorOffset = 0; getBarrageArr(); getBarrageColorArr(); saveData_BarrageLoop(); bloopTimer = setTimeout(doLoopBarrage, getSpeed()); bloopStopTimer = setTimeout(() => { document.getElementById("bloop__checkbox_startSend").checked = false; clearTimeout(bloopTimer); }, getStopTime()); } else{ // 停止发送 clearTimeout(bloopTimer); clearTimeout(bloopStopTimer); // clearInterval(bloopTimer); } }); } function initPkg_BarrageLoop_Dom() { // Dom初始化 BarrageLoop_insertModal(); BarrageLoop_insertIcon(); } function initPkg_BarrageLoop_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_BarrageLoop"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.speed1 == undefined) { retJson.speed1 = 2000; } if (retJson.speed2 == undefined) { retJson.speed2 = 3000; } if (retJson.stopTime == undefined) { retJson.stopTime = 5; } document.getElementById("bloop__textarea").value = retJson.text; document.getElementById("bloop__checkbox_changeColor").checked = retJson.isChangeColor; isChangeColor = Boolean(retJson.isChangeColor); document.getElementById("bloop__text_speed1").value = retJson.speed1; document.getElementById("bloop__text_speed2").value = retJson.speed2; document.getElementById("bloop__text_stoptime").value = retJson.stopTime; } } function initPkg_ExIcon() { pkg_ExIcon_insertDom(); pkg_ExIcon_initFunc(); } function pkg_ExIcon_insertDom() { let a = document.createElement("div"); a.className = "ex-icon"; a.innerHTML = ''; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function pkg_ExIcon_initFunc() { document.getElementsByClassName("ex-icon")[0].addEventListener("click", showExPanel); // unsafeWindow.showExPanel = showExPanel; } function ExIcon_showTip(a) { let d = document.getElementById("ex-icon__tip"); if (a == true) { d.style.display = "block"; } else { d.style.display = "none"; } } function initPkg_ExpandTool() { initPkg_ExpandTool_Dom(); initPkg_ExpandTool_Func(); // initPkg_ExpandTool_RedPacket_Motorcade(); initPkg_ExpandTool_RedPacket_Room(); initPkg_ExpandTool_ClearBag(); initPkg_ExpandTool_SendGift(); initPkg_ExpandTool_BarrageSize(); } function initPkg_ExpandTool_Dom() { // Dom初始化 ExpandTool_insertModal(); ExpandTool_insertIcon(); } function ExpandTool_insertModal() { let a = document.createElement("div"); a.className = "extool"; let b = document.getElementsByClassName("layout-Player-chat")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_insertIcon() { let a = document.createElement("div"); a.className = "extool-icon"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_ExpandTool_Func() { // 函数初始化 // 将onclick事件绑定在这里 document.getElementsByClassName("extool-icon")[0].addEventListener("click", function() { let a = document.getElementsByClassName("extool")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("bloop")[0].style.display == "block") { document.getElementsByClassName("bloop")[0].style.display = "none"; } } else { a.style.display = "none"; } }); } var sheetIndex = 0; function initPkg_ExpandTool_BarrageSize() { sheetIndex = getAvailableSheet(); if (sheetIndex != -1) { document.styleSheets[sheetIndex].addRule(".danmuItem-31f924",""); // 这里默认初始化页面的时候新增一个rule用于使自己的css生效 } ExpandTool_BarrageSize_insertDom(); ExpandTool_BarrageSize_insertFunc(); initPkg_ExpandTool_BarrageSize_Set(); setBarrageSize(getBarrageSize()); } function ExpandTool_BarrageSize_insertDom() { let a = document.createElement("div"); a.className = "extool__bsize"; a.innerHTML = ''; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function setBarrageSize(s) { let l = document.styleSheets[sheetIndex].rules.length; document.styleSheets[sheetIndex].removeRule(l - 1); document.styleSheets[sheetIndex].addRule(".danmuItem-31f924","font-size:" + s + "px !important;"); } function getAvailableSheet() { let ret = -1; for (let i = 0; i < document.styleSheets.length; i++) { if (document.styleSheets[i].href == null) { ret = i; break; } else { ret = -1; } } return ret; } function getBarrageSize() { return document.getElementById("extool__bsize_value").value; } function ExpandTool_BarrageSize_insertFunc() { document.getElementById("extool__bsize_btn").addEventListener("click", function() { setBarrageSize(getBarrageSize()); saveData_BarrageSize(); }); } function saveData_BarrageSize() { let data = { size: getBarrageSize() } localStorage.setItem("ExSave_BarrageSize", JSON.stringify(data)); // 存储弹幕列表 } function initPkg_ExpandTool_BarrageSize_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_BarrageSize"); if (ret != null) { let retJson = JSON.parse(ret); document.getElementById("extool__bsize_value").value = retJson.size; } } function initPkg_ExpandTool_ClearBag() { ExpandTool_ClearBag_insertDom(); ExpandTool_ClearBag_insertFunc(); } function ExpandTool_ClearBag_insertDom() { let html = ""; html += '礼物id示例
'; html += ''; html += ''; html += ''; html += ''; let a = document.createElement("div"); a.className = "extool__clearbag"; a.innerHTML = html; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_ClearBag_insertFunc() { document.getElementById("extool__clearbag_sendbtn").addEventListener("click", async function() { if (confirm("确认送出?") != true) { return; } let id = document.getElementById("extool__clearbag_id").value; let n = Number(document.getElementById("extool__clearbag_cnt").value); showMessage("【背包送礼】执行中...", "info"); for (let i = 0; i < n; i++) { await sleep(100).then(() => { sendGift_bag(id, 1, rid).then(data => { if (data.msg != "success") { showMessage("【背包送礼】" + rid + "赠送失败 " + data.msg, "error"); console.log(rid, data); } }).catch(err => { showMessage("【背包送礼】" + rid + "赠送失败", "error"); console.log(rid, err); }) }) } showMessage("【背包送礼】执行完毕!", "success"); }); document.getElementById("extool__clearbag_clearbtn").addEventListener("click", function() { if (confirm("确认清空?") != true) { return; } showMessage("【清空背包】执行中...", "info"); getBagGifts(rid, (ret) => { clearBagGifts(ret, rid); }) }); document.getElementById("extool__clearbag_showid").addEventListener("click", function() { getBagGifts(rid, (ret) => { let chunkNum = ret.data.list.length; if (chunkNum > 0) { for (let i = 0; i < chunkNum; i++) { let gift_id = ret.data.list[i].id; let gift_name = ret.data.list[i].name; console.log("【" + gift_name + "】 id:" + gift_id); } showMessage("请按F12到控制台(console)查看背包礼物id", "success"); } else { showMessage("背包礼物为空", "error"); } }); }); } function getBagGifts(room_id, callback) { // 获取背包内所有礼物信息(json),传给回调函数 fetch('https://www.douyu.com/japi/prop/backpack/web/v1?rid=' + room_id, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type':'application/x-www-form-urlencoded'}, }).then(result => { return result.json(); }).then(ret => { callback(ret); }).catch(err => { console.log("请求失败!", err) }) } async function clearBagGifts(bagGiftsJson, room_id) { // 赠送背包内所有的礼物 let chunkNum = bagGiftsJson.data.list.length; if (chunkNum > 0) { for (let i = 0; i < chunkNum; i++) { let gift_id = bagGiftsJson.data.list[i].id; let gift_cnt = bagGiftsJson.data.list[i].count; if (Object.keys(bagGiftsJson.data.list[i].batchInfo).length > 0) { await sleep(100).then(() => { sendGift_bag(gift_id, gift_cnt, room_id); }) } else { for (let j = 0; j < gift_cnt; j++) { await sleep(100).then(() => { sendGift_bag(gift_id, 1, room_id); }) } } } showMessage("【清空背包】执行完毕!", "success"); } else { showMessage("背包礼物为空", "error"); } } let redpackets_room_arr = []; let redpacket_room_timer; // 时钟句柄 function initPkg_ExpandTool_RedPacket_Room() { ExpandTool_RedPacket_Room_insertDom(); ExpandTool_RedPacket_Room_insertFunc(); ExpandTool_RedPacket_Room_Set(); } function ExpandTool_RedPacket_Room_insertDom() { let html = ""; html += ''; let a = document.createElement("div"); a.className = "extool__redpacket_room"; a.innerHTML = html; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_RedPacket_Room_insertFunc() { document.getElementById("extool__redpacekt_room_start").addEventListener("click", function() { verifyFans("5189167", 3).then(r => { if (r == true) { let ischecked = document.getElementById("extool__redpacekt_room_start").checked; if (ischecked == true) { // 开始自动抢红包 redpacket_room_timer = setInterval(() => { getRoomRedPacketsList(rid); }, 1100); } else{ // 停止自动抢红包 clearInterval(redpacket_room_timer); } saveData_RedPacket_Room(); } else { document.getElementById("extool__redpacekt_room_start").checked = false; showMessage("本功能需拥有3级歆崽粉丝牌(5189167)才可使用", "error"); } }) }); } function getRoomRedPacketsList(room_id) { fetch("https://www.douyu.com/japi/interactnc/web/propredpacket/getPrpList?type_id=1&room_id=" + room_id, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then(res => { return res.json(); }).then(ret => { if (ret.data.list.length > 0) { for (let i = 0; i < ret.data.list.length; i++) { let rpid = ret.data.list[i].activityid; let offset = redpackets_room_arr.indexOf(rpid); let startTime = ret.data.list[i].startTime; let to = Number(startTime) - Math.round(new Date().getTime()/1000); to = 1000 * to - 2000; if (offset == -1) { redpackets_room_arr.push(ret.data.list[i].activityid); if (to > 0) { setTimeout(() => { getRoomRedPacket(rpid); getRoomRedPacket(rpid); getRoomRedPacket(rpid); showMessage("【礼物红包】抢红包执行完毕!", "success"); }, to); } else { getRoomRedPacket(rpid); getRoomRedPacket(rpid); getRoomRedPacket(rpid); showMessage("【礼物红包】抢红包执行完毕!", "success"); } } } } }).catch(err => { console.log("请求失败!", err); }) } function getRoomRedPacket(rpid) { fetch("https://www.douyu.com/japi/interactnc/web/propredpacket/grab_prp", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'activityid=' + rpid + '&ctn=' + getCCN() }).then(res => { return res.json(); }).then((ret) =>{ if (ret.data.isSuc == 2) { getRoomRedPacket(rpid); } }) } function saveData_RedPacket_Room() { let isGetRedPacket = document.getElementById("extool__redpacekt_room_start").checked; let data = { isGetRedPacket: isGetRedPacket } localStorage.setItem("ExSave_RedPacket_Room", JSON.stringify(data)); // 存储弹幕列表 } function ExpandTool_RedPacket_Room_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_RedPacket_Room"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isGetRedPacket == true) { verifyFans("5189167", 3).then(r => { if (r == true) { document.getElementById("extool__redpacekt_room_start").click(); } else { let data = { isGetRedPacket: false } localStorage.setItem("ExSave_RedPacket_Room", JSON.stringify(data)); // 存储弹幕列表 showMessage("本功能需拥有3级歆崽粉丝牌(5189167)才可使用", "error"); } }) } } } function initPkg_ExpandTool_SendGift() { ExpandTool_SendGift_insertDom(); ExpandTool_SendGift_insertFunc(); } function ExpandTool_SendGift_insertDom() { let html = ""; html += '礼物id示例
'; html += ''; html += ''; html += ''; let a = document.createElement("div"); a.className = "extool__sendgift"; a.innerHTML = html; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_SendGift_insertFunc() { document.getElementById("extool__sendgift_btn").addEventListener("click", function() { if (confirm("确认送出?") != true) { return; } let gid = document.getElementById("extool__sendgift_id").value; let gcnt = document.getElementById("extool__sendgift_cnt").value; let t_num = 0; let t_price = 0; for (let i = 0; i < Number(gcnt); i++) { sendGift_any(gid, 1, rid).then(ret => { if (ret.data != null) { if (ret.msg != "鱼翅不足") { t_num = t_num + 1; t_price = t_price + Number(ret.data.priceType); } else { console.log("【送礼】" + gid + ret.msg); } } else { console.log("【送礼】" + gid + ret.msg); } if (i == Number(gcnt) - 1) { showMessage("【送礼】赠送完毕!详细信息可以在F12控制台查看", "success"); console.log("【送礼】赠送完毕!详细信息可以在F12控制台查看"); } }).catch(err => { console.log("请求失败!", err); }) } showMessage("【送礼】执行中...", "info"); }); } function sendGift_any(gid, count, rid) { // 送任意东西 // gid: 268是荧光棒 // count: 数量 // rid: 房间号 return fetch("https://www.douyu.com/japi/gift/donate/mainsite/v1", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'giftId=' + gid + '&giftCount=' + count + '&roomId=' + rid + '&bizExt=%7B%22yzxq%22%3A%7B%7D%7D' }).then(res => { return res.json(); }) } function initPkg_ExPanel() { pkg_ExPanel_insertDom(); } function pkg_ExPanel_insertDom() { let a = document.createElement("div"); a.className = "ex-panel"; a.innerHTML = '
'; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_FansContinue() { initPkg_FansContinue_Dom(); initPkg_FansContinue_Func(); } function initPkg_FansContinue_Dom() { FansContinue_insertIcon(); } function FansContinue_insertIcon() { let a = document.createElement("div"); a.className = "fans-continue"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_FansContinue_Func() { document.getElementsByClassName("fans-continue")[0].addEventListener("click", function() { fetch('https://www.douyu.com/member/cp/getFansBadgeList',{ method: 'GET', mode: 'no-cors', cache: 'default', credentials: 'include', }).then(res => { return res.text(); }).then(async (doc) => { 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"); // 获取房间号 await sleep(200).then(() => { sendGift_bag(268, 1, rid).then(data => { if (data.msg == "success") { showMessage("【续牌】" + rid + "赠送一根荧光棒成功", "success"); // console.log(rid + "赠送一根荧光棒成功"); } else { showMessage("【续牌】" + rid + "赠送失败 " + data.msg, "error"); // console.log(rid + "赠送失败"); console.log(rid, data); } }).catch(err => { showMessage("【续牌】" + rid + "赠送失败", "error"); console.log(rid, err); }) }); } }).catch(err => { console.log("请求失败!", err); }) }); } function sendGift_bag(gid, count, rid) { // 送背包里的东西 // gid: 268是荧光棒 // count: 数量 // rid: 房间号 return fetch("https://www.douyu.com/japi/prop/donate/mainsite/v1", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'propId=' + gid + '&propCount=' + count + '&roomId=' + rid + '&bizExt=%7B%22yzxq%22%3A%7B%7D%7D' }).then(res => { return res.json(); }) } function initPkg_FishFood() { initPkg_FishFood_Dom(); initPkg_FishFood_Func(); } function initPkg_FishFood_Dom() { FishFood_insertIcon(); } function FishFood_insertIcon() { let a = document.createElement("div"); a.className = "fish-food"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_FishFood_Func() { document.getElementsByClassName("fish-food")[0].addEventListener("click", function() { fetch("https://www.douyu.com/japi/activepointnc/api/getActivePointInfo", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'} }).then(res => { return res.json(); }).then(async (ret) =>{ let cnt = Math.floor(Number(ret.data.userActivePoint) / Number(ret.data.onceLotteryActivePoint)); if (cnt == 0) { showMessage("【寻宝】" + "鱼粮不足", "warning"); return; } cnt = Number(ret.data.dailyMaxLotteryTimes) - Number(ret.data.usedLotteryCount); if (cnt == 0) { showMessage("【寻宝】" + "今日寻宝次数已到达上限", "warning"); return; } for (let i = 0; i < cnt; i++) { await sleep(1300).then(() => { fetch("https://www.douyu.com/japi/activepointnc/api/dolottery", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'rid=' + rid + '&ctn=' + getCCN() }).then(res => { return res.json(); }).then(ret => { if (ret.data != null) { if (Object.keys(ret.data).length != 0) { showMessage("【寻宝】" + ret.data.msg, "success"); } } else { showMessage("【寻宝】" + ret.msg, "warning"); } // console.log("【寻宝】" + ret.data.msg); }).catch(err => { console.log("请求失败!", err); }) }) } }) }) } function initPkg_FishPond() { initPkg_FishPond_Dom(); initPkg_FishPond_Func(); } function initPkg_FishPond_Timer() { // 这里挂载每个子模块的时钟周期函数 initPkg_FishPond_Bubble_Timer(); initPkg_FishPond_Box_Timer(); initPkg_FishPond_Task_Timer(); } function initPkg_FishPond_Func() { document.getElementsByClassName("fish-pond")[0].addEventListener("click", function() { // 这里挂载每个子模块的函数入口 // 入口即为调用 // 调用的是每个子模块的领取接口 initPkg_FishPond_Bubble(); initPkg_FishPond_Box(); initPkg_FishPond_Task(); }) } function initPkg_FishPond_Dom() { FishPond_insertIcon(); } function FishPond_insertIcon() { let a = document.createElement("div"); a.className = "fish-pond"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function FishPond_showTip(a) { let d = document.getElementById("fish-pond__tip"); if (a == true) { if (d.style.display != "block") { showMessage("【鱼粮】有鱼粮可以领取啦!", "info"); d.style.display = "block"; } } else { d.style.display = "none"; } } var boxList = []; function initPkg_FishPond_Box() { getFishPond_Box(); } function initPkg_FishPond_Box_Timer() { getFishPond_BoxList(); } function getFishPond_Box() { // 清空boxList内的气泡 if (boxList.length == 0) { showMessage("【鱼塘宝箱】暂无可领取的鱼粮", "info"); return; } let arr = boxList.concat(); for (let i = 0; i < arr.length; i++) { GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/japi/tasksys/ytxb/getPrize", data: "id=" + arr[i] + "&token=" + dyToken, responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, onload: function(response) { showMessage("【鱼塘宝箱】" + response.response.data.msg, "success"); // console.log("【鱼塘宝箱】" , response.response.msg, response.response); } }); } FishPond_showTip(false); boxList.length = 0; } function getFishPond_BoxList() { // 获取可领取的鱼粮,如果有,就显示小红点 GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/japi/tasksys/ytxb/box", data: 'token=' + dyToken, responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, onload: function(response) { boxList.length = 0; for (let i = 0; i < response.response.data.length; i++) { if (response.response.data[i] != null) { if (response.response.data[i].status == "2") { FishPond_showTip(true); boxList.push(response.response.data[i].id); } } } } }); } var bubbleList = []; function initPkg_FishPond_Bubble() { getFishPond_Bubble(); } function initPkg_FishPond_Bubble_Timer() { getFishPond_BubbleList(); } function getFishPond_Bubble() { // 清空bubbleList内的气泡 if (bubbleList.length == 0) { showMessage("【鱼塘气泡】暂无可领取的鱼粮", "info"); return; } let bubbleToGet = ""; for (let i = 0; i < bubbleList.length; i++) { if (i != bubbleList.length - 1) { bubbleToGet = bubbleToGet + bubbleList[i] + "%2C"; } else { bubbleToGet = bubbleToGet + bubbleList[i]; } } fetch('https://www.douyu.com/japi/tasksys/ytxb/batchGetPrize',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'ids=' + bubbleToGet + '&rid=' + rid }).then(res => { return res.json(); }).then(ret => { let result = ""; for (let i = 0; i < ret.data.length; i++) { result = result + ret.data[i].num + "个" + ret.data[i].name + ","; } bubbleList.length = 0; // 此处领取完毕,小红点也要去掉 FishPond_showTip(false); showMessage("【鱼塘气泡】领取结果:" + result, "success"); // console.log("【鱼塘气泡】领取结果:" + result, ret); }).catch(err => { console.log("请求失败!", err); }) } function getFishPond_BubbleList() { // 获取可领取的鱼粮,如果有,就显示小红点 fetch('https://www.douyu.com/japi/tasksys/ytxb/bubble',{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { bubbleList.length = 0; for (let i = 0; i < ret.data.list.length; i++) { if (ret.data.list[i] != null) { if (ret.data.list[i].status == "2") { bubbleList.push(ret.data.list[i].id); FishPond_showTip(true); } } } }).catch(err => { console.log("请求失败!", err); }) } var taskList = []; function initPkg_FishPond_Task() { getFishPond_Task(); } function initPkg_FishPond_Task_Timer() { getFishPond_TaskList(); } function getFishPond_Task() { fetch('https://www.douyu.com/japi/tasksys/ytxb/batchGetPrize',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'ids=1182%2C1183%2C1184%2C1185%2C1186' + '&rid=' + rid }).then(res => { return res.json(); }).then(ret => { for (let i = 0; i < ret.data.length; i++) { showMessage("【鱼塘任务】领取结果:成功领取" + ret.data[i].name + ret.data[i].num + "个", "success"); } }).catch(err => { console.log("请求失败!", err); }) if (taskList.length == 0) { showMessage("【鱼塘任务】暂无可领取的鱼粮", "info"); return; } let arr = taskList.concat(); for (let i = 0; i < arr.length; i++) { fetch('https://www.douyu.com/japi/tasksys/ytxb/getPrize',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'id=' + arr[i] + '&roomId=' + rid }).then(res => { return res.json(); }).then(ret => { // console.log("【鱼塘任务】领取结果:", ret); showMessage("【鱼塘任务】领取结果:" + ret.data.msg, "success"); }).catch(err => { console.log("请求失败!", err); }) } taskList.length = 0; FishPond_showTip(false); } function getFishPond_TaskList() { // 获取可领取的鱼粮,如果有,就显示小红点 taskList.length = 0; getFishPond_TaskList_Day(); getFishPond_TaskList_Week(); getFishPond_TaskList_Ytzb(); // getFishPond_TaskList_Client(); } function getFishPond_TaskList_Day() { fetch('https://www.douyu.com/japi/tasksys/ytxb/userStatusV2?cycleType=1&roomId=' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { for (let i = 0; i < ret.data.list.length; i++) { if (ret.data.list[i].status == "2") { FishPond_showTip(true); taskList.push(ret.data.list[i].id); } } }).catch(err => { console.log("请求失败!", err); }) } function getFishPond_TaskList_Week() { fetch('https://www.douyu.com/japi/tasksys/ytxb/userStatusV2?cycleType=2&roomId=' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { for (let i = 0; i < ret.data.list.length; i++) { if (ret.data.list[i].status == "2") { FishPond_showTip(true); taskList.push(ret.data.list[i].id); } } }).catch(err => { console.log("请求失败!", err); }) } function getFishPond_TaskList_Ytzb() { fetch('https://www.douyu.com/japi/tasksys/ytxb/userStatusV2?cycleType=25&roomId=' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { for (let i = 0; i < ret.data.list.length; i++) { if (ret.data.list[i].status == "2") { FishPond_showTip(true); taskList.push(ret.data.list[i].id); } } }).catch(err => { console.log("请求失败!", err); }) } // function getFishPond_TaskList_Client() { // console.log("哦嚯嚯",dyToken); // GM_xmlhttpRequest({ // method: "POST", // url: "https://pcapi.douyucdn.cn/japi/tasksys/ytxb/userStatusV2", // data: "cycleType=26&roomId=" + rid + "&tagId=1&token=" + dyToken, // responseType: "json", // headers: { // 'Content-Type': 'application/x-www-form-urlencoded' // }, // onload: function(response) { // let ret = response.response; // console.log("哈哈哈哈:",ret); // for (let i = 0; i < ret.data.list.length; i++) { // if (ret.data.list[i].status == "2") { // FishPond_showTip(true); // taskList.push(ret.data.list[i].id); // } // } // } // }); // } let videoPlayerArr = []; function initPkg_PopupPlayer() { initPkg_PopupPlayer_Dom(); initPkg_PopupPlayer_Func(); } function initPkg_PopupPlayer_Dom() { PopupPlayer_insertIcon(); PopupPlayer_insertPrompt(); } function PopupPlayer_insertIcon() { let a = document.createElement("div"); a.className = "popup-player"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function PopupPlayer_insertPrompt() { let a = document.createElement("div"); let html = ""; a.className = "postbird-box-container"; a.id = "popup-player__prompt" html += '
'; html += '
'; 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 += "
" + "斗鱼 - " + rid + ""; html += ""; html += ""; html += "无视频?"; html += "
X
"; 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 += "
" + "Bilibili - " + rid + ""; html += ""; html += ""; html += "
X
" 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 += "
" + "Huya - " + rname + ""; html += ""; html += ""; html += "
X
" 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(); }) } 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) => { // console.log("挑战6666",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_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.11.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;i16)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); } }); }