"use strict"; // ==UserScript== // @name DouyuEx-斗鱼直播间增强插件 // @namespace https://github.com/qianjiachun // @icon data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTA4cHgiIGhlaWdodD0iMTA4cHgiIHZpZXdCb3g9IjAgMCAxMDggMTA4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPueyvueBteeQgzwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnsr7ngbXnkIMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODMwNzY5LCAwLjgzMDc2OSkiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01My4xNjkyMzA3LDEwNi4zMzg0NjEgQzIzLjgyNzY5MjIsMTA2LjMzODQ2MSAwLDgyLjUxMDc2OTIgMCw1My4xNjkyMzA3IEMwLDUxLjAwMzA3NjkgMS43NzIzMDc3NSw0OS4yMzA3NjkyIDMuOTM4NDYxNSw0OS4yMzA3NjkyIEwzMy40NzY5MjMsNDkuMjMwNzY5MiBDMzUuNjQzMDc2OSw0OS4yMzA3NjkyIDM3LjQxNTM4NDUsNTEuMDAzMDc3IDM3LjQxNTM4NDYsNTMuMTY5MjMwNyBDMzcuNDE1Mzg0Niw2MS44MzM4NDYxIDQ0LjUwNDYxNTQsNjguOTIzMDc2OSA1My4xNjkyMzA3LDY4LjkyMzA3NjkgQzYxLjgzMzg0NjEsNjguOTIzMDc2OSA2OC45MjMwNzY5LDYxLjgzMzg0NjEgNjguOTIzMDc2OSw1My4xNjkyMzA3IEM2OC45MjMwNzY5LDUxLjAwMzA3NjkgNzAuNjk1Mzg0Niw0OS4yMzA3NjkyIDcyLjg2MTUzODUsNDkuMjMwNzY5MiBMMTAyLjQsNDkuMjMwNzY5MiBDMTA0LjU2NjE1NCw0OS4yMzA3NjkyIDEwNi4zMzg0NjEsNTEuMDAzMDc3IDEwNi4zMzg0NjEsNTMuMTY5MjMwNyBDMTA2LjMzODQ2MSw4Mi41MTA3NjkyIDgyLjUxMDc2OTIsMTA2LjMzODQ2MSA1My4xNjkyMzA3LDEwNi4zMzg0NjEgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iIzMzMzYzQSI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNOC4wNzM4NDYxMiw1Ny4xMDc2OTIyIEMxMC4wNDMwNzY5LDgwLjI0NjE1MzcgMjkuNTM4NDYxNSw5OC40NjE1Mzg1IDUzLjE2OTIzMDcsOTguNDYxNTM4NSBDNzYuOCw5OC40NjE1Mzg1IDk2LjI5NTM4NDYsODAuMjQ2MTUzOSA5OC4yNjQ2MTU0LDU3LjEwNzY5MjIgTDc2LjUwNDYxNTQsNTcuMTA3NjkyMiBDNzQuNjMzODQ2MSw2OC4yMzM4NDYxIDY0Ljg4NjE1MzksNzYuOCA1My4xNjkyMzA3LDc2LjggQzQxLjQ1MjMwNzYsNzYuOCAzMS43MDQ2MTU0LDY4LjIzMzg0NjEgMjkuODMzODQ2MSw1Ny4xMDc2OTIyIEw4LjA3Mzg0NjEyLDU3LjEwNzY5MjIgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNTMuMTY5MjMwOCwzLjkzODQ2MTUgQzI1Ljk5Mzg0NjEsMy45Mzg0NjE1IDMuOTM4NDYxNSwyNS45OTM4NDYxIDMuOTM4NDYxNSw1My4xNjkyMzA3IEwzMy40NzY5MjMsNTMuMTY5MjMwNyBDMzMuNDc2OTIzLDQyLjMzODQ2MTUgNDIuMzM4NDYxNSwzMy40NzY5MjMgNTMuMTY5MjMwOCwzMy40NzY5MjMgQzY0LDMzLjQ3NjkyMyA3Mi44NjE1Mzg1LDQyLjMzODQ2MTUgNzIuODYxNTM4NSw1My4xNjkyMzA3IEwxMDIuNCw1My4xNjkyMzA3IEMxMDIuNCwyNS45OTM4NDYxIDgwLjM0NDYxNTQsMy45Mzg0NjE1IDUzLjE2OTIzMDgsMy45Mzg0NjE1IFoiIGlkPSLot6/lvoQiIGZpbGw9IiNENjA5MDkiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTEwMi40LDU3LjEwNzY5MjIgTDcyLjg2MTUzODUsNTcuMTA3NjkyMiBDNzAuNjk1Mzg0Niw1Ny4xMDc2OTIyIDY4LjkyMzA3Nyw1NS4zMzUzODQ1IDY4LjkyMzA3NjksNTMuMTY5MjMwNyBDNjguOTIzMDc2OSw0NC41MDQ2MTU0IDYxLjgzMzg0NjEsMzcuNDE1Mzg0NiA1My4xNjkyMzA3LDM3LjQxNTM4NDYgQzQ0LjUwNDYxNTQsMzcuNDE1Mzg0NiAzNy40MTUzODQ2LDQ0LjUwNDYxNTQgMzcuNDE1Mzg0Niw1My4xNjkyMzA3IEMzNy40MTUzODQ2LDU1LjMzNTM4NDYgMzUuNjQzMDc2OSw1Ny4xMDc2OTIyIDMzLjQ3NjkyMyw1Ny4xMDc2OTIyIEwzLjkzODQ2MTUsNTcuMTA3NjkyMiBDMS43NzIzMDc2Miw1Ny4xMDc2OTIyIDAsNTUuMzM1Mzg0NSAwLDUzLjE2OTIzMDcgQzAsMjMuODI3NjkyMiAyMy44Mjc2OTIzLDAgNTMuMTY5MjMwNywwIEM4Mi41MTA3NjkyLDAgMTA2LjMzODQ2MSwyMy44Mjc2OTIyIDEwNi4zMzg0NjEsNTMuMTY5MjMwNyBDMTA2LjMzODQ2MSw1NS4zMzUzODQ2IDEwNC41NjYxNTQsNTcuMTA3NjkyMiAxMDIuNCw1Ny4xMDc2OTIyIFoiIGlkPSLot6/lvoQiIGZpbGw9IiMzMzM2M0EiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTc2LjUwNDYxNTQsNDkuMjMwNzY5MyBMOTguMzYzMDc2OSw0OS4yMzA3NjkzIEM5Ni4yOTUzODQ2LDI2LjA5MjMwNzYgNzYuOCw3Ljg3NjkyMyA1My4xNjkyMzA3LDcuODc2OTIzIEMyOS41Mzg0NjE1LDcuODc2OTIzIDEwLjA0MzA3NjksMjYuMDkyMzA3NiA4LjA3Mzg0NjEyLDQ5LjIzMDc2OTMgTDI5LjkzMjMwNzYsNDkuMjMwNzY5MyBDMzEuNzA0NjE1NCwzOC4xMDQ2MTU0IDQxLjQ1MjMwNzYsMjkuNTM4NDYxNSA1My4xNjkyMzA3LDI5LjUzODQ2MTUgQzY0Ljg4NjE1MzksMjkuNTM4NDYxNSA3NC42MzM4NDYxLDM4LjEwNDYxNTQgNzYuNTA0NjE1NCw0OS4yMzA3NjkzIEw3Ni41MDQ2MTU0LDQ5LjIzMDc2OTMgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0Q2MDkwOSI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNTMuMTY5MjMwNyw3Ni44IEM0MC4xNzIzMDc2LDc2LjggMjkuNTM4NDYxNSw2Ni4xNjYxNTM5IDI5LjUzODQ2MTUsNTMuMTY5MjMwNyBDMjkuNTM4NDYxNSw0MC4xNzIzMDc2IDQwLjE3MjMwNzYsMjkuNTM4NDYxNSA1My4xNjkyMzA3LDI5LjUzODQ2MTUgQzY2LjE2NjE1MzksMjkuNTM4NDYxNSA3Ni44LDQwLjE3MjMwNzYgNzYuOCw1My4xNjkyMzA3IEM3Ni44LDY2LjE2NjE1MzkgNjYuMTY2MTUzOSw3Ni44IDUzLjE2OTIzMDcsNzYuOCBaIiBpZD0i6Lev5b6EIiBmaWxsPSIjMzMzNjNBIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01My4xNjkyMzA3LDM3LjQxNTM4NDYgQzQ0LjUwNDYxNTQsMzcuNDE1Mzg0NiAzNy40MTUzODQ2LDQ0LjUwNDYxNTQgMzcuNDE1Mzg0Niw1My4xNjkyMzA3IEMzNy40MTUzODQ2LDYxLjgzMzg0NjEgNDQuNTA0NjE1NCw2OC45MjMwNzY5IDUzLjE2OTIzMDcsNjguOTIzMDc2OSBDNjEuODMzODQ2MSw2OC45MjMwNzY5IDY4LjkyMzA3NjksNjEuODMzODQ2MSA2OC45MjMwNzY5LDUzLjE2OTIzMDcgQzY4LjkyMzA3NjksNDQuNTA0NjE1NCA2MS44MzM4NDYxLDM3LjQxNTM4NDYgNTMuMTY5MjMwNywzNy40MTUzODQ2IEw1My4xNjkyMzA3LDM3LjQxNTM4NDYgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNDMuMzIzMDc2OSw1My4xNjkyMzA3IEM0My4zMjMwNzY5LDU4LjYwNzExMTQgNDcuNzMxMzUwMSw2My4wMTUzODQ2IDUzLjE2OTIzMDcsNjMuMDE1Mzg0NiBDNTguNjA3MTExNCw2My4wMTUzODQ2IDYzLjAxNTM4NDYsNTguNjA3MTExNCA2My4wMTUzODQ2LDUzLjE2OTIzMDcgQzYzLjAxNTM4NDYsNDcuNzMxMzUwMSA1OC42MDcxMTE0LDQzLjMyMzA3NjkgNTMuMTY5MjMwNyw0My4zMjMwNzY5IEM0Ny43MzEzNTAxLDQzLjMyMzA3NjkgNDMuMzIzMDc2OSw0Ny43MzEzNTAxIDQzLjMyMzA3NjksNTMuMTY5MjMwNyBaIiBpZD0i6Lev5b6EIiBmaWxsPSIjMzMzNjNBIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4= // @version 2023.08.31.02 // @description 弹幕自动变色防检测循环发送 一键续牌 查看真实人数/查看主播数据 已播时长 一键签到(直播间/车队/鱼吧/客户端) 一键领取鱼粮(宝箱/气泡/任务) 一键寻宝 送出指定数量的礼物 一键清空背包 屏蔽广告 调节弹幕大小 自动更新 同屏画中画/多直播间小窗观看/可在斗鱼看多个平台直播(虎牙/b站) 获取真实直播流地址 自动抢礼物红包 背包信息扩展 简洁模式 夜间模式 开播提醒 幻神模式 关键词回复 关键词禁言 自动谢礼物 自动抢宝箱 弹幕右键信息扩展 防止下播自动跳转 影院模式 直播时间流控制 弹幕投票 直播滤镜 直播音频流 账号多开/切换 显示粉丝牌获取日期 月消费数据显示 弹幕时速 相机截图录制gif 全景播放器 斗鱼视频下载/弹幕ass下载 直播画面局部缩放 全站抽奖信息 直播音效增强 阻止P2P上传 显示贡献榜贡献值 恢复弹幕显示 斗鱼视频弹幕高能进度条 // @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 *://www.douyu.com/member/cp/getFansBadgeList // @match *://passport.douyu.com/* // @match *://msg.douyu.com/* // @match *://yuba.douyu.com/* // @match *://v.douyu.com/* // @match *://cz.douyu.com/* // @require https://lib.baomitu.com/flv.js/1.6.2/flv.min.js // @require https://fastly.jsdelivr.net/npm/svgaplayerweb@2.3.1/build/svga.min.js // @require https://lib.baomitu.com/gif.js/0.2.0/gif.js // @require https://lib.baomitu.com/three.js/80/three.min.js // @require https://lib.baomitu.com/xlsx/0.16.4/xlsx.full.min.js // @grant GM_openInTab // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_cookie // @grant GM_registerMenuCommand // @grant unsafeWindow // @connect douyucdn.cn // @connect douyu.com // @connect 122.51.5.63 // @connect qq.com // @connect rrocr.com // @connect douyuex.com // @connect bojianger.com // @connect greasyfork.org // @connect bilibili.com // @connect huya.com // @connect jsdelivr.net // @connect shadiao.app // @connect fz996.com // @connect toubang.tv // @connect doseeing.com // @antifeature tracking // @downloadURL none // ==/UserScript== function init() { initPkg_Night_Set_Fast(); initPkg_ShowDanmaku(); initKillP2P(); removeAD(); initPkg_Statistics(); initPkg_Console(); initPkg_Menu(); initPkg_FollowList(); } function initPkg() { Update_checkVersion(); initPkg_Night(); initPkg_ExIcon(); initPkg_ExPanel(); initPkg_RealAudience(); initPkg_CopyRealLive(); initPkg_AudioLine(); initPkg_RemoveAD(); initPkg_BagInfo(); initPkg_Update(); initPkg_Monitor(); initPkg_Lottery(); // initPkg_MiniProgram(); initPkg_PopupPlayer(); initPkg_LiveTool(); initPkg_VideoTools(); initPkg_ExpandTool(); initPkg_Refresh(); initPkg_BarrageLoop(); initPkg_FansContinue(); // initPkg_FishFood(); initPkg_Sign(); initPkg_BarragePanel(); initPkg_AdVideo(); initPkg_AccountList(); initPkg_ChatTools(); initPkg_MonthCost(); initPkg_TabSwitch(); initPkg_WeeklyPanel(); } function initPkg_Timer() { // initPkg_FishPond_Timer(); initPkg_DisableCloseJump_Timer(); initPkg_LevelTask_Timer(); } function initTimer() { initPkg_Timer(); exTimer = setInterval(initPkg_Timer, 35000); } function initStyles() { let style = document.createElement("style"); style.appendChild(document.createTextNode(`#ex-accountList-wrap { left: -152px; top: -16px; /* max-height: 330px; overflow-y: scroll; scrollbar-width: none; -ms-overflow-style: none; */ -webkit-transition: all .2s cubic-bezier(.22,.58,.12,.98); -o-transition: all cubic-bezier(.22,.58,.12,.98) .2s; -moz-transition: all cubic-bezier(.22,.58,.12,.98) .2s; transition: all .2s cubic-bezier(.22,.58,.12,.98); -webkit-transform-origin: 80% 0; -moz-transform-origin: 80% 0; -ms-transform-origin: 80% 0; -o-transform-origin: 80% 0; transform-origin: 80% 0; -webkit-animation: scale-in-ease .5s cubic-bezier(.22,.58,.12,.98); -moz-animation: scale-in-ease cubic-bezier(.22,.58,.12,.98) .5s; -o-animation: scale-in-ease cubic-bezier(.22,.58,.12,.98) .5s; animation: scale-in-ease .5s cubic-bezier(.22,.58,.12,.98);}/* #ex-accountList-wrap::-webkit-scrollbar { display: none;} */.ex-accountList-item { padding: 10px; display: flex; border-radius: 10px; align-items: center;}.ex-accountList-item:hover { background-color: rgb(244,244,244);}#ex-accountList-iframe { display: none;}#ex-accountList-iframe2 { display: none;}#ex-accountList-item-add { padding: 10px; text-align: center; margin-bottom:0px; border-radius: 10px;}#ex-accountList-item-add:hover { background-color: rgb(244,244,244);}.ex-accountList-item__imgWrap { flex: 0 0 25%;}.ex-accountList-item__img { width: 50px; height: 50px; border-radius: 50%;}.ex-accountList-item__name { line-height: 50px; flex: 0 0 55%;}.ex-accountList-item__btn { height: 30px; width: 50px; border-radius: 10px; align-items: center; flex: auto; text-align: center; line-height: 28px; color: white; background-color: rgb(245,108,108);}.ex-accountList-item__btn:hover { background-color: rgb(247,137,137);}#ex-accountList-icon:hover > #ex-accountList-wrap { display: block;}#ex-audio-line { cursor: pointer;}.bag-info { position: absolute; background-color: rgba(0, 0, 0, 0.6); color: white; width: 20px; font-weight: 800; height: 20px; text-align: center;}.bag-button { color: rgb(255, 255, 255); text-align: center; height: 15px; line-height: 15px; cursor: pointer; margin-left: 5px; background: rgb(70, 171, 255); border-radius: 9px; padding: 0px 10px; right: 20px;}.bloop { background-color: rgba(255,255,255,0.9); width: 100%; height: 200px; position: relative; bottom: 200px; display: none; z-index: 1015;}.bloop__switch { position: absolute; right: 0; bottom: 0;}.bloop__mode { display: inline-block;}#bloop__select { width: 150px;}.barragePanel__funcPanel { position: absolute; width: 232px; height: 270px; display: block; background: white; overflow-y: scroll;}.barragePanel__funcPanel::-webkit-scrollbar {display:none}.barragePanel__muteTime { position: absolute; left: 25px; top: 123px; z-index: 5;}#copy-real-live { cursor: pointer;}.ex-icon { display: inline-block; vertical-align: middle; margin-right: 8px; -moz-user-select:none; /*火狐*/ -webkit-user-select:none; /*webkit浏览器*/ -ms-user-select:none; /*IE10*/ -khtml-user-select:none; /*早期浏览器*/ user-select:none;}.extool { background-color: rgba(255,255,255,0.9); width: 100%; height: 200px; position: relative; bottom: 200px; display: none; z-index: 1015;}.extool__switch { position: absolute; right: 0; bottom: 0;}.extool__bsize,.extool__sendgift { margin-bottom: 5px;}.extool__redpacket_room,.extool__gold { display: inline-block;}.ex_giftAnimation { width: 100%; height: 100%; position: absolute; z-index: 50; pointer-events: none;}.ex-panel { position: absolute; bottom: 32px; right: 36px; background-color: rgba(255,255,255,0.9); display: none; border: 2px rgb(234,173,26) solid; z-index: 1015; user-select: none;}.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; transition: 0.5s;}.ex-panel__icon:hover { transform: scale(1.15);}.ex-panel__tip { display:none; background:#f00; border-radius:50%; width:8px; height:8px; top:0px; right:0px; position:absolute;}#refreshFollowList { color: grey;position: absolute;right: 5px;top:0px;cursor: default;}.barrageSpeed { position: absolute; right: 10px; top: -20px; color: rgba(0,0,0,0.5); cursor: default; z-index: 0;}.enter__panel { width: 100%; display: none; margin-top: 4px;}#enter__title { cursor: pointer; user-select: none;}#enter__select { width: 190px;}.enter__option { margin-top: 5px;}#enter__enterId { width: 40px;}#enter__reply { width: 150px;}#enter__word { width: 140px;}#enter__level { width: 25px; text-align: center;}#enter__export { cursor: pointer; color: royalblue; margin-left: 10px;}#enter__import { cursor: pointer; color: royalblue; margin-left: 5px;}.gift__panel { width: 100%; display: none; margin-top: 4px;}#gift__title { cursor: pointer; user-select: none;}#gift__select { width: 113px;}.gift__option { margin-top: 5px;}#gift__giftId { width: 40px;}#gift__reply { width: 150px;}#gift__export { cursor: pointer; color: royalblue; margin-left: 10px;}#gift__import { cursor: pointer; color: royalblue; margin-left: 5px;}.livetool { background-color: rgba(255,255,255,0.9); width: 100%; height: 290px; position: relative; bottom: 290px; display: none; z-index: 1015;}.livetool__cell { position: relative; display: -webkit-box; display: -webkit-flex; display: flex; box-sizing: border-box; width: 100%; padding: 10px 16px; overflow: hidden; color: #323233; font-size: 14px; line-height: 24px; background-color: #fff; border-bottom: 1px solid rgba(0,0,0,0.2); flex-wrap: wrap; -webkit-flex-wrap: wrap;}.livetool__cell_title { flex: 1; -webkit-box-flex: 1;}.livetool__cell_option { text-align: right;}.livetool__cell_switch { float: right;}.mute__panel { width: 100%; display: none; margin-top: 4px;}#mute__title { cursor: pointer; user-select: none;}#mute__idlist { cursor: pointer; color: royalblue; margin-left: 10px;}#mute__export, #mute__import { cursor: pointer; color: royalblue; margin-left: 5px;}#mute__select { width: 110px;}.mute__option { margin-top: 5px;}#mute__word { width: 70px;}#mute__count { width: 30px;}#mute__time { width: 65px;}.exRankPoint { position: absolute; right: 16px;}.exRankPoint--top { position: absolute; bottom: -12px; right: 0; left: 0;}.reply__panel { width: 100%; display: none; margin-top: 4px;}#reply__title { cursor: pointer; user-select: none;}#reply__select { /* width: 190px; */ width: 100px;}#reply__time { width: 35px;}.reply__option { margin-top: 5px;}#reply__word { width: 70px;}#reply__reply { width: 147px;}#reply__export { cursor: pointer; color: royalblue; margin-left: 10px;}#reply__import { cursor: pointer; color: royalblue; margin-left: 5px;}.livetool__Treasure { width: 100%; position: relative; z-index: 999;}.vote__panel { width: 100%; display: none; margin-top: 4px;}#vote__title { cursor: pointer; user-select: none;}#vote__select { width: 100px;}.vote__option { margin-top: 5px;}#vote__theme { width: 70px;}#vote__options { width: 133px;}#vote__time { width: 35px;}#vote__show-result { cursor: pointer; color: royalblue; margin-left: 10px;}.vote__result { position: absolute; top: 0px; width: 300px; background: rgba(255,255,255,0.85); left: 0px; z-index: 999; padding: 5px; border-radius: 10px; user-select: none; display: none;}#vote__result-theme { font-size: 20px; font-weight: 600; margin-bottom: 10px;}#vote__result-close { position: absolute; top: 5px; right: 10px; font-size: 14px; cursor: pointer; color: gray;}.vote__option-wrap { margin-bottom: 10px;}.vote__option-choice { display: inline-block; font-size: 14px;}.vote__option-num { float: right; font-size: 14px;}.vote__progress { width: 100%; background-color: #ddd; border-radius: 10px;}.vote__progress-bar { width: 0%; height: 14px; background-color: #4CAF50; text-align: center; line-height: 30px; border-radius: 10px;}.exlottery { background-color: rgba(255,255,255,1); width: 100%; height: 250px; position: relative; bottom: 250px; display: none; z-index: 1015; overflow: auto; padding: 0 10px; box-sizing: border-box;}.lottery__nodata { z-index: 998; position: absolute; left:50%; top:50%; transform: translate(-50%, -50%); color: #606266;}.lottery__wrap { display: flex; flex-direction: column; z-index: 999;}.lottery__a:hover .lottery__item { background-color: rgb(244,244,244);}.lottery__item { display: flex; padding: 5px 0; border-bottom: 1px solid #d0d0d0; color: #606266;}.lottery__img img { width: 150px; border-radius: 5px;}.lottery__anchor { position: absolute; background-color: rgba(255,255,255,0.9); border-radius: 5px 0px 5px 0px;}.lottery__info { display: flex; justify-content: space-evenly; flex-direction: column; margin-left: 10px; overflow: hidden;}.lottery__prize { white-space: nowrap; text-overflow: ellipsis; word-break: break-all; font-size: 14px;}.lottery__expireTime { position: absolute; margin-top: -18px; background-color: rgba(255,255,255,0.9); border-radius: 0px 5px 0px 5px;} /*滚动条样式*/.exlottery::-webkit-scrollbar { width: 4px; }.exlottery::-webkit-scrollbar-thumb { border-radius: 10px; box-shadow: inset 0 0 5px rgba(0,0,0,0.2); background: rgba(0,0,0,0.2);}.exlottery::-webkit-scrollbar-track { box-shadow: inset 0 0 5px rgba(0,0,0,0.2); border-radius: 0; background: rgba(0,0,0,0.1);}.lottery__func { display: flex; justify-content: space-between; margin-top: 5px; user-select: none; border-bottom: 1px solid #d0d0d0;}.lottery__notice,#lottery-refresh { cursor: pointer; color: #606266;}.miniprogram__panel { position: absolute; right: 43px; bottom: 100px; animation: move-in 0.75s; z-index: 101; text-align: center; display: none;}.miniprogram__wrap { overflow: hidden; background-color: white; border-radius: 5%; width: 200px; box-shadow: 0px 2px 20px 0px #888888; font-size: 14px;}.miniprogram__triangle { width: 0px; height: 0px; border-color: white transparent transparent transparent; border-style: solid; border-width: 10px; position: absolute; left: 100px;}.month-cost { margin-right: 5px; cursor: default; -moz-user-select:none;/*火狐*/ -webkit-user-select:none;/*webkit浏览器*/ -ms-user-select:none;/*IE10*/ -khtml-user-select:none;/*早期浏览器*/ user-select:none;}.monthcost__icon { position: relative; top: 3px; cursor: pointer; margin-left: 3px;}#ex-point { cursor: pointer; float: left; line-height: 30px; -moz-user-select:none; /*火狐*/ -webkit-user-select:none; /*webkit浏览器*/ -ms-user-select:none; /*IE10*/ -khtml-user-select:none; /*早期浏览器*/ user-select:none;}#point__value { color: #333;}#ex-exchange { position: absolute; left: 0; bottom: 37px; z-index: 100;}.exchange__panel { width: 400px; height: 500px; position: relative;}.exchange__wrap { width: 400px; height: 500px; background-color: white; border-radius: 3%; overflow-y: scroll; overflow-x: hidden; box-shadow: 0px 0px 20px 0px #888888;}.exchange__wrap::-webkit-scrollbar { display:none}.exchange__close { position: absolute; color: rgb(127, 127, 137); right: 10px; top: 5px; font-size: 15px; cursor: pointer; z-index: 101;}.item__wrap { width: 100%; height: 130px; border-bottom: 1px solid rgba(121,127,137,0.4); position: relative;}.item__pic { left: 10px; top: 10px; position: absolute; height: 110px; width: 110px;}.item__name { position: absolute; top: 7px; left: 130px; color: #353536;; font-size: 15px; margin-right: 10px;}.item__description { position: absolute; top: 32px; left: 130px; font-size: 12px; margin-right: 10px; color: #969799;}.item__num { position: absolute; bottom: 27px; left: 130px; font-size: 12px; color: #969799;}.item__price { position: absolute; bottom: 7px; left: 130px; font-size: 14px; color: rgb(255,93,35); font-weight: 600;}.item__exchange { position: absolute; bottom: 8px; right: 10px; font-size: 14px; color: white; text-align: center; width: 80px; height: 25px; background-color: rgb(255,93,35); border-radius: 999px; cursor: pointer;}#ex-pointlist { position: absolute; width: 300px; height: 400px; background-color: white; border-radius: 3%; overflow: auto; z-index: 100; bottom: 37px;}#ex-pointlist::-webkit-scrollbar { display:none}.pointlist__wrap { width: 100%; height: 100%; margin: 15px 0; position: absolute;}.pointlist__close { position: absolute; color: rgb(127, 127, 137); right: 7px; font-size: 15px; cursor: pointer;}.pointlist__wrap table { border-collapse: collapse; margin: 0 auto; text-align: center;}.pointlist__wrap td,.pointlist__wrap th { border: 1px solid #cad9ea; color: #666; height: 30px; width: 85px;}.pointlist__wrap thead th { background-color: #CCE8EB; width: 100px;}.pointlist__wrap tr:nth-child(odd) { background: #fff;}.pointlist__wrap tr:nth-child(even) { background: #F5FAFA;}.point__panel { position: absolute; left: 0px; bottom: 37px; display: none; animation: move-in 0.75s; z-index: 101;}@keyframes move-in { 0% { opacity: 0; } 100% { opacity: 0.95; }}.panel__wrap { overflow: hidden; background-color: white; border-radius: 5%; width: 120px; box-shadow: 0px 2px 20px 0px #888888; font-size: 14px;}.panel__cell { width: 100%; height: 37px; line-height: 37px; border-bottom: 1px solid rgba(121,127,137,0.4); text-align: center; cursor: pointer;}.panel__cell:hover { background-color: rgb(217, 217, 217); transition: 0.75s;}.panel__triangle { width: 0px; height: 0px; border-color: white transparent transparent transparent; border-style: solid; border-width: 10px; position: absolute; left: 35px;}#ex-record { width: 300px; height: 400px; position: absolute; bottom: 67px; z-index: 100;}.record__close { position: absolute; color: rgb(127, 127, 137); right: -20px; font-size: 15px; cursor: pointer;}.records__wrap { width: 100%; height: 100%; background-color: white; border-radius: 3%; box-shadow: 0px 0px 20px 0px #888888; padding: 15px; overflow-y: scroll; overflow-x: hidden;}.records__wrap::-webkit-scrollbar { display:none}.record__wrap { height: 50px; width: 100%; border: 1px solid rgba(121,127,137,0.4); margin-bottom: 10px; display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; transition: 0.75s; cursor: pointer;}.record__wrap:hover { background-color: #e9f5ff;}.record__left { flex: 1; position: relative;}.record__name { position: absolute; flex: 1; color: #353536;; font-size: 15px; top: 2px; margin-left: 5px;}.record__updatetime { position: absolute; margin-left: 5px; font-size: 12px; bottom: 2px; color: #969799;}.record__price { line-height: 50px; color: rgb(255,93,35); margin-right: 10px;}.record__pagenav { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; width: 310px; position: absolute; bottom: -20px; padding-left: 10px; padding-right: 10px; cursor: pointer;}.record__prev { flex: 1; text-align: center; border: 1px solid rgba(121,127,137,0.8); transition: 0.75s; color: white; background-color: rgb(57,169,237);}.record__prev:hover { background-color: #7167ff;}.record__next { flex: 1; text-align: center; border: 1px solid rgba(121,127,137,0.8); transition: 0.75s; background-color: rgb(57,169,237); color: white;}.record__next:hover { background-color: #7167ff;}.exVideoDiv { width: 500px; height: 250px; background-color: rgba(255, 255, 255, 0); position: absolute; z-index: 1015;}.exVideoPlayer { width: 100%; height: 100%; cursor: move;}.exVideoScale { width: 10px; height: 10px; overflow: hidden; cursor: se-resize; position: absolute; right: 0; bottom: 0; background-color: rgb(231, 57, 57);}.exVideoInfo { width: 100%; height: 30px; background-color: gray; position: absolute; top: -30px; line-height: 30px;}.exVideoClose { width: 30px; float: right; color: white;}.exVideoQn, .exVideoCDN { margin-left: 5px;}.exVideoRID { margin: 0px 5px; font-weight: 800; font-size: medium;}#popup-player__prompt { display: none;}.real-audience { cursor: pointer; display: flex; padding: 0 7px; line-height: 33px;}/* #refresh-video { float: left; width: 24px; height: 24px; margin-right: 5px; cursor: pointer; background-size: contain;} */#refresh-video2 { display: none; position: absolute; top: 20px; right: 20px; cursor: pointer;}#refresh-video2-svg { fill: rgba(0,0,0,.6)}.refresh-barrage { display: inline-block; vertical-align: top; margin: 0 2px; padding: 0 8px; height: 22px; line-height: 21px; background-color: #fff; border: 1px solid #e5e4e4; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; cursor: pointer;}#refresh-barrage__svg { vertical-align: middle;}#ex-camera { background: rgba(0,0,0,0.7); position: absolute; right: 20px; bottom: 190px; z-index: 10; width: 60px; height: 60px; cursor: pointer; -webkit-border-radius: 50%; -moz-border-radius: 50%; border-radius: 50%; cursor: pointer; display: none; justify-content: center; align-items: center; border: 2px solid #2d2c2c; box-sizing: border-box;}#ex-camera:hover > svg > path { fill: rgb(252, 199, 84);}#ex-camera:active > svg > path { fill: rgb(253, 60, 60);}#ex-cinema:hover > .cinema__wrap { display: block;}.cinema__wrap { display: none; margin: 0; padding: 0; border: 1px solid #e5e5e5; background: #fff; position: absolute; left: 201px; min-width: 100px; top: 130px;}.cinema__panel { position: absolute; border: 1px solid #000; border-radius: 4px; transform: translateY(calc(-4px - 100%)) translateX(-50%); left: 33%; background-color: #000; opacity: .75; width: 70px;}.cinema__panel li { padding: 0 2px; white-space: nowrap; color: #fff; text-align: center; cursor: pointer;}.cinema__panel li:hover { background-color: rgb(85, 85, 85);} #ex-joysound { float: left; width: 24px; height: 24px; margin-right: 10px; cursor: pointer; background-size: contain; pointer-events: all;}#ex-joysound img { width: 24px; height: 24px;}#ex-filter { float: left; width: 24px; height: 24px; margin-right: 10px; cursor: pointer; background-size: contain; pointer-events: all;}.filter__wrap { display: none; position: relative; height: 100%; margin-right: -15px; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; float: left; right: -12px; bottom: 10px;}.filter__panel { position: absolute; border: 1px solid #000; border-radius: 4px; transform: translateY(calc(-4px - 100%)) translateX(-50%); left: 33%; background-color: #000; opacity: .75; width: 300px; padding-top: 10px; padding-left: 10px; padding-right: 10px;}.filter__panel li { padding: 0 2px; white-space: nowrap; color: #fff; text-align: center; cursor: pointer;}.filter__panel li:hover { background-color: rgb(85, 85, 85);}.filter__scroll { width: 255px; height: 5px; background: #ccc; position: relative; display: inline-block;}.filter__scroll-bar { width: 15px; height: 15px; background: #369; position: absolute; top: -5px; left: 100px; cursor: pointer; border-radius: 100%;}.filter__scroll-mask { position: absolute; left: 0; top: 0; background: #369; width: 100px; height: 5px;}.filter__title { color: white; display: inline-block; cursor: initial; margin-right: 2px;}#filter__select { width: 260px; float: right;}.filter__filter { margin-top: 5px;}#ex-videospeed:hover > .videospeed__wrap { display: block;}.videospeed__wrap { display: none; margin: 0; padding: 0; border: 1px solid #e5e5e5; background: #fff; position: absolute; left: 201px; min-width: 100px; top: 120px;}.videospeed__panel { position: absolute; border: 1px solid #000; border-radius: 4px; transform: translateY(calc(-4px - 100%)) translateX(-50%); left: 33%; background-color: #000; opacity: .75; width: 70px;}.videospeed__panel li { padding: 0 2px; white-space: nowrap; color: #fff; text-align: center; cursor: pointer;}.videospeed__panel li:hover { background-color: rgb(85, 85, 85);} #ex-videosync { float: left; width: 24px; height: 24px; margin-left: 20px; cursor: pointer; background-size: contain;}.weeklypanel__panel-wrap { width: 100%; height: 100%; z-index: 999; background-color: rgba(0, 0, 0, 0.9); position: absolute; top: 0; left: 0; display: flex; justify-content: center; align-items: center;}.weeklypanel__panel { height: 600px; width: 500px; background-color: white; border-radius: 20px; position: fixed; top: 0; left: 0; right: 0; bottom: 0; margin: auto;}.weeklypanel__content { position: relative; top: 50%; transform: translateY(-50%); text-align: center;}.weeklypanel__text { font-size: 18px;}.weeklypanel__text a { font-weight: bold; font-size: 24px;}.weeklypanel__close { font-size: 30px; font-weight: bold; position: absolute; right: 15px; cursor: pointer;}.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}.noticejs .special{background-color:rgb(160,37,160)}.noticejs .special .noticejs-heading{background-color:rgb(110,26,110);color:#fff;padding:10px}.noticejs .special .noticejs-body{color:#fff;padding:10px}.noticejs .special .noticejs-body:hover{visibility:visible !important}.noticejs .special .noticejs-content{visibility:visible}.noticejs .special .noticejs-progressbar{width:100%;background-color:rgb(160,37,160);margin-top:-1px}.noticejs .special .noticejs-progressbar .noticejs-bar{width:100%;height:5px;background:rgb(110,26,110)}/** * PostbirdAlertBox.js * - 原生javascript弹框插件 * Author: Postbird - http://www.ptbird.cn * License: MIT * Date: 2017-09-23 */.postbird-box-container { width: 100%; height: 100%; overflow: hidden; position: fixed; top: 0; left: 0; z-index: 9999; background-color: rgba(0, 0, 0, 0.2); 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 { min-width: 400px; max-width: 600px; min-height: 150px; 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; padding: 0; margin: 0; bottom: 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}.onoffswitch { position: relative; width: 45px; -webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;}.onoffswitch-checkbox { position: absolute; opacity: 0; pointer-events: none;}.onoffswitch-label { display: block; overflow: hidden; cursor: pointer; height: 20px; padding: 0; line-height: 20px; border: 2px solid #E3E3E3; border-radius: 20px; background-color: #FFFFFF; transition: background-color 0.3s ease-in;}.onoffswitch-label:before { content: ""; display: block; width: 20px; margin: 0px; background: #FFFFFF; position: absolute; top: 0; bottom: 0; right: 23px; border: 2px solid #E3E3E3; border-radius: 20px; transition: all 0.3s ease-in 0s; }.onoffswitch-checkbox:checked + .onoffswitch-label { background-color: #3AAD38;}.onoffswitch-checkbox:checked + .onoffswitch-label, .onoffswitch-checkbox:checked + .onoffswitch-label:before { border-color: #3AAD38;}.onoffswitch-checkbox:checked + .onoffswitch-label:before { right: 0px; }.layui-timeline { padding-left: 5px;}.layui-timeline-item { position: relative; padding-bottom: 20px;}li { list-style: none;}.layui-timeline-item:first-child::before { display: block;}.layui-timeline-item:last-child::before { content: ''; position: absolute; left: 5px; top: 0; z-index: 0; width: 0; height: 100%;}.layui-timeline-item::before { content: ''; position: absolute; left: 5px; top: 0; z-index: 0; width: 1px; height: 100%;}.layui-timeline-item::before,hr { background-color: #e6e6e6;}.layui-timeline-axis { position: absolute; left: -5px; top: 0; z-index: 10; width: 20px; height: 20px; line-height: 20px; background-color: #fff; color: #5FB878; border-radius: 50%; text-align: center; cursor: pointer;}.layui-icon { font-family: layui-icon !important; font-size: 16px; font-style: normal;}.layui-timeline-content { padding-left: 25px;}.layui-text { line-height: 22px; font-size: 14px; color: rgb(85,85,85);}.layui-timeline-title { position: relative;}`)); document.head.appendChild(style); } // 全局变量及公共函数 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(); url = null; urlLen = null; ridPos = null; var my_uid = getCookieValue("acf_uid"); // 自己的uid 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); } } let result = "" + parseInt(secondTime) + "秒"; if (minuteTime > 0) { result = "" + parseInt(minuteTime) + "分" + result; } if (hourTime > 0) { result = "" + parseInt(hourTime) + "小时" + result; } return result; } function formatSeconds2(value) { var secondTime = parseInt(value); // 秒 var minuteTime = 0; // 分 var 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) < 10? "0" + parseInt(secondTime): parseInt(secondTime)); // if (minuteTime > 0) { result ="" + (parseInt(minuteTime) < 10? "0" + parseInt(minuteTime) : parseInt(minuteTime)) + ":" + result; // } // if (hourTime > 0) { result ="" + (parseInt(hourTime) < 10 ? "0" + parseInt(hourTime): parseInt(hourTime)) +":" + result; // } return result; } async function verifyFans(room_id, level) { return true; // 2020年12月22日18:28:18 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){ let 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 getCTN() { // let cookie = document.cookie; // let ret = getStrMiddle(cookie, "acf_ccn=", ";"); let ret = getCookieValue("acf_ctn"); if (ret == null) { setCookie("acf_ctn", "1"); ret = "1"; } return ret; } function getCSRF() { let ret = getCookieValue("cvl_csrf_token"); if (ret == null) { setCookie("cvl_csrf_token", "1"); ret = "1"; } return ret; } function getUID() { let ret = getCookieValue("acf_uid"); return ret; } function showMessage(msg, type="success", options) { // type: success[green] error[red] warning[orange] info[blue] let option = { text: msg, type: type, position: 'bottomLeft', ...options } new NoticeJs(option).show(); } function openPage(url, b=true) { 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) { let 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 (let 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; } } function getAvailableSheet(index) { let ret = -1; for (let i = index; i < document.styleSheets.length - index; i++) { if (document.styleSheets[i].href == null) { ret = i; break; } else { ret = -1; } } return ret; } function showMessageWindow(title, content, callback){ if(window.Notification && Notification.permission !== "denied") { Notification.requestPermission(function(status) { var notice_ = new Notification(title, { body: content }); notice_.onclick = function() { callback(); } }); } } function getUserName() { return new Promise(resovle => { fetch('https://www.douyu.com/member/cp',{ method: 'GET', mode: 'no-cors', credentials: 'include', }).then(res => { return res.text(); }).then(txt => { txt = (new DOMParser()).parseFromString(txt, 'text/html'); let ret = txt.getElementsByClassName("uname_con")[0].title; resovle(ret); }).catch(err => { console.error('请求失败', err); }) }) } function getTextareaPosition(element) { // 获取textarea光标的位置 let cursorPos = 0; if (document.selection) {//IE let selectRange = document.selection.createRange(); selectRange.moveStart('character', -element.value.length); cursorPos = selectRange.text.length; } else if (element.selectionStart || element.selectionStart == '0') { cursorPos = element.selectionStart; } return cursorPos; } function showExRightPanel(name) { let panels = [ { name: "弹幕发送小助手", className: "bloop", }, { name: "扩展功能", className: "extool", }, { name: "直播间工具", className: "livetool", }, { name: "全站抽奖信息", className: "exlottery" }, ]; for (let i = 0; i < panels.length; i++) { let item = panels[i]; let dom = document.getElementsByClassName(item.className)[0]; if (dom) { if (name === item.name) { dom.style.display = dom.style.display !== "block" ? "block" : "none"; } else { dom.style.display = "none"; } } } } function getTimeDiff(t1, t2) { if (t1 < t2) { return -1; } else{ let ret = ""; let date3 = Math.abs(t1 - t2); let days = Math.floor(date3/(24*3600*1000)); ret += days > 0 ? days + "天" : ""; let leave1 = date3%(24*3600*1000); let hours = Math.floor(leave1/(3600*1000)); ret += hours > 0 ? hours + "时" : ""; let leave2 = leave1%(3600*1000); let minutes = Math.floor(leave2/(60*1000)); ret += minutes > 0 ? minutes + "分" : ""; let leave3 = leave2%(60*1000); let seconds = Math.round(leave3/1000); ret += seconds > 0 ? seconds + "秒" : ""; return ret; } } function debounce(func, wait) { let timer; return function() { let context = this; let args = arguments; if (timer) clearTimeout(timer); let callNow = !timer; timer = setTimeout(() => { timer = null; }, wait) if (callNow) func.apply(context, args); } } function exportJsonToExcel(header, body, fileName = 'download.xlsx') { let aoa = []; aoa.push(header, ...body); let sheet = XLSX.utils.aoa_to_sheet(aoa); openDownloadDialog(sheet2blob(sheet), fileName); } function openDownloadDialog(url, saveName) { if(typeof url == 'object' && url instanceof Blob) { url = URL.createObjectURL(url); // 创建blob地址 } var aLink = document.createElement('a'); aLink.href = url; aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效 var event; if(window.MouseEvent) event = new MouseEvent('click'); else { event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); } aLink.dispatchEvent(event); } function sheet2blob(sheet, sheetName) { sheetName = sheetName || 'sheet1'; var workbook = { SheetNames: [sheetName], Sheets: {} }; workbook.Sheets[sheetName] = sheet; // 生成excel的配置项 var wopts = { bookType: 'xlsx', // 要生成的文件类型 bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性 type: 'binary' }; var wbout = XLSX.write(workbook, wopts); var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"}); // 字符串转ArrayBuffer function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } return blob; } function downloadFile(name, data) { var urlObject = unsafeWindow.URL || unsafeWindow.webkitURL || unsafeWindow; var export_blob = new Blob([data]); var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a") save_link.href = urlObject.createObjectURL(export_blob); save_link.download = name; var ev = document.createEvent("MouseEvents"); ev.initMouseEvent("click", true, false, unsafeWindow, 0, 0, 0, 0, 0, false, false, false, false, 0, null); save_link.dispatchEvent(ev); } function timeText2Ms(text) { let ret = 0; let arr = text.split(":"); if (arr.length === 1) { ret = Number(arr[0]); } else if (arr.length === 2) { ret = Number(arr[0]) * 60 + Number(arr[1]); } else if (arr.length === 3) { ret = Number(arr[0]) * 3600 + Number(arr[1]) * 60 + Number(arr[2]); } return ret * 1000; } let svg_accountList = `` let cleanOverTimes = 0; // 用于判断是否全部清空并跳转 function initPkg_AccountList() { // GM_deleteValue("Ex_accountList"); // GM_deleteValue("Ex_accountListPassport"); // return; initPkg_AccountList_Dom(); initPkg_AccountList_Func(); } function initPkg_AccountList_Dom() { AccountList_insertIcon(); } function AccountList_insertIcon() { let a = document.createElement("div"); a.style = "position: absolute;right: -14px;top: 32px;cursor: pointer;" a.id = "ex-accountList-icon"; let html = `
`; a.innerHTML = svg_accountList + html; // a.innerHTML = svg_accountList + `
`; // a.title = "账号列表"; let b = document.getElementsByClassName("Header-right")[0]; b.appendChild(a); addAccount(); } function initPkg_AccountList_Func() { setPassportCmd("null", my_uid); unsafeWindow.addEventListener("message", (event) => { switch (event.data) { case "cleanOver": setTimeout(() => { window.location.reload(); }, 50); break; case "msgCleanOver": cleanOverTimes++; if (cleanOverTimes >= 5) { cleanOverTimes = 0; setTimeout(() => { window.location.reload(); }, 50); } break; case "yubaCleanOver": cleanOverTimes++; if (cleanOverTimes >= 5) { cleanOverTimes = 0; setTimeout(() => { window.location.reload(); }, 50); } break; case "videoCleanOver": cleanOverTimes++; if (cleanOverTimes >= 5) { cleanOverTimes = 0; setTimeout(() => { window.location.reload(); }, 50); } break; case "czCleanOver": cleanOverTimes++; if (cleanOverTimes >= 5) { cleanOverTimes = 0; setTimeout(() => { window.location.reload(); }, 50); } break; case "switchOver": cleanOverTimes++; if (cleanOverTimes >= 5) { cleanOverTimes = 0; setTimeout(() => { window.location.reload(); }, 50); } break; case "deleteOver": renderAccountList(); showMessage("【账号管理】删除完毕", "success"); break; default: break; } }) } function renderAccountList(obj) { document.getElementById("ex-accountList-content").innerHTML = getAccountListHtml(obj); let items = document.getElementsByClassName("ex-accountList-item"); for (let i = 0; i < items.length; i++) { let item = items[i]; let uid = item.getAttribute("uid"); item.addEventListener("click", () => { showMessage("【账号管理】正在切换账号,请耐心等待...", "info"); switchAccount(uid, () => {}); setPassportCmd("switch", uid); setYubaAndMsgAndVideoClean(); }) item.getElementsByClassName("ex-accountList-item__btn")[0].addEventListener("click", (e) => { e.stopPropagation(); showMessage("【账号管理】正在删除...", "info"); deleteAccount(uid, () => {}); setPassportCmd("delete", uid); }) } document.getElementById("ex-accountList-item-add").addEventListener("click", () => { // 重新登录 cleanCookie(() => {}) setPassportCmd("clean", "null"); }); } function getAccountListHtml(object) { let obj = object == undefined ? JSON.parse(GM_getValue("Ex_accountList") || "{}") : object; let ret = ""; for (const key in obj) { if (key == "null") { continue; } let item = obj[key]; ret += `
${decodeURIComponent(item.nickname)}
删除
` } ret += `
`; return ret; } function switchAccount(uid, callback) { let list = JSON.parse(GM_getValue("Ex_accountList")); // let l = list[uid]["data"]; let l = []; let delock = 0; GM_cookie("list", { path: "/" }, function(cookies) { for(let i = 0; i < cookies.length; i++){ GM_cookie("delete", {name: cookies[i]["name"]}, function(error) { delock++; if (delock >= cookies.length) { let addlock = 0; for(let i = 0; i < l.length; i++){ GM_cookie("set", { name: l[i]['name'], value: l[i]['value'], domain: l[i]['domain'], path: l[i]['path'], secure: l[i]['secure'], httpOnly: l[i]['httpOnly'], sameSite: l[i]['sameSite'], expirationDate: l[i]['expirationDate'], hostOnly: l[i]['hostOnly'] }, function(error) { addlock++; if (addlock >= l.length) { callback(); }; }); } }; }); } }); }; function switchAccountPassport(uid, callback) { let list = JSON.parse(GM_getValue("Ex_accountListPassport")); // let l = Array(list.global).concat(list[uid]); let l = list[uid]; let delock = 0; GM_cookie("list", { path: "/" }, function(cookies) { for(let i = 0; i < cookies.length; i++){ GM_cookie("delete", {name: cookies[i]["name"]}, function(error) { delock++; if (delock >= cookies.length) { let addlock = 0; for(let i = 0; i < l.length; i++){ GM_cookie("set", { name: l[i]['name'], value: l[i]['value'], domain: l[i]['domain'], path: l[i]['path'], secure: l[i]['secure'], httpOnly: l[i]['httpOnly'], sameSite: l[i]['sameSite'], expirationDate: l[i]['expirationDate'], hostOnly: l[i]['hostOnly'] }, function(error) { addlock++; if (addlock >= l.length) { callback(); }; }); } }; }); } }); }; // function switchAccountPassport( callback) { // let l = JSON.parse(GM_getValue("Ex_accountListPassport")); // let delock = 0; // GM_cookie("list", { path: "/" }, function(cookies) { // for(let i = 0; i < cookies.length; i++){ // GM_cookie("delete", {name: cookies[i]["name"]}, function(error) { // delock++; // if (delock >= cookies.length) { // let addlock = 0; // for(let i = 0; i < l.length; i++){ // GM_cookie("set", { // name: l[i]['name'], // value: l[i]['value'], // domain: l[i]['domain'], // path: l[i]['path'], // secure: l[i]['secure'], // httpOnly: l[i]['httpOnly'], // sameSite: l[i]['sameSite'], // expirationDate: l[i]['expirationDate'], // hostOnly: l[i]['hostOnly'] // }, function(error) { // addlock++; // if (addlock >= l.length) { // callback(); // }; // }); // } // }; // }); // } // }); // }; function addAccount() { let accountListData = JSON.parse(GM_getValue("Ex_accountList") || "{}"); let item = {}; let uid = ""; GM_cookie("list", { path: "/" }, function(cookies) { let c = []; if (cookies == undefined) { document.getElementById("ex-accountList-content").innerHTML = "请升级Tampermonkey版本
点我升级,选择Crx4Chrome"; return; } for(let i = 0; i < cookies.length; i++) { let name = cookies[i]["name"]; let value = cookies[i]["value"]; if (name == "acf_nickname") { item.nickname = value; } if (name == "acf_uid") { item.uid = value; uid = value; } if (name == "acf_avatar") { item.avatar = value; } c.push(cookies[i]); } if (uid == "") { item.uid = "null"; uid = "null"; } item.data = c; item.update_time = String(new Date().getTime()); accountListData[uid] = item; GM_setValue("Ex_accountList", JSON.stringify(accountListData)); renderAccountList(accountListData); }); }; function addAccountPassport(uid) { let accountListData = JSON.parse(GM_getValue("Ex_accountListPassport") || "{}"); let private_arr = []; let global_arr = []; GM_cookie("list", { path: "/" }, function(cookies) { if (cookies == undefined) { return; } for(let i = 0; i < cookies.length; i++) { if (cookies[i]["name"] == "LTP0") { private_arr.push(cookies[i]); } else { global_arr.push(cookies[i]); } } if (uid == "") { uid = "null"; } accountListData.global = null; accountListData.global = global_arr; accountListData[uid] = private_arr; accountListData.update_time = String(new Date().getTime()); GM_setValue("Ex_accountListPassport", JSON.stringify(accountListData)); }); }; // function addAccountPassport() { // GM_cookie("list", { path: "/" }, function(cookies) { // let c = []; // for(let i = 0; i < cookies.length; i++) { // c.push(cookies[i]); // } // GM_setValue("Ex_accountListPassport", JSON.stringify(c)); // }); // }; function cleanCookie(callback) { let lock = 0; GM_cookie("list", { path: "/" }, (cookies) => { if (cookies) { for (let i = 0; i < cookies.length; i++) { GM_cookie("delete", { name: cookies[i]["name"] }, function (error) { lock++; if (lock >= cookies.length){ callback(); } }); } } else { callback(); } }); } function setPassportCmd(cmd, uid) { document.getElementById("ex-accountList-iframe").innerHTML = ` `; } function setYubaAndMsgAndVideoClean() { document.getElementById("ex-accountList-iframe2").innerHTML = ` ` } function deleteAccount(uid, callback) { let obj = JSON.parse(GM_getValue("Ex_accountList") || "{}"); delete obj[uid]; GM_setValue("Ex_accountList", JSON.stringify(obj)); callback(); } function deleteAccountPassport(uid, callback) { let obj = JSON.parse(GM_getValue("Ex_accountListPassport") || "{}"); delete obj[uid]; GM_setValue("Ex_accountListPassport", JSON.stringify(obj)); callback(); } function initPkg_AdVideo() { initPkg_Sign_Ad_FishPond(); } function initPkg_AdVideo_Xiaoxiaole() { // startGetXiaoxiaoleFishBall() } async function startGetXiaoxiaoleFishBall() { let status = await getXiaoxiaoleStatus(); if (status.error == "0") { let completeNum = Number(status.data['20201021xiaoxiaole_T1'].curCompleteNum); let limitNum = Number(status.data['20201021xiaoxiaole_T1'].taskLimitNum); let leftNum = limitNum - completeNum; if (leftNum > 0) { showMessage(`【消消乐】开始领取鱼丸,剩余${leftNum}次`, "info") } for (let i = 0; i < leftNum; i++) { await getFishBall_Xiaoxiaole(); } } } async function getFishBall_Xiaoxiaole() { let adWatchcer = new DyWacthAd("1134396", dyToken, rid); let isStart = await adWatchcer.start(); if (isStart == true) { await sleep(15000).then(async () => { let isFinish = await adWatchcer.finish(); if (isFinish == true) { showMessage("【消消乐】成功领取40鱼丸", "success"); } }) } } function getXiaoxiaoleStatus() { return new Promise(resolve => { fetch("https://www.douyu.com/japi/carnival/nc/actTask/userStatus", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `tasks=20201021xiaoxiaole_T1&token=${dyToken}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function initPkg_Sign_Ad_FishPond() { getFishBall_Ad_FishPond(); } function getFishBall_Ad_FishPond() { GM_xmlhttpRequest({ method: "POST", url: "https://apiv2.douyucdn.cn/japi/fishpoolTask/m/apinc/taskList?client_sys=android", data: "rid=" + rid + "&token=" + dyToken, responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: async function(response) { let panel = response.response.data.panel; let ret = null; for (let i = 0; i < panel.length; i++) { if (panel[i].id == 37) { // 每日活跃 ret = panel[i].taskList; break; } } if (!ret) { return; } for (let i = 0; i < ret.length; i++) { if (ret[i].task.id == "5578") { if (ret[i].task.status == "3") { // showMessage("【鱼塘鱼丸】已领取", "warning"); // initPkg_Sign_Ad_666(); initPkg_Sign_Ad_Yuba(); } else { for (let j = 0; j < ret[i].task.max - ret[i].task.cur; j++) { let posid_Ad_FishPond = "1114268"; let token = dyToken; let uid = getUID(); let info = await getFishBall_Ad_FishPond_info(posid_Ad_FishPond, token, uid); if (info == false) { // initPkg_Sign_Ad_666(); initPkg_Sign_Ad_Yuba(); return; } let mid = info.mid; let infoBack = info.infoBack; let isStart = await getFishBall_Ad_FishPond_start(posid_Ad_FishPond, token, uid, mid, infoBack); if (isStart == false) { isStart = await getFishBall_Ad_FishPond_start(posid_Ad_FishPond, token, uid, mid, infoBack); if (isStart == false) { isStart = await getFishBall_Ad_FishPond_start(posid_Ad_FishPond, token, uid, mid, infoBack); // 偷个懒,直接三次重试 } } if (isStart == true) { showMessage("【鱼塘鱼丸】开始领取鱼塘鱼丸,需等待15秒", "info"); await sleep(15555).then(async () => { let isFinish = await getFishBall_Ad_FishPond_finish(posid_Ad_FishPond, token, uid, mid, infoBack); if (isFinish == false) { isFinish = await getFishBall_Ad_FishPond_finish(posid_Ad_FishPond, token, uid, mid, infoBack); if (isFinish == false) { isFinish = await getFishBall_Ad_FishPond_finish(posid_Ad_FishPond, token, uid, mid, infoBack); } } if (isFinish == true) { // let isGet = await getFishBall_Ad_FishPond_Bubble(token); showMessage("【鱼塘鱼丸】任务完成", "success"); } }) } } // initPkg_Sign_Ad_666(); initPkg_Sign_Ad_Yuba(); } } } } }); } 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" + '&device={"nt":"1"}', responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.error == "0") { if (ret.data.length == 0) { resolve(false); return; } let mid = ret.data[0].mid; let 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(ret.error); } }); }) } function initPkg_Sign_Ad_Guess() { getFishBall_Ad_Guess(); } async function getFishBall_Ad_Guess() { let chance = await getFishBall_Ad_Guess_chance(); if (chance > 0) { for (let i = 0; i < chance; i++) { let adWatcher = new DyWacthAd("1114337", dyToken, rid); let isStart = await adWatcher.start(); if (isStart == true) { showMessage("【预言鱼丸】开始领取预言鱼丸,需等待15秒", "info"); await sleep(15555).then(async () => { if (await adWatcher.finish() == true) { showMessage("【预言鱼丸】成功领取40鱼丸", "success"); } await sleep(1000); }) } } } else { // showMessage("【预言鱼丸】今日次数已用完", "warning"); } initPkg_AdVideo_Xiaoxiaole(); } function getFishBall_Ad_Guess_chance() { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/chance?client_sys=android", data: "token=" + dyToken + "&uid=" + getUID() + "&posCode=1114337&clientType=1", responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: async function(response) { let ret = response.response; if (ret.error == "0") { let chance = ret.data.chanceNum; resolve(chance); } else { resolve(0); } } }); }) } function initPkg_Sign_Ad_Search() { getFishBall_Ad_Search(); } function getFishBall_Ad_Search() { GM_xmlhttpRequest({ method: "POST", url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/chance?client_sys=android", data: "token=" + dyToken + "&uid=" + getUID() + "&posCode=1124343&clientType=1", responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: async function(response) { let ret = response.response; if (ret.error == "0") { let chance = ret.data.chanceNum; if (chance > 0) { for (let i = 0; i < chance; i++) { let posid_Ad_Search = "1124343"; let token = dyToken; let uid = getUID(); let info = await getFishBall_Ad_Search_info(posid_Ad_Search, token, uid); if (info == false) { initPkg_Sign_Ad_Guess(); return; } let mid = info.mid; let infoBack = info.infoBack; let isStart = await getFishBall_Ad_Search_start(posid_Ad_Search, token, uid, mid, infoBack); if (isStart == true) { showMessage("【搜索鱼丸】开始领取搜索鱼丸,需等待15秒", "info"); await sleep(15555).then(async () => { let isFinish = await getFishBall_Ad_Search_finish(posid_Ad_Search, token, uid, mid, infoBack); if (isFinish == true) { showMessage("【搜索鱼丸】成功领取40鱼丸", "success"); await sleep(1000); } }) } } } else { // showMessage("【搜索鱼丸】今日次数已用完", "warning"); initPkg_Sign_Ad_Guess(); return; } } initPkg_Sign_Ad_Guess(); } }); } function getFishBall_Ad_Search_info(posid_Ad_Search, 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_Search + "&roomid=" + rid + "&cate1=1&cate2=1&chanid=30" + '&device={"nt":"1"}', responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.error == "0") { if (ret.data.length == 0) { resolve(false); return; } let mid = ret.data[0].mid; let infoBack = encodeURIComponent(JSON.stringify(ret.data)); resolve({mid: mid, infoBack: infoBack}); } } }); }) } function getFishBall_Ad_Search_start(posid_Ad_Search, 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_Search + "&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_Search_finish(posid_Ad_Search, 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_Search + "&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") { if (ret.data == "1") { resolve(true); } } } }); }) } function initPkg_Sign_Ad_Yuba() { getFishBall_Ad_Yuba(); } function getFishBall_Ad_Yuba() { GM_xmlhttpRequest({ method: "POST", url: "https://apiv2.douyucdn.cn/japi/inspire/api/ad/fishpond/mobile/chance?client_sys=android", data: "token=" + dyToken + "&uid=" + getUID() + "&posCode=1042329&clientType=1", responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: async function(response) { let ret = response.response; if (ret.error == "0") { let chance = ret.data.chanceNum; if (chance > 0) { for (let i = 0; i < chance; i++) { let posid_Ad_Yuba = "1042329"; let token = dyToken; let uid = getUID(); let info = await getFishBall_Ad_Yuba_info(posid_Ad_Yuba, token, uid); if (info == false) { initPkg_Sign_Ad_Search(); return; } let mid = info.mid; let infoBack = info.infoBack; let isStart = await getFishBall_Ad_Yuba_start(posid_Ad_Yuba, token, uid, mid, infoBack); if (isStart == true) { showMessage("【鱼吧鱼丸】开始领取鱼吧鱼丸,需等待15秒", "info"); await sleep(15555).then(async () => { let isFinish = await getFishBall_Ad_Yuba_finish(posid_Ad_Yuba, token, uid, mid, infoBack); if (isFinish == true) { showMessage("【鱼吧鱼丸】成功领取40鱼丸", "success"); await sleep(1000); } }) } } } else { // showMessage("【鱼吧鱼丸】今日次数已用完", "warning"); initPkg_Sign_Ad_Search(); return; } } initPkg_Sign_Ad_Search(); } }); } function getFishBall_Ad_Yuba_info(posid_Ad_Yuba, 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_Yuba + "&roomid=" + rid + "&cate1=1&cate2=1&chanid=30" + '&device={"nt":"1"}', responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.error == "0") { if (ret.data.length == 0) { resolve(false); return; } let mid = ret.data[0].mid; let infoBack = encodeURIComponent(JSON.stringify(ret.data)); resolve({mid: mid, infoBack: infoBack}); } } }); }) } function getFishBall_Ad_Yuba_start(posid_Ad_Yuba, 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_Yuba + "&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_Yuba_finish(posid_Ad_Yuba, 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_Yuba + "&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") { if (ret.data == "1") { resolve(true); } } } }); }) } function initPkg_AudioLine() { initPkg_AudioLine_Dom(); initPkg_AudioLine_Func(); } function initPkg_AudioLine_Dom() { AudioLine_insertIcon(); } function AudioLine_insertIcon() { let a = document.createElement("div"); a.className = "Title-blockInline"; a.id = "ex-audio-line"; a.innerHTML = '
切换音频线路
'; let b = document.getElementsByClassName("Title-col")[4]; if (b.childNodes.length > 1) { b.insertBefore(a, b.childNodes[1]); } } function initPkg_AudioLine_Func() { document.getElementById("ex-audio-line").addEventListener("click", function() { document.getElementsByClassName("pause-c594e8")[0].click(); // 暂停视频播放 getRealLive_Douyu(rid, true, false, "1015", (lurl) => { createNewAudio_Douyu(videoPlayerArr.length, rid); }) }); } let timeout; function initPkg_BagInfo() { initPkg_BagInfo_Func(); } function initPkg_BagInfo_Func() { let backpackDom = document.getElementsByClassName("BackpackButton")[0]; if (!backpackDom) { return; } document.getElementsByClassName("BackpackButton")[0].addEventListener("click", function() { clearTimeout(timeout); timeout = setTimeout(() => { if (document.getElementsByClassName("Backpack JS_Backpack").length > 0) { getBagGifts(rid, (ret) => { let chunkNum = ret.data.list.length; if (chunkNum > 0) { let totalPrice = 0; let totalIntimate = 0; for (let i = 0; i < chunkNum; i++) { let chunk = document.getElementsByClassName("Backpack-prop")[i]; let isValuable = ret.data.list[i].isValuable; // 判断是否是有价值的礼物 let expiry = ret.data.list[i].expiry; // 过期时间 let price = ret.data.list[i].price; // 注意这个要除100才是真实价格,否则是亲密度 let intimate = ret.data.list[i].intimate; // 亲密度 let count = ret.data.list[i].count; // 数量 if (isValuable == "1") { totalPrice = totalPrice + Number(price) * Number(count); } totalIntimate = totalIntimate + Number(intimate) * Number(count); let expiryDiv = document.createElement("div"); expiryDiv.className = "bag-info"; expiryDiv.innerHTML = expiry - 1; chunk.insertBefore(expiryDiv, chunk.childNodes[0]); } let html = document.getElementsByClassName("BackpackHeader-extInfo")[0].innerHTML; document.getElementsByClassName("BackpackHeader-extInfo")[0].innerHTML = `` + "总价值:" + String(Number(totalPrice / 100).toFixed(2)) + " 总亲密度:" + String(totalIntimate) + `清空背包` + html; document.getElementById("Backpack__clearbag").addEventListener("click", () => { if (confirm("确认清空?") != true) { return; } showMessage("【清空背包】执行中...", "info"); getBagGifts(rid, (ret) => { clearBagGifts(ret, rid); }) }) } }); } }, 500); }); } 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 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; let barrageOptions = []; 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 += '
'; 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("FansBarrageSwitcher"); let nobleIcon = document.getElementsByClassName("NobleBarrageSwitcher is-active"); let isNoble = false; if (nobleIcon.length > 0) { isNoble = true; } 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 { a[0].click(); a = document.getElementsByClassName("FansBarrageColor-item"); 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; if (isNoble == true) { document.getElementsByClassName("NobleBarrageSwitcher")[0].click(); } } 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) { document.getElementsByClassName("FansBarrageSwitcher")[0].click(); 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; let tiangouMode = document.getElementById("bloop__checkbox_tiangou").checked; if (speed1 == "undefined") { speed1 = 2000; } if (speed2 == "undefined") { speed2 = 3000; } if (stopTime == "undefined") { stopTime = 5; } let data = { text: barrageOptions, speed1: speed1, speed2: speed2, stopTime: stopTime, isChangeColor: isChangeColor, isTiangouMode: tiangouMode, } localStorage.setItem("ExSave_BarrageLoopOptions", JSON.stringify(data).replace(/\\n/g, "\\r")); // 存储弹幕列表 } function getStopTime() { let a = document.getElementById("bloop__text_stoptime").value; return Number(a) * 60 * 1000; } async function doLoopBarrage() { if (isChangeColor == true) { selectBarrageColor(barrageColorOffset); barrageColorOffset++; if (barrageColorOffset > barrageColorLength) { barrageColorOffset = 0; } } if (document.getElementById("bloop__checkbox_tiangou").checked == true) { let tiangouBarrage = await getBarrageTxt_Tiangou(); tiangouBarrage = String(tiangouBarrage).replace(/他/g,"她"); sendBarrage(tiangouBarrage); } else { 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() { showExRightPanel("弹幕发送小助手"); }); 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); } }); document.getElementById("bloop__checkbox_tiangou").addEventListener("click", function() { let ischecked = document.getElementById("bloop__checkbox_tiangou").checked; if (ischecked == true) { // 开启舔狗模式 document.getElementById("bloop__textarea").disabled = true; } else{ // 关闭舔狗模式 document.getElementById("bloop__textarea").disabled = false; } saveData_BarrageLoop(); }); document.getElementById("bloop__select").onclick = function() { if (this.options.length == 0) { return; } let area = document.getElementById("bloop__textarea"); let text = this.options[this.selectedIndex].text; area.value = text; area.value = area.value.replace(/\\r/g, "\r"); }; document.getElementById("bloop__save").addEventListener("click", () => { // ExSave_BarrageLoopOptions let select_bloop = document.getElementById("bloop__select"); let text = document.getElementById("bloop__textarea").value; if (text == "") return; barrageOptions.push(text); select_bloop.options.add(new Option(text.replace(/\n/g, "\\r"), true)); saveData_BarrageLoop(); }); document.getElementById("bloop__delete").addEventListener("click", () => { let select_bloop = document.getElementById("bloop__select"); let index = select_bloop.options[select_bloop.selectedIndex]; if (!index) return; let text = index.text; barrageOptions = barrageOptions.filter(item => item === text); select_bloop.options.remove(select_bloop.selectedIndex); saveData_BarrageLoop(); }); } function initPkg_BarrageLoop_Dom() { // Dom初始化 BarrageLoop_insertModal(); BarrageLoop_insertIcon(); } function initPkg_BarrageLoop_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_BarrageLoopOptions"); if (ret != null) { let retJson = JSON.parse(ret); if ("speed1" in retJson == false) { retJson.speed1 = 2000; } if ("speed2" in retJson == false) { retJson.speed2 = 3000; } if ("stopTime" in retJson == false) { retJson.stopTime = 5; } if ("isTiangouMode" in retJson == false) { retJson.isTiangouMode = false; } let select_bloop = document.getElementById("bloop__select"); retJson.text.forEach(item => { select_bloop.options.add(new Option(item.replace(/\r/g, "\\r"), "")); }); barrageOptions = 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; if (retJson.isTiangouMode == true) { document.getElementById("bloop__checkbox_tiangou").checked = retJson.isTiangouMode; document.getElementById("bloop__textarea").disabled = true; } } } function getBarrageTxt_Tiangou() { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "https://api.shadiao.app/chp", responseType: "json", onload: function(response) { let ret = response.response; resolve(ret.data.text); } }); }) } function initPkg_BarragePanel() { let timer = setInterval(() => { if (document.getElementsByClassName("danmuTips-1ee820").length > 0) { clearInterval(timer); document.getElementsByClassName("danmuTips-1ee820")[0].parentElement.id = "Ex_BarragePanel"; setBarragePanelCallBack(); } }, 1500); initPkg_BarragePanel_Tip(); } function setBarragePanelCallBack() { let a = new DomHook("#Ex_BarragePanel", true, (m) => { let isAttributes = false; if (m.length > 0) { for (let i = 0; i < m.length; i++) { if (m[i].type == "attributes") { isAttributes = true; break; } } if (isAttributes == false) { let addedNodes = m[0].addedNodes; if (addedNodes.length > 0) { let barragePanel = addedNodes[0]; if ("getElementsByClassName" in barragePanel == false) { return; } let userNameDom = barragePanel.getElementsByClassName("danmuAuthor-3d7b4a"); let id = ""; if (userNameDom.length > 0) { id = userNameDom[0].innerText; setUserFansMedal(userNameDom[0], id); setMuteButton(barragePanel); setSearchBarrageButton(barragePanel); setMuteTimeButton(barragePanel); setReplyBarrageButton(barragePanel); setBarrgePanelFunc(barragePanel, id); } } } else { let tmp = document.getElementsByClassName("barragePanel__funcPanel"); if (tmp.length > 0) { tmp[0].remove(); } let barragePanel = document.getElementsByClassName("danmudiv-32f498")[0]; if (barragePanel == undefined) { return; } let userNameDom = barragePanel.getElementsByClassName("danmuAuthor-3d7b4a"); let id = ""; if (userNameDom.length > 0) { id = userNameDom[0].innerText; setUserFansMedal(userNameDom[0], id); setMuteButton(barragePanel); setSearchBarrageButton(barragePanel); setMuteTimeButton(barragePanel); setReplyBarrageButton(barragePanel); setBarrgePanelFunc(barragePanel, id); } } } }); } function getUserFansMedal(userName) { let ret = false; let barrageList = document.getElementsByClassName("Barrage-listItem"); for (let i = barrageList.length - 1; i >= 0; i--) { let barragePanel = barrageList[i].lastElementChild; if (barragePanel != null && barragePanel != undefined && barragePanel.innerHTML.indexOf(userName) != -1) { let fansElement = barragePanel.getElementsByClassName("FansMedal"); if (fansElement.length > 0) { ret = fansElement[0].cloneNode(true); break; } } } return ret; } function getUserLevelText(userName) { let ret = ""; let barrageList = document.getElementsByClassName("Barrage-listItem"); for (let i = barrageList.length - 1; i >= 0; i--) { let barragePanel = barrageList[i].lastElementChild; if (barragePanel != null && barragePanel != undefined && barragePanel.innerHTML.indexOf(userName) != -1) { let roomAdmin = barragePanel.getElementsByClassName("Barrage-icon--roomAdmin"); if (roomAdmin.length > 0) { ret += "【房管】"; } let noble = barragePanel.getElementsByClassName("Barrage-nobleImg"); if (noble.length > 0) { ret += `【${ noble[0].title }】`; } let level = barragePanel.getElementsByClassName("UserLevel"); if (level.length > 0) { ret += level[0].title; } break; } } return ret; } function setUserFansMedal(dom, userName) { if (document.getElementById("barragePanel__id") == undefined) { dom.removeChild(dom.childNodes[0]); let userLevel = getUserLevelText(userName); let a = document.createElement("span"); a.innerHTML = userName; a.title = userLevel; a.id = "barragePanel__id"; dom.insertBefore(a, dom.childNodes[0]); } let fansMedal = getUserFansMedal(userName); if (fansMedal != false) { a = document.createElement("div"); a.style = "display:inline-block"; a.appendChild(fansMedal); dom.insertBefore(a, dom.childNodes[0]); } } function setMuteButton(dom) { if (document.getElementById("barragePanel__mute") != null) { return; } let a = document.createElement("div"); a.className = "ReportButton-41fa9e"; a.id = "barragePanel__mute"; a.innerText = "禁言"; a.style = "margin-top:120px;z-index:5"; dom.insertBefore(a, dom.childNodes[0]); } function setSearchBarrageButton(dom) { if (document.getElementById("barragePanel__search") != null) { return; } let a = document.createElement("div"); a.className = "HideButton-d22988"; a.innerText = "查弹幕"; a.id = "barragePanel__search"; a.style = "margin-top:120px;z-index:5"; dom.insertBefore(a, dom.childNodes[0]); } function setReplyBarrageButton(dom) { if (document.getElementById("barragePanel__reply") != null) { return; } let a = document.createElement("div"); a.className = "HideButton-d22988"; a.innerText = "回复"; a.id = "barragePanel__reply"; a.style = "margin-top:90px;z-index:5"; dom.insertBefore(a, dom.childNodes[0]); } function setMuteTimeButton(dom) { if (document.getElementsByClassName("barragePanel__muteTime").length > 0) { return; } let a = document.createElement("div"); a.className = "barragePanel__muteTime"; a.innerHTML = ` `; dom.insertBefore(a, dom.childNodes[0]); } function setBarrgePanelFunc(parentDom, id) { document.getElementById("barragePanel__reply").onclick = () => { let txt = parentDom.getElementsByClassName("danmuContent-25f266")[0].innerText; if (txt != "") { document.getElementsByClassName("ChatSend-txt")[0].value = `@${ id }:${ txt }`; } }; document.getElementById("barragePanel__mute").onclick = async () => { let value = document.getElementById("barragePanel__muteSelect").value || "1"; let ret = await addMuteUser(rid, id, value); if (ret.msg == "添加成功") { showMessage(`【禁言】${id}已被禁言${value}分钟`, "success"); } else { showMessage(ret.msg, "error"); } }; document.getElementById("barragePanel__search").onclick = async () => { insertBarragePanel_SearchBarrage_Dom(parentDom); let barragePanelLastName = id; let ret = await getUserRecentBarrage(id); let retJson = JSON.parse(ret.data); let panel = document.getElementById("barragePanel__searchPanel"); if(retJson.msg == "成功") { if ("danmuVoList" in retJson.data == false) { return; } for (let i = 0; i < retJson.data.danmuVoList.length; i++) { let item = retJson.data.danmuVoList[i]; let a = document.createElement("li"); a.className = "layui-timeline-item"; a.innerHTML = `

${item.time}

${item.anchorName}:
${item.txt}

`; if (panel != null || panel != undefined) { panel.appendChild(a); } } let end = document.createElement("li"); end.className = "layui-timeline-item"; end.innerHTML = `
`; if (panel != null || panel != undefined) { panel.appendChild(end); } } else { showMessage("【查弹幕】查询失败", "error"); } }; } function insertBarragePanel_SearchBarrage_Dom(parentDom) { let pMarginLeft = parseInt(parentDom.style.marginLeft); let newMarginLeft = "-237px"; if (pMarginLeft > 237) { newMarginLeft = "-237px"; } else { newMarginLeft = "237px"; } let a = document.createElement("div"); a.className = "barragePanel__funcPanel"; a.style = `margin-left:${newMarginLeft}`; a.innerHTML = ` `; parentDom.insertBefore(a, parentDom.childNodes[0]); } function getUserRecentBarrage(name) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "http://dyapi.fz996.com/api/Wx/GetDataBarrage?keyword=" + name, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }); } function initPkg_BarragePanel_Tip() { setBarragePanelTipCallBack(); } function setBarragePanelTipCallBack() { let a = new DomHook("#comment-dzjy-container", false, (m) => { if (m.length <= 0) { return; } if (m[0].addedNodes.length <= 0) { return; } let dom = m[0].addedNodes[0]; renderBarragePanelTip(dom); setBarragePanelTipFunc(); }) } function renderBarragePanelTip(dom) { let a = document.createElement("div"); a.style.display = "inline-block"; document.getElementsByClassName("btnscontainer-4e2ed0")[0].insertBefore(a, dom.childNodes[0]); a = document.createElement("p"); a.className = "sugun-e3fbf6"; a.innerText = "|"; dom.appendChild(a); a = document.createElement("div"); a.className = "labelfisrt-407af4"; a.id = "barrage-panel-tip__+1" a.innerText = "+1"; dom.appendChild(a); } function setBarragePanelTipFunc() { document.getElementById("barrage-panel-tip__+1").onclick = () => { let txt = document.getElementById("comment-higher-container").innerText; sendBarrage(txt); } } let barrageMemoryArr = []; let barrageMemoryIndex = 0; // 当前 指向索引 let prevTextareaPosition = 0; function initPkg_ChatMemory() { initPkg_ChatMemory_Func(); } function initPkg_ChatMemory_Func() { document.getElementsByClassName("ChatSend-txt")[0].addEventListener("keydown", (e) => { let dom = e.target; if (e.keyCode == 38) { // ↑ if (getTextareaPosition(dom) == 0) { barrageMemoryIndex = barrageMemoryIndex > 0 ? barrageMemoryIndex - 1 : barrageMemoryIndex; chatMemory_setBarrage(); } } else if (e.keyCode == 40) { // ↓ if (getTextareaPosition(dom) == dom.value.length) { barrageMemoryIndex = barrageMemoryIndex < barrageMemoryArr.length - 1 ? barrageMemoryIndex + 1 : barrageMemoryIndex; chatMemory_setBarrage(); } } else if (e.keyCode == 13) { // enter chatMemory_pushBarrage(getBarrageValue()); } }); document.getElementsByClassName("ChatSend-button")[0].addEventListener("click", () => { // 点击弹幕发送按钮 chatMemory_pushBarrage(getBarrageValue()); }) } function chatMemory_pushBarrage(txt) { barrageMemoryIndex = barrageMemoryArr.push(txt); } function chatMemory_setBarrage() { if (barrageMemoryArr[barrageMemoryIndex] == undefined) { return; } setBarrageValue(barrageMemoryArr[barrageMemoryIndex] || ""); } function getBarrageValue() { let dom = document.getElementsByClassName("ChatSend-txt")[0]; if (dom != undefined && dom != null) { return dom.value; } return ""; } function setBarrageValue(txt) { let dom = document.getElementsByClassName("ChatSend-txt")[0]; if (dom != undefined && dom != null) { dom.value = txt; } } function initPkg_ChatTools() { initPkg_ChatMemory(); } function initPkg_Console() { console_watermark_douyEx(); } function console_watermark_douyEx() { // console.log("DouyuEx插件官网 http://www.douyuex.com") console.log(`%c ______ _____) (, / ) / / / ___ )__ __/ _/___ /_(_)(_(_(_/_(_(_/ /(__ (_/___ / .-/ (_____) / (_/ %cver ${curVersion}`,'color:rgb(255,121,35);font-size:20px;font-weight:bold;', "color:red;font-size:16px;") return; } function initPkg_CopyRealLive() { initPkg_CopyRealLive_Dom(); initPkg_CopyRealLive_Func(); } function initPkg_CopyRealLive_Dom() { CopyRealLive_insertIcon(); } function CopyRealLive_insertIcon() { let a = document.createElement("div"); a.className = "Title-blockInline"; a.id = "copy-real-live"; a.innerHTML = '
复制直播流
'; let b = document.getElementsByClassName("Title-col")[4]; if (b.childNodes.length > 1) { b.insertBefore(a, b.childNodes[1]); } } function CopyRealLive_getQn(qnName) { if (String(qnName).includes("蓝光8M")) return 8; if (String(qnName).includes("蓝光4M")) return 4; if (String(qnName).includes("超清")) return 3; if (String(qnName).includes("高清")) return 2; return 0; } function CopyRealLive_copyUrl(qn) { getRealLive_Douyu(rid, true, false, qn, (lurl) => { if (lurl == "None") { showMessage("房间未开播或其他错误", "error"); } else { let str = String(lurl); // GM_setClipboard(String(lurl).replace("https", "http")); GM_setClipboard(str); showMessage("复制成功", "success"); } }) } function initPkg_CopyRealLive_Func() { document.getElementById("copy-real-live").addEventListener("click", function() { if (document.querySelectorAll(".tipItem-898596 > ul > li").length > 0) { document.querySelectorAll(".tipItem-898596 > ul > li").forEach(item => { if (item.className.includes("selected")) { CopyRealLive_copyUrl(CopyRealLive_getQn(item.innerText)); } }) } else { CopyRealLive_copyUrl(0); } }); document.getElementsByClassName("Title-header")[0].addEventListener("click", function() { if (document.querySelectorAll(".tipItem-898596 > ul > li").length > 0) { document.querySelectorAll(".tipItem-898596 > ul > li").forEach(item => { if (item.className.includes("selected")) { CopyRealLive_copyUrl(CopyRealLive_getQn(item.innerText)); } }) } else { CopyRealLive_copyUrl(0); } }); let titNode = document.getElementsByClassName("RecommendViewTit-04ebd8"); let tit = ""; if (titNode.length > 0) { tit = titNode[0].innerText + "\n"; } document.getElementsByClassName("Title-header")[0].style.cursor = "pointer"; document.getElementsByClassName("Title-header")[0].title = tit + "点击复制直播流"; } function initPkg_DisableCloseJump_Timer() { setInterval(() => { let x = document.getElementsByClassName("dy-ModalRadius-close-x"); if (x.length > 0) { x[0].click(); } }, 1000); } function getVideoStreamUrl(vid, sign) { return new Promise(resolve => { fetch("https://v.douyu.com/api/stream/getStreamUrl", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}, body: `${sign}&vid=${vid}` }).then(result => { return result.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function getVideoBarrageByTime(vid, pre = 0) { // pre来自接口返回值data.pre中 // 若为-1则不再获取 if (pre < 0) { return; } return new Promise(resolve => { fetch(`https://v.douyu.com/wgapi/vod/center/getBarrageListByPage?vid=${vid}&offset=${pre}`, { method: 'GET', mode: 'no-cors', credentials: 'include', }).then(result => { return result.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } let dyVideoBarrage_domhook_videoChange = null; let dyVideoBarrage_hasRendered = false; const dyVideoBarrage_domName = "ex-barrageLine"; const dyVideoBarrage_switchDomName = "ex-barrageLine-switch"; function initPkg_DyVideoBarrageLine() { let timer = setInterval(() => { let progress = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot.querySelector(".ProgressBar-Safearea"); let hashidShadow = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot; let hashIdDom = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot; if (progress && hashidShadow && hashIdDom) { clearInterval(timer); initPkg_DyVideoBarrageLine_Dom(); renderVideoBarrageLine(); let shareHoverDom = hashIdDom.querySelector("share-hover"); dyVideoBarrage_domhook_videoChange = new MutationObserver(function(mutations) { renderVideoBarrageLine(); }); dyVideoBarrage_domhook_videoChange.observe(shareHoverDom, { attributes: true, childList: true, subtree: false }); } }, 1000); } function initPkg_DyVideoBarrageLine_Dom() { let a = document.createElement("style"); a.innerHTML = `.no-hasLR #ex-barrageLine { display: none !important; }`; let b = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot; b.append(a); } async function renderVideoBarrageLine() { if (dyVideoBarrage_hasRendered) return; dyVideoBarrage_hasRendered = true; setTimeout(() => { dyVideoBarrage_hasRendered = false; }, 1000); showMessage("弹幕高能进度条加载中,请耐心等待", "info"); let progress = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot; let progressBar = progress.querySelector(".ProgressBar"); let barrageLineDom = progress.querySelector("#" + dyVideoBarrage_domName); if (barrageLineDom) barrageLineDom.remove(); let hashid = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("share-hover").getAttribute("hashid"); let xAxisStepNum = 100; let progressTimeText = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("#time-label").innerText; let arr = progressTimeText.split("/"); if (arr.length <= 0) return; let totalMs = timeText2Ms(arr[1]); let msStep = totalMs / (xAxisStepNum - 1); let list = new Array(xAxisStepNum).fill(0, 0, xAxisStepNum); let pre = 0; do { let data = await getVideoBarrageByTime(hashid, pre); pre = data.data.pre; if (data.data.list) { for (let i = 0; i < data.data.list.length; i++) { let item = data.data.list[i]; let index = Math.floor(item.tl / msStep); list[index]++; } } } while (pre >= 0); // viewbox 长1000 高100 let xStep = 1000 / list.length; let yStep = Math.max(...list) / 100; let positionArray = []; for (let i = 0; i < list.length; i++) { let barrageNum = list[i]; let x = i * xStep; let y = barrageNum / yStep; positionArray.push([x, y]); } let d = "M 0 100 L 0 80 "; let c = ""; for (let i = 0; i < positionArray.length - 1; i++) { let current = positionArray[i]; let next = positionArray[i + 1]; let [x1, y1] = current; let [x2, y2] = next; let cx1 = x1; let cy1 = (y1 + y2) / 2; let cx2 = x2; let cy2 = (y1 + y2) / 2; c += "C "; c += `${cx1} ${80 - cy1}, ${cx2} ${80 - cy2}, ${x2} ${80 - y2} `; // let smoothArr = smooth([current, next]); // for (let j = 1; j < smoothArr.length; j++) { // c += `${smoothArr[j][0]} ${100 - smoothArr[j][1]}`; // if (j === smoothArr.length - 1) { // c += " "; // } else { // c += ", " // } // } } c += "L 1000 100 Z"; let path = d + c; let html = ` `; if (path.indexOf("NaN") !== -1) { console.log(path) showMessage("弹幕高能进度条加载失败", "error"); } let a = document.createElement("div"); a.id = dyVideoBarrage_domName; a.style = "position:absolute;width:100%;height:30px;bottom:0px;pointer-events:none;cursor: default;"; a.innerHTML = html; progressBar.insertBefore(a, progressBar.childNodes[0]); } function initPkg_DyVideoDownload() { let timer = setInterval(() => { let toolBarShadow = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot; if (toolBarShadow) { clearInterval(timer); let toolbar = toolBarShadow.querySelector(".ToolBar-positiveUl"); initPkg_DyVideoDownload_Style(); initPkg_DyVideoDownload_Dom(toolbar); initPkg_DyVideoDownload_Func(); } }, 1000); } function initPkg_DyVideoDownload_Style() { let style = document.createElement("style"); style.innerHTML = ` #btn-download:hover .download__panel { display: block; } .download__panel { width:150px; position:absolute; text-align: center; cursor: default; margin-top: 29px; margin-left: -38px; box-shadow: 0px 3px 10px 0px; display: none; background: white; } .download__item { height: 30px; line-height: 30px; width: 100%; cursor: pointer; } .download__item:hover { color: rgb(255,119,0) } `; document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.appendChild(style); } function initPkg_DyVideoDownload_Dom(dom) { let html = `
浏览器下载
复制m3u8链接
下载弹幕(.xlsx)
下载弹幕(.ass)
下载 ` let a = document.createElement("li"); a.title = "下载视频"; a.innerHTML = html; a.id = "btn-download"; dom.appendChild(a); } function initPkg_DyVideoDownload_Func() { let $DATA = unsafeWindow.$DATA; let domDownloadText = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#download-text"); let domDownloadPanel = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector(".download__panel"); document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#btn-download").addEventListener("click", () => { if (domDownloadText.innerText === "下载完成") { showMessage("请刷新页面后再下载", "warning"); } }) document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#download__default").addEventListener("click", async () => { let hashid = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("share-hover").getAttribute("hashid"); let vid = $DATA.ROOM.vid; if (hashid !== vid) { showMessage("视频内容已改变,请刷新网页后重试", "error"); return; } showMessage("开始下载视频...当视频超过2GB时可能会下载失败", "info"); const m3u8 = new M3U8(); let dyVideoSign = new DyVideoSign($DATA.ROOM.point_id); let sign = dyVideoSign.getSign(); dyVideoSign = null; let ret = await getVideoStreamUrl(vid, sign); let url = ""; if ("super" in ret.data.thumb_video) { url = ret.data.thumb_video.super.url; } else if ("high" in ret.data.thumb_video) { url = ret.data.thumb_video.high.url; } else if ("normal" in ret.data.thumb_video) { url = ret.data.thumb_video.normal.url; } else { let keys = Object.keys(ret.data.thumb_video); url = keys.length > 0 ? ret.data.thumb_video[keys[0]].url : ""; } if (url !== "") { let download = m3u8.start(url, { filename: $DATA.ROOM.name + ".mp4" }); download.on("progress", progress => { domDownloadText.innerText = `${Number(progress.percentage).toFixed(2)}%`; }).on("finished", finished => { domDownloadText.innerText = "下载完成"; showMessage("视频下载完成", "success"); }).on("error", message => { domDownloadText.innerText = "下载失败"; showMessage(message, "success"); }).on("aborted", () => { domDownloadText.innerText = "下载中止"; }); } else { showMessage("获取m3u8链接失败", "error"); } // domDownloadPanel.style.display = "none"; }) document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#download__copy").addEventListener("click", async () => { let hashid = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("share-hover").getAttribute("hashid"); let vid = $DATA.ROOM.vid; if (hashid !== vid) { showMessage("视频内容已改变,请刷新网页后重试", "error"); return; } showMessage("正在获取m3u8链接...", "info"); let dyVideoSign = new DyVideoSign($DATA.ROOM.point_id); let sign = dyVideoSign.getSign(); dyVideoSign = null; let ret = await getVideoStreamUrl(vid, sign); let url = ""; if ("super" in ret.data.thumb_video) { url = ret.data.thumb_video.super.url; } else if ("high" in ret.data.thumb_video) { url = ret.data.thumb_video.high.url; } else if ("normal" in ret.data.thumb_video) { url = ret.data.thumb_video.normal.url; } else { let keys = Object.keys(ret.data.thumb_video); url = keys.length > 0 ? ret.data.thumb_video[keys[0]].url : ""; } if (url !== "") { GM_setClipboard(url); showMessage("复制成功,可将链接复制到第三方下载器中下载", "success"); } else { showMessage("获取m3u8链接失败", "error"); } // domDownloadPanel.style.display = "none"; }) document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#download__barrage").addEventListener("click", async () => { let videoTitle = document.getElementsByTagName("demand-video-title")[0].shadowRoot.querySelector(".Title-Main").innerText; let hashid = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("share-hover").getAttribute("hashid"); showMessage("正在获取弹幕数据,请勿切换页面...", "info"); let pre = 0; let header = ["vid", "hashid", "uid", "昵称", "弹幕", "时间", "发送时间"]; let body = []; do { let data = await getVideoBarrageByTime(hashid, pre); pre = data.data.pre; for (let i = 0; i < data.data.list.length; i++) { let item = data.data.list[i]; body.push([item.vid, hashid, item.uid, item.nn, item.ctt, formatSeconds2(item.tl / 1000), dateFormat("yyyy-MM-dd hh:mm:ss", new Date(item.sts * 1000))]); } } while (pre >= 0); exportJsonToExcel(header, body, `【${videoTitle}】弹幕数据.xlsx`); }) document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("#download__barrageass").addEventListener("click", async () => { let videoTitle = document.getElementsByTagName("demand-video-title")[0].shadowRoot.querySelector(".Title-Main").innerText; let hashid = document.getElementsByTagName("demand-video-toolbar")[0].shadowRoot.querySelector("share-hover").getAttribute("hashid"); showMessage("正在获取弹幕数据,请勿切换页面...", "info"); let pre = 0; let ass = new ASS({title: videoTitle}); let list = []; do { let data = await getVideoBarrageByTime(hashid, pre); pre = data.data.pre; for (let i = 0; i < data.data.list.length; i++) { let item = data.data.list[i]; list.push({ time: Number(item.tl), txt: item.ctt, color: item.col, }); } } while (pre >= 0); let result = ass.generate(list); downloadFile(`${videoTitle}.ass`, result); }) } function initPkg_ExIcon() { initPkg_ExIcon_insertDom(); initPkg_ExIcon_Func(); } function initPkg_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 initPkg_ExIcon_Func() { document.getElementsByClassName("ex-icon")[0].addEventListener("click", 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_Module(); } function initPkg_ExpandTool_Module() { // initPkg_ExpandTool_RedPacket_Motorcade(); initPkg_ExpandTool_Treasure(); initPkg_ExpandTool_Gold(); initPkg_ExpandTool_RedPacket_Room(); initPkg_ExpandTool_ClearBag(); initPkg_ExpandTool_SendGift(); // initPkg_ExpandTool_BarrageSize(); initPkg_ExpandTool_P2P(); } 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() { showExRightPanel("扩展功能"); }); } function initPkg_ExpandTool_BarrageSize() { 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) { cancelBarrageSize(); StyleHook_set("Ex_Style_DanmuSize", ".danmuItem-31f924{font-size:" + s + "px !important;}"); } function cancelBarrageSize() { StyleHook_remove("Ex_Style_DanmuSize"); } 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) }) } let user_name; let animationNum = 0; let goldBarrageHook; let goldBarrageListHook; let goldGiftHook; function initPkg_ExpandTool_Gold() { ExpandTool_Gold_insertDom(); ExpandTool_Gold_insertGiftDom(); ExpandTool_Gold_insertFunc(); ExpandTool_Gold_Set(); } function ExpandTool_Gold_insertDom() { let html = ""; html += ''; html += ''; let a = document.createElement("div"); a.className = "extool__gold"; a.innerHTML = html; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_Gold_insertGiftDom() { let a = document.createElement("div"); a.className = "ex_giftAnimation"; let b = document.getElementsByClassName("Barrage-main")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_Gold_insertFunc() { document.getElementById("extool__gold_start").addEventListener("click", async function() { let ischecked = document.getElementById("extool__gold_start").checked; if (ischecked == true) { // 开启幻神模式 danmu-6e95c1 goldBarrageHook = new DomHook(".danmu-e7f029", true, goldBarrage); goldBarrageListHook = new DomHook(".Barrage-list", true, goldBarrageList); goldFansMedal(); } else{ // 停止幻神模式 goldBarrageHook.closeHook(); goldBarrageListHook.closeHook(); } saveData_Gold(); }); document.getElementById("extool__goldGift_start").addEventListener("click", async function() { user_name = await getUserName(); let ischecked = document.getElementById("extool__goldGift_start").checked; if (ischecked == true) { goldGiftHook = new DomHook(".BarrageBanner", true, fansToSuperRocket); } else{ goldGiftHook.closeHook(); } saveData_GoldGift(); }); } function saveData_Gold() { let isGold = document.getElementById("extool__gold_start").checked; let data = { isGold: isGold } localStorage.setItem("ExSave_Gold", JSON.stringify(data)); // 存储弹幕列表 } function saveData_GoldGift() { let isGoldGift = document.getElementById("extool__goldGift_start").checked; let data = { isGoldGift: isGoldGift } localStorage.setItem("ExSave_GoldGift", JSON.stringify(data)); // 存储弹幕列表 } function ExpandTool_Gold_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Gold"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isGold == true) { document.getElementById("extool__gold_start").click(); } } ret = localStorage.getItem("ExSave_GoldGift"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isGoldGift == true) { document.getElementById("extool__goldGift_start").click(); } } } function goldBarrageList(m) { if (m.length == 0) { return; } if (m[0].addedNodes.length == 0) { return; } let itemNode = m[0].addedNodes[0]; let chatArea = itemNode.lastElementChild; if (chatArea != null && chatArea.innerHTML.indexOf("is-self") != -1) { let barrageListTimeout = setTimeout(() => { itemNode.className = "Barrage-listItem js-noblefloating-barrage"; chatArea.className = "js-noblefloating-barragecont Barrage-notice--noble"; chatArea.setAttribute('style','background-color: #fff3df'); let nickNameObj = chatArea.getElementsByClassName("Barrage-nickName")[0]; nickNameObj.setAttribute('class','Barrage-nickName is-self js-nick'); let userLevelObj = chatArea.querySelector(".UserLevel"); if( userLevelObj!=null){ userLevelObj.className = "UserLevel UserLevel--150"; userLevelObj.setAttribute("title", "用户等级:150"); } let roomLevelObj = chatArea.querySelector(".RoomLevel"); if( roomLevelObj!=null){ roomLevelObj.className = "RoomLevel RoomLevel--18"; roomLevelObj.setAttribute("title","房间等级:18"); } let fansMedal = itemNode.querySelector(".FansMedal"); if(fansMedal!=null){ fansMedal.style = "display:none;"; } let fansMedalName = document.getElementsByClassName("FansMedal-name")[0];//fans medal let fansBackgroundImg = document.getElementsByClassName("DiamondsFansRankList-item DiamondsFansRankList-item--top")[0]; if(fansMedalName){ let fansTag = document.createElement("div"); let fansSpan = document.createElement("span"); fansTag.className="FansMedal level-50 js-fans-dysclick Barrage-icon"; // fansTag.setAttribute("data-rid",roomId);//id is same to roomId fansSpan.className = "FansMedal-name js-fans-dysclick"; // fansSpan.setAttribute("data-rid",roomId); fansSpan.innerHTML = fansMedalName.innerText; fansTag.appendChild(fansSpan); chatArea.insertBefore(fansTag,chatArea.querySelector(".UserLevel")); // if(fansBackgroundImg && fansBackgroundImg.innerHTML.indexOf("background-image:")==-1){//common fans medal // let fansTag = document.createElement("div"); // let fansSpan = document.createElement("span"); // fansTag.className="FansMedal level-50 js-fans-dysclick Barrage-icon"; // // fansTag.setAttribute("data-rid",roomId);//id is same to roomId // fansSpan.className = "FansMedal-name js-fans-dysclick"; // // fansSpan.setAttribute("data-rid",roomId); // fansSpan.innerHTML = fansMedalName.innerText; // fansTag.appendChild(fansSpan); // chatArea.insertBefore(fansTag,chatArea.querySelector(".UserLevel")); // }else{//special fans medal // let fansTag1 = document.createElement("div"); // fansTag1.className="FansMedal is-made js-fans-dysclick Barrage-icon"; // fansTag1.setAttribute("style", fansBackgroundImg.getElementsByClassName("FansMedal is-made")[0].getAttribute("style") ); // // fansTag1.setAttribute("data-rid",roomId); // let fansSpan1 = document.createElement("span"); // fansSpan1.className = "FansMedal-name js-fans-dysclick"; // // fansSpan1.setAttribute("data-rid",roomId); // fansSpan1.innerHTML = fansMedalName.innerText; // fansTag1.appendChild(fansSpan1); // chatArea.insertBefore(fansTag1,chatArea.querySelector(".UserLevel")); // } }else{//point to a fans medal when room have none of fans medal let fansTag2 = document.createElement("div"); fansTag2.className="FansMedal level-50 js-fans-dysclick Barrage-icon"; fansTag2.setAttribute("data-rid","5189167"); let fansSpan2 = document.createElement("span"); fansSpan2.className = "FansMedal-name js-fans-dysclick"; fansSpan2.setAttribute("data-rid","5189167"); fansSpan2.innerHTML = "歆崽"; fansTag2.appendChild(fansSpan2); chatArea.insertBefore(fansTag2,chatArea.querySelector(".UserLevel")); } let nobleIconObj = itemNode.querySelector(".Barrage-nobleImg"); if(nobleIconObj != null){ nobleIconObj.src = "//res.douyucdn.cn/resource/2019/08/15/common/4e85776071ffbae2867bb9d116e9a43c.gif"; nobleIconObj.title = "幻神" } else { let royalTag = document.createElement("span"); let royalImg = document.createElement("img"); royalTag.className = "Barrage-icon Barrage-noble"; royalImg.className = "Barrage-nobleImg"; royalImg.setAttribute("src", "//res.douyucdn.cn/resource/2019/08/15/common/4e85776071ffbae2867bb9d116e9a43c.gif"); royalImg.setAttribute("title", "幻神"); royalTag.appendChild(royalImg); chatArea.insertBefore(royalTag, chatArea.firstElementChild); } clearTimeout(barrageListTimeout); }, 100); } } function goldFansMedal() { document.getElementsByClassName("FansMedalEnter-enterContent")[0].setAttribute("data-medal-level","50"); } function goldBarrage(m) { if (m.length == 0) { return; } if (m[0].addedNodes.length == 0) { return; } let itemNode = m[0].addedNodes[0]; if(itemNode.className.indexOf("noble-f439ef")==-1 && itemNode.innerHTML.indexOf("border: 2px solid rgb(2, 255, 255)")!=-1){//find self and remove redupliction itemNode.style.zIndex = "30"; itemNode.className = "danmuItem-f8e204 noble-f439ef"; // itemNode.setAttribute("style",characterStyle); //noble icon without redupliction remove let nobleImgTag = document.createElement("img"); nobleImgTag.className = "super-noble-icon-54c62c"; nobleImgTag.setAttribute("src","https://shark2.douyucdn.cn/front-publish/live_player-master/assets/images/h1_dcd226.png"); nobleImgTag.setAttribute("style","margin-left: -57px; margin-top: -4px;"); itemNode.insertBefore(nobleImgTag,itemNode.firstElementChild); //user avatar img let userIconTag = document.createElement("img"); userIconTag.className = "super-user-icon-253711"; let userIconObj = document.getElementsByClassName("Avatar is-circle")[0]; if(userIconObj !=undefined){ userIconObj = userIconObj.getElementsByTagName("img")[0].getAttribute("src"); userIconTag.setAttribute("src", userIconObj.replace((new RegExp("_middle")),"_small")); }else{ // console.error("未能获取到用户头像"); } itemNode.insertBefore(userIconTag,itemNode.firstElementChild); //remove out tail tag let tailTag = itemNode.getElementsByClassName("afterpic-f864c2")[0]; tailTag.remove(); //transform barrage effect let textContent = itemNode.getElementsByClassName("text-edf4e7")[0]; textContent.className = "super-text-188279"; textContent.setAttribute("style","font: bold 23px SimHei, 'Microsoft JhengHei', Arial, Helvetica, sans-serif; color: rgb(255, 255, 255); background: url('https://shark2.douyucdn.cn/front-publish/live_player-master/assets/images/h2_8e5e64.png'); height: 44px;"); //add tag tail includes fire icon or sign icon let afterpicTag = document.createElement("div"); afterpicTag.setAttribute("class","afterpic-f864c2"); afterpicTag.setAttribute("style","margin-top: 7px; margin-left: -1px;");// afterpicTag.setAttribute("style","margin-top: 7px; margin-left: -43px;"); textContent.appendChild(afterpicTag); //tail icon let superTailImg = document.createElement("img"); superTailImg.className = "super-tail-6a0446"; superTailImg.setAttribute("src","https://shark2.douyucdn.cn/front-publish/live_player-master/assets/images/h3_fd2e5b.png"); itemNode.appendChild(superTailImg); console.log(superTailImg) } } function fansToSuperRocket(m) { if (m.length == 0) { return; } if (m[0].addedNodes.length == 0) { return; } let dom_gift = m[0].addedNodes[0]; if (dom_gift.getElementsByClassName("Banner4gift-senderName")[0].title == user_name) { let giftName = dom_gift.getElementsByClassName("Banner4gift-objectName")[0].title; if (giftName == "粉丝荧光棒") { dom_gift.className = "Banner4gift Banner4gift--size2"; dom_gift.getElementsByClassName("Banner4gift-bg")[0].src = "https://gfs-op.douyucdn.cn/dygift/2019/03/15/6651f2de52dd359c7b553a77b9d00020.png"; // 修改横幅 dom_gift.getElementsByClassName("Banner4gift-objectName")[0].title = "超级火箭"; dom_gift.getElementsByClassName("Banner4gift-objectName")[0].innerText = "超级火箭"; dom_gift.getElementsByClassName("Banner4gift-headerImg")[0].src = "https://gfs-op.douyucdn.cn/dygift/2018/11/27/3adbb0c17d9886c1440d55c9711f4c79.gif"; // 修改gif if (document.getElementsByClassName("ex_giftAnimation_exist").length > 0) { return; } animationNum++; let a = document.createElement("div"); let idName = "ex_giftAnimation_" + String(animationNum); a.id = idName; a.className = "ex_giftAnimation_exist"; let b = document.getElementsByClassName("ex_giftAnimation")[0]; b.appendChild(a); let player = new SVGA.Player("#" + idName); let parser = new SVGA.Parser("#" + idName); parser.load('https://gfs-op.douyucdn.cn/dygift/2018/11/27/6c6349672e662750ad5c019b240d57f2.svga', (videoItem) => { player.setVideoItem(videoItem); player.startAnimation(); setTimeout(() => { player = null; parser = null; document.getElementById(idName).remove(); }, 4000); }); } } } function initPkg_ExpandTool_P2P() { ExpandTool_P2P_insertDom(); ExpandTool_P2P_insertFunc(); initPkg_ExpandTool_P2P_Set(); } function ExpandTool_P2P_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 getP2P() { return document.getElementById("extool__p2p").checked; } function ExpandTool_P2P_insertFunc() { document.getElementById("extool__p2p").addEventListener("click", function() { saveData_P2P(); if (getP2P()) { showMessage("阻止p2p上传成功,刷新页面生效", "success"); } }); } function saveData_P2P() { let data = { isKillP2P: getP2P() } localStorage.setItem("ExSave_P2P", JSON.stringify(data)); // 存储弹幕列表 } function initPkg_ExpandTool_P2P_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_P2P"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isKillP2P) { document.getElementById("extool__p2p").checked = retJson.isKillP2P; } } } function initKillP2P() { let ret = localStorage.getItem("ExSave_P2P"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isKillP2P) { killP2P(); } } } function killP2P() { let funNameList = [ 'RTCPeerConnection', 'webkitRTCPeerConnection', 'mozRTCPeerConnection', 'msRTCPeerConnectio', ] funNameList.forEach(name => { if (typeof unsafeWindow.RTCPeerConnection === "undefined") unsafeWindow.RTCPeerConnection = unsafeWindow[name]; if (typeof unsafeWindow[name] !== "undefined") unsafeWindow[name] = MyPeerConnection; }) function MyPeerConnection() { return undefined; } } 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", 6).then(r => { if (r == true) { let ischecked = document.getElementById("extool__redpacekt_room_start").checked; if (ischecked == true) { // 开始自动抢红包 redpacket_room_timer = setInterval(() => { getRoomRedPacketsList(rid); }, 60000); } else{ // 停止自动抢红包 clearInterval(redpacket_room_timer); } saveData_RedPacket_Room(); } else { document.getElementById("extool__redpacekt_room_start").checked = false; showMessage("本功能需拥有6级歆崽粉丝牌(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", 6).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("本功能需拥有6级歆崽粉丝牌(5189167)才可使用", "error"); } }) } } } function initPkg_ExpandTool_SendGift() { ExpandTool_SendGift_insertDom(); ExpandTool_SendGift_insertFunc(); } function ExpandTool_SendGift_insertDom() { let html = ""; html += '礼物id示例
'; html += ''; 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", async () => { if (confirm("确认送出?") != true) { return; } let gid = document.getElementById("extool__sendgift_id").value; let gcnt = document.getElementById("extool__sendgift_cnt").value; let delay = Number(document.getElementById("extool__sendgift_delay").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); }) if (delay > 0) { await sleep(delay); } } 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(); }) } var isGetTreasure = false; function initPkg_ExpandTool_Treasure() { ExpandTool_Treasure_insertDom(); ExpandTool_Treasure_insertFunc(); ExpandTool_Treasure_Set(); } function ExpandTool_Treasure_insertDom() { let html = ""; html += ''; html += 'ms' html += '
rrocr秘钥:
'; let a = document.createElement("div"); a.className = "extool__treasure"; a.innerHTML = html; let b = document.getElementsByClassName("extool")[0]; b.insertBefore(a, b.childNodes[0]); } function ExpandTool_Treasure_insertFunc() { document.getElementById("extool__treasure_start").addEventListener("click", function() { verifyFans("5189167", 9).then(r => { // 请尊重作者劳动成果,在此感谢 if (r == true) { let ischecked = document.getElementById("extool__treasure_start").checked; if (ischecked == true) { // 开始 isGetTreasure = true; getTreasure_Existing(); } else{ // 停止 isGetTreasure = false; } saveData_Treasure(); } else { document.getElementById("extool__treasure_start").checked = false; showMessage("本功能需拥有9级歆崽粉丝牌(5189167)才可使用", "error"); } }) }); document.getElementById("extool__treasure_skey").addEventListener("change", () => { saveData_Treasure(); }) } function saveData_Treasure() { isGetTreasure = document.getElementById("extool__treasure_start").checked; let delay = document.getElementById("extool__treasure_delay").value; let skey = document.getElementById("extool__treasure_skey").value; let data = { isGetTreasure: isGetTreasure, treasureDelay: delay, skey: skey, } localStorage.setItem("ExSave_Treasure", JSON.stringify(data)); // 存储弹幕列表 } function ExpandTool_Treasure_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Treasure"); if (ret != null) { let retJson = JSON.parse(ret); if ("treasureDelay" in retJson == true) { document.getElementById("extool__treasure_delay").value = retJson.treasureDelay; } else { document.getElementById("extool__treasure_delay").value = "3200"; } if ("skey" in retJson == true) { document.getElementById("extool__treasure_skey").value = retJson.skey; } if (retJson.isGetTreasure == true) { verifyFans("5189167", 9).then(r => { if (r == true) { document.getElementById("extool__treasure_start").click(); } else { let data = { isGetTreasure: false } localStorage.setItem("ExSave_Treasure", JSON.stringify(data)); // 存储弹幕列表 showMessage("本功能需拥有9级歆崽粉丝牌(5189167)才可使用", "error"); } }) } } } function getTreasureDelay() { let ret = document.getElementById("extool__treasure_delay").value; return Number(ret); } function getTreasureSkey() { let ret = document.getElementById("extool__treasure_skey").value; return ret; } function getTreasure_Existing() { getTslist(data => { if (data == null) { return; } // let list = String(data.list).split("@S/"); for (let i = 0; i < data.list.length - 1; i++) { let item = data.list[i]; // let rpid = getStrMiddle(list[i], "rpid@A=", "@"); let rpid = item.rpid; // let ot = getStrMiddle(list[i], "Sot@A=", "@"); let ot = item.ot; let did = getCookieValue("dy_did"); let timeout = Number(ot) - Math.floor(Date.now()/1000); let a = document.createElement("div"); let idName = "Ex_Geetest_no" + String(treasureNum); a.id = idName; let b = document.getElementById("Ex_Geetest"); b.appendChild(a); if (timeout >= 0) { timeout = timeout * 1000 + getTreasureDelay(); treasureNum++; setTimeout(() => { getTreasure(rid, rpid, did, idName); }, timeout); } else { getTreasure(rid, rpid, did, idName); } } }); } function getTslist(callback) { unsafeWindow.socketProxy.socketStream.subscribe('tslist', callback); } function initPkg_ExPanel() { initPkg_ExPanel_insertDom(); } function initPkg_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_FansBadgeList() { // document.querySelectorAll(".fans-badge-list tr")[1].getAttribute("data-fans-gbdgts") let nowTime = new Date().getTime(); let items = document.querySelectorAll(".fans-badge-list tr"); if (items.length <= 1) { return; } // items[0].getElementsByTagName("th")[1].setAttribute("width", "30%"); // 跳过表头 for (let i = 1; i < items.length; i++) { let item = items[i]; let tt = Number(item.getAttribute("data-fans-gbdgts")) * 1000; let ttStr = dateFormat("yyyy-MM-dd hh:mm:ss",new Date(tt)); // 获取日期 let days = Math.floor((nowTime - tt) / 86400000); // 距今天数 let style = days >= 300 ? "font-weight:600;color:red;" : ""; // let className = days >= 300 ? "fansBadgeDays" : ""; let td = item.getElementsByTagName("td")[1]; // td.innerHTML += `获取于:${ttStr}(${days}天)`; td.innerHTML += ` 已获取 ${days}
${ttStr}`; // td.innerHTML += `于${ttStr}获取(${days}天)`; } } 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() { let sendNum = prompt("每个直播间赠送几根荧光棒?", "1"); if (sendNum == null) { return; } if (sendNum == "") { return; } let giftId = 0; getBagGifts(rid, (ret) => { let chunkNum = ret.data.list.length; if (chunkNum > 0) { for (let i = 0; i < chunkNum; i++) { if (ret.data.list[i].id == 268) { giftId = 268; break; } if (ret.data.list[i].id == 2358) { giftId = 2358; } } if (giftId == 0) { showMessage("没有足够的道具", "error"); return; }; 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(250).then(() => { sendGift_bag(giftId, Number(sendNum), 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); }) } else { showMessage("背包礼物为空", "error"); } }); }); } 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_FirePower() { initPkg_FirePower_Dom(); initPkg_FirePower_Func(); } function initPkg_FirePower_Dom() { FirePower_insertIcon(); } function FirePower_insertIcon() { let a = document.createElement("div"); a.className = "firepower"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_FirePower_Func() { document.getElementsByClassName("firepower")[0].addEventListener("click", function() { fetch('https://www.douyu.com/japi/firepower/apinc/activeTask/getRecRid', { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}, body: "token=" + getCCN() }).then(result => { return result.json(); }).then(ret => { let rid = ret.data; window.location.href = "https://www.douyu.com/" + rid; }).catch(err => { console.log("请求失败!", err); }) }); } let followListHook; function initPkg_FollowList() { let intID = setInterval(() => { if (typeof(document.getElementsByClassName("PlayerToolbar-wealthNum")[0]) != "undefined") { followListHook = new DomHook(".Header-follow-content", false, handleFollowList); clearInterval(intID); } }, 1000); } function handleFollowList(m) { let active = document.getElementsByClassName("Header-follow-tab is-active")[0].innerText; if (active === "特别关注" || active === "视频动态") { return; } let panel = document.getElementsByClassName("Header-follow-listWrap"); if (panel.length == 0) { return; } // panel[0].style.marginTop = "12px"; document.getElementsByClassName("Header-follow-listBox")[0].style.display = "none"; setNewFollowList(panel[0]); } async function setNewFollowList(panel) { let followList = await getFollowList(); if (followList.error != "0") { return; } const FOLLOWLIST_LIMIT = 10; // 关注列表最多显示个数 let limit = 0; let html = `
长按弹出同屏播放
`; let nowTime = Math.floor(Date.now()/1000); for (let i = 0; i < followList.data.list.length; i++) { let item = followList.data.list[i]; if (item.show_status == "1" && item.videoLoop == "0") { // 开播且非录播 html += `
  • ${ item.nickname }

    ${ item.online }${ item.room_name }

    ${ item.nickname }已播${ formatSeconds(nowTime - Number(item.show_time)) }

  • ` // html += `
  • ${ item.nickname }

    ${ item.online }${ item.room_name }

    ${ item.nickname }已播${ formatSeconds(nowTime - Number(item.show_time)) }

  • ` limit++; } if (limit >= FOLLOWLIST_LIMIT) { break; } } panel.innerHTML += html; let followListItems = document.getElementsByClassName("ExFollowListItem"); for (let i = 0; i < followListItems.length; i++) { let cclick = new CClick(followListItems[i]); cclick.longClick(() => { createNewVideo(videoPlayerArr.length, followListItems[i].getAttribute("rid"), "Douyu"); document.querySelector(".Follow .public-DropMenu").className = "public-DropMenu"; }); cclick.click(() => { openPage("https://www.douyu.com/" + followListItems[i].getAttribute("rid"), true); }); followListItems[i].addEventListener("mousedown", (event) => { if (event.button == 1) { // 鼠标中键 openPage("https://www.douyu.com/" + followListItems[i].getAttribute("rid"), false); } }) } } function getFollowList() { return new Promise(resolve => { fetch("https://www.douyu.com/wgapi/livenc/liveweb/follow/list?sort=1&cid1=0", { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } async function initPkg_LevelTask_Timer() { let ids = await getLevelTaskIds(rid); let tasks = await getLevelTasks(ids); for (let i = 0; i < tasks.length; i++) { const task = tasks[i]; const taskId = task.taskId; const taskName = task.name const taskStatus = task.taskStatus; const prizeStatus = task.prizeStatus; if (taskStatus == 1 && prizeStatus == 0) { let result = await finishLevelTask(rid, taskId); for (let j = 0; j < result.length; j++) { showMessage(`【等级任务】${taskName} 获得${result[j].name}${result[j].num}`, "success"); } } } } function getLevelTaskIds(rid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/japi/interactnc/web/userLevel/userLevelDetail?rid=" + rid, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then(res => { return res.json(); }).then(ret => { let ids = ret.data.taskIds.join(","); resolve(ids); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } function getLevelTasks(ids) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/japi/tasksys/userLevelTask/getTaskStatus?taskIds=" + ids, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then(res => { return res.json(); }).then(ret => { resolve(ret.data.list); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } function finishLevelTask(rid, taskid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/japi/tasksys/userLevelTask/getPrize", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `ctn=${getCCN()}&taskIds=${taskid}&roomId=${rid}` }).then(res => { return res.json(); }).then(ret => { resolve(ret.data.list); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } let barrageSpeed_count = 0; function initPkg_LiveTool_BarrageSpeed() { // LiveTool_BarrageSpeed_Dom(); setInterval(() => { let barrageSpeed = Number((barrageSpeed_count / 5) * 60).toFixed(0); barrageSpeed_count = 0; document.getElementsByClassName("ChatSend-txt")[0].placeholder = "弹幕时速:" + barrageSpeed + "条/分"; // document.getElementsByClassName("barrageSpeed__value")[0].innerText = barrageSpeed; }, 5000) } function LiveTool_BarrageSpeed_Dom() { let a = document.createElement("div"); a.className = "barrageSpeed"; let html = ` 弹幕时速:**条/分 ` a.innerHTML = html; let b = document.getElementsByClassName("Chat")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_LiveTool_BarrageSpeed_Handle(text) { if (getType(text) == "chatmsg") { barrageSpeed_count++; } } let isEnterOn = false; let enterWordList = {}; function initPkg_LiveTool_Enter() { LiveTool_Enter_insertDom(); LiveTool_Enter_insertFunc(); initPkg_Enter_Set(); } function LiveTool_Enter_insertDom() { let a = document.createElement("div"); a.className = "livetool__cell"; let cell = `
    进场欢迎 导出 导入
    `; let panel = `
    `; a.innerHTML = cell + panel; let b = document.getElementsByClassName("livetool")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_Enter_insertFunc() { document.getElementById("enter__export").addEventListener("click", () => { GM_setClipboard(JSON.stringify(enterWordList)); showMessage("【进场欢迎】导出完毕,已复制到剪贴板", "success"); }); document.getElementById("enter__import").addEventListener("click", () => { PostbirdAlertBox.prompt({ 'title': "请输入json文本(会覆盖原来的设置)", 'okBtn': '确定', onConfirm: function (data) { let select_wordList = document.getElementById("enter__select"); let obj = JSON.parse(data || "{}") || {}; if (typeof obj == "object") { enterWordList = {...obj}; select_wordList.options.length = 0; for (let key in enterWordList) { if (enterWordList.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } saveData_Enter(); } showMessage("【进场欢迎】导入完毕", "success"); }, onCancel: function (data) { }, }); }); document.getElementById("enter__switch").addEventListener("click", () => { let ischecked = document.getElementById("enter__switch").checked; if (ischecked == true) { // 开启关键词禁言 isEnterOn = true; } else{ // 关闭关键词禁言 isEnterOn = false; } saveData_isEnter(); }); document.getElementById("enter__title").addEventListener("click", () => { let a = document.getElementsByClassName("enter__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("mute__panel")[0].style.display == "block") { document.getElementsByClassName("mute__panel")[0].style.display = "none"; } if (document.getElementsByClassName("reply__panel")[0].style.display == "block") { document.getElementsByClassName("reply__panel")[0].style.display = "none"; } if (document.getElementsByClassName("gift__panel")[0].style.display == "block") { document.getElementsByClassName("gift__panel")[0].style.display = "none"; } if (document.getElementsByClassName("vote__panel")[0].style.display == "block") { document.getElementsByClassName("vote__panel")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("enter__select").onclick = function() { if (this.options.length == 0) { return; } let word = this.options[this.selectedIndex].text; let level = enterWordList[word].enter; document.getElementById("enter__word").value = word; document.getElementById("enter__level").value = level; localStorage.setItem("ExSave_LastEnterWord", word); // 存储弹幕列表 }; document.getElementById("enter__add").addEventListener("click", () => { let select_wordList = document.getElementById("enter__select"); let word = document.getElementById("enter__word").value; let level = document.getElementById("enter__level").value; if (word == "") { return; } if (level == "") { return; } // 构造json并添加json enterWordList[word] = { enter: Number(level), } // 添加到select中去 select_wordList.options.add(new Option(word, "")); saveData_Enter(); }); document.getElementById("enter__del").addEventListener("click", () => { let select_wordList = document.getElementById("enter__select"); let word = select_wordList.options[select_wordList.selectedIndex].text; // 删除json内的对象 delete enterWordList[word]; // 删除select里的option select_wordList.options.remove(select_wordList.selectedIndex); saveData_Enter(); }); } function saveData_Enter() { let data = enterWordList; localStorage.setItem("ExSave_Enter", JSON.stringify(data)); // 存储弹幕列表 } function saveData_isEnter() { let ridArr = []; let ret = localStorage.getItem("ExSave_isEnter"); if (ret != null) { let retJson = JSON.parse(ret); if ("rooms" in retJson == true) { ridArr = retJson.rooms; } } let index = ridArr.indexOf(rid); if (isEnterOn == true) { if (index == -1) { ridArr.push(rid); } } else { ridArr.splice(index, 1); } let data = { rooms: ridArr, }; localStorage.setItem("ExSave_isEnter", JSON.stringify(data)); // 存储弹幕列表 } function initPkg_Enter_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Enter"); if (ret == "") { return; } let select_wordList = document.getElementById("enter__select"); if (ret != null) { let retJson = JSON.parse(ret); enterWordList = retJson; for (let key in retJson) { if (retJson.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } } ret = localStorage.getItem("ExSave_LastEnterWord"); if (ret != null) { let i = 0; for (const key in enterWordList) { if (key == ret) { select_wordList.selectedIndex = i; let level = enterWordList[ret].enter; document.getElementById("enter__word").value = ret; document.getElementById("enter__level").value = level; break; } i++; } } ret = localStorage.getItem("ExSave_isEnter"); if (ret != null) { let retJson = JSON.parse(ret); let ridArr = []; if ("rooms" in retJson == true) { ridArr = retJson.rooms; } if (ridArr.indexOf(rid) == -1) { isEnterOn = false; } else { isEnterOn = true; } document.getElementById("enter__switch").checked = isEnterOn; } else { isEnterOn = false; document.getElementById("enter__switch").checked = isEnterOn; } } function initPkg_LiveTool_Enter_Handle(text) { if (isEnterOn == false) { return; } if (getType(text) == "uenter") { let uid = getStrMiddle(text, "uid@=", "/"); if (uid == my_uid) { // 不算自己 return; } let nn = getStrMiddle(text, "nn@=", "/"); let level = getStrMiddle(text, "level@=", "/"); let select_wordList = document.getElementById("enter__select"); let reply = select_wordList.options[select_wordList.selectedIndex].text; let levelLimit = enterWordList[reply].enter; if (Number(level) < Number(levelLimit)) { return; } reply = String(reply).replace(//g, nn); sendBarrage(reply); } } let isGiftOn = false; let giftWordList = {}; function initPkg_LiveTool_Gift() { LiveTool_Gift_insertDom(); LiveTool_Gift_insertFunc(); initPkg_Gift_Set(); } function LiveTool_Gift_insertDom() { let a = document.createElement("div"); a.className = "livetool__cell"; let cell = `
    自动谢礼物 导出 导入
    `; let panel = `
    `; a.innerHTML = cell + panel; let b = document.getElementsByClassName("livetool")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_Gift_insertFunc() { document.getElementById("reply__show_gid").addEventListener("click", () => { console.log(` 背包礼物:http://webconf.douyucdn.cn/resource/common/prop_gift_list/prop_gift_config.json 鱼翅礼物:http://open.douyucdn.cn/api/RoomApi/room/5189167 `); showMessage("请按F12到控制台(console)查看礼物id", "success"); }); document.getElementById("gift__switch").addEventListener("click", () => { let ischecked = document.getElementById("gift__switch").checked; if (ischecked == true) { // 开启关键词禁言 isGiftOn = true; } else{ // 关闭关键词禁言 isGiftOn = false; } saveData_isGift(); }); document.getElementById("gift__title").addEventListener("click", () => { let a = document.getElementsByClassName("gift__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("mute__panel")[0].style.display == "block") { document.getElementsByClassName("mute__panel")[0].style.display = "none"; } if (document.getElementsByClassName("enter__panel")[0].style.display == "block") { document.getElementsByClassName("enter__panel")[0].style.display = "none"; } if (document.getElementsByClassName("reply__panel")[0].style.display == "block") { document.getElementsByClassName("reply__panel")[0].style.display = "none"; } if (document.getElementsByClassName("vote__panel")[0].style.display == "block") { document.getElementsByClassName("vote__panel")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("gift__select").onclick = function() { if (this.options.length == 0) { return; } let giftId = this.options[this.selectedIndex].text; let reply = giftWordList[giftId].reply; document.getElementById("gift__giftId").value = giftId; document.getElementById("gift__reply").value = reply; }; document.getElementById("gift__add").addEventListener("click", () => { let select_wordList = document.getElementById("gift__select"); let giftId = document.getElementById("gift__giftId").value; let reply = document.getElementById("gift__reply").value; if (giftId == "") { return; } // 构造json并添加json giftWordList[giftId] = { reply: reply, } // 添加到select中去 select_wordList.options.add(new Option(giftId, "")); saveData_Gift(); }); document.getElementById("gift__del").addEventListener("click", () => { let select_wordList = document.getElementById("gift__select"); let giftId = select_wordList.options[select_wordList.selectedIndex].text; // 删除json内的对象 delete giftWordList[giftId]; // 删除select里的option select_wordList.options.remove(select_wordList.selectedIndex); saveData_Gift(); }); document.getElementById("gift__export").addEventListener("click", () => { GM_setClipboard(JSON.stringify(giftWordList)); showMessage("【自动谢礼物】导出完毕,已复制到剪贴板", "success"); }); document.getElementById("gift__import").addEventListener("click", () => { PostbirdAlertBox.prompt({ 'title': "请输入json文本(会覆盖原来的设置)", 'okBtn': '确定', onConfirm: function (data) { let select_wordList = document.getElementById("gift__select"); let obj = JSON.parse(data || "{}") || {}; if (typeof obj == "object") { giftWordList = {...obj}; select_wordList.options.length = 0; for (let key in giftWordList) { if (giftWordList.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } saveData_Gift(); } showMessage("【自动谢礼物】导入完毕", "success"); }, onCancel: function (data) { }, }); }); document.getElementById("gift__template").addEventListener("click", () => { setAllGiftTemplate(); }) } function saveData_Gift() { let data = giftWordList; localStorage.setItem("ExSave_Gift", JSON.stringify(data)); // 存储弹幕列表 } function saveData_isGift() { let ridArr = []; let ret = localStorage.getItem("ExSave_isGift"); if (ret != null) { let retJson = JSON.parse(ret); if ("rooms" in retJson == true) { ridArr = retJson.rooms; } } let index = ridArr.indexOf(rid); if (isGiftOn == true) { if (index == -1) { ridArr.push(rid); } } else { ridArr.splice(index, 1); } let data = { rooms: ridArr, }; localStorage.setItem("ExSave_isGift", JSON.stringify(data)); // 存储弹幕列表 } function initPkg_Gift_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Gift"); if (ret != null) { let retJson = JSON.parse(ret); giftWordList = retJson; let select_wordList = document.getElementById("gift__select"); for (let key in retJson) { if (retJson.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } } ret = localStorage.getItem("ExSave_isGift"); if (ret != null) { let retJson = JSON.parse(ret); let ridArr = []; if ("rooms" in retJson == true) { ridArr = retJson.rooms; } if (ridArr.indexOf(rid) == -1) { isGiftOn = false; } else { isGiftOn = true; } document.getElementById("gift__switch").checked = isGiftOn; } else { isGiftOn = false; document.getElementById("gift__switch").checked = isGiftOn; } } function initPkg_LiveTool_Gift_Handle(text) { if (isGiftOn == false) { return; } let typeName = getType(text); if (typeName === "dgb") { let uid = getStrMiddle(text, "uid@=", "/"); if (uid == my_uid) { // 不算自己 return; } let nn = getStrMiddle(text, "nn@=", "/"); let gfid = getStrMiddle(text, "gfid@=", "/"); let gfcnt = getStrMiddle(text, "gfcnt@=", "/"); if (gfid in giftWordList) { let reply = giftWordList[gfid].reply; reply = String(reply).replace(//g, nn); reply = String(reply).replace(//g, gfcnt); sendBarrage(reply); } } else if (typeName === "odfbc" || typeName === "rndfbc") { let uid = getStrMiddle(text, "uid@=", "/"); if (uid == my_uid) { // 不算自己 return; } let nn = getStrMiddle(text, "nick@=", "/"); let gfid = typeName === "odfbc" ? "开通钻粉" : "续费钻粉"; let gfcnt = "1"; if (gfid in giftWordList) { let reply = giftWordList[gfid].reply; reply = String(reply).replace(//g, nn); reply = String(reply).replace(//g, gfcnt); sendBarrage(reply); } } } async function setAllGiftTemplate() { let ret = {}; let roomGiftObj = {}; let roomGift = await getRoomGiftTemplate(); for (let i = 0; i < roomGift.data.gift.length; i++) { let item = roomGift.data.gift[i]; roomGiftObj[item.id] = { reply: `感谢赠送的${item.name}x` }; } let bagGift = await getBagGiftTemplate(); let bagGiftObj = {}; bagGift = bagGift.substring(0, bagGift.length - 2); bagGift = bagGift.replace("DYConfigCallback(", ""); bagGift = JSON.parse(bagGift || "{}") || {}; for (const key in bagGift.data) { bagGiftObj[key] = { reply: `感谢赠送的${bagGift.data[key].name}x` }; } let diamondObj = { "开通钻粉": { reply: `感谢开通钻粉`, }, "续费钻粉": { reply: `感谢续费钻粉`, }, } ret = {...roomGiftObj, ...bagGiftObj, ...diamondObj}; GM_setClipboard(JSON.stringify(ret)); showMessage("【自动谢礼物】礼物模板生成完毕,已复制到剪贴板,可直接导入", "success"); } function getRoomGiftTemplate() { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "http://open.douyucdn.cn/api/RoomApi/room/" + rid, responseType: "json", onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function getBagGiftTemplate() { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "http://webconf.douyucdn.cn/resource/common/prop_gift_list/prop_gift_config.json", responseType: "text", onload: function(response) { let ret = response.response; resolve(ret); } }); }) } let timer_closing; let closingNum = 0; function initPkg_LiveTool_LiveNotice() { } function initPkg_LiveTool_LiveNotice_Handle(text) { if (getType(text) == "rss") { let rid = getStrMiddle(text, "rid@=", "/"); let ss = getStrMiddle(text, "ss@=", "/"); if (ss == "1") { showMessageWindow("开播提醒", "直播间:" + rid + "开播了,点我签到", () => { signRoom(rid); }); } } } function getRoomAvatar() { fetch('https://www.douyu.com/betard/' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { roomAvatar = ret.room.avatar.middle; }).catch(err => { console.log("请求失败!", err); }) } function initPkg_LiveTool() { initPkg_LiveTool_Dom(); initPkg_LiveTool_Module(); initPkg_LiveTool_Func(); initPkg_LiveTool_HandleFunc(); } function initPkg_LiveTool_Dom() { LiveTool_insertModal(); LiveTool_insertIcon(); } function initPkg_LiveTool_Module() { // 添加模块 initPkg_LiveTool_Vote(); initPkg_LiveTool_Enter(); initPkg_LiveTool_Mute(); initPkg_LiveTool_Gift(); initPkg_LiveTool_Reply(); initPkg_LiveTool_Treasure(); initPkg_LiveTool_BarrageSpeed(); initPkg_LiveTool_RankList(); // initPkg_LiveTool_Bojiang_Handle(); } function LiveTool_insertModal() { let a = document.createElement("div"); a.className = "livetool"; let b = document.getElementsByClassName("layout-Player-chat")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_insertIcon() { let a = document.createElement("div"); a.className = "livetool-icon"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_LiveTool_Func() { document.getElementsByClassName("livetool-icon")[0].addEventListener("click", function() { showExRightPanel("直播间工具"); }); } function initPkg_LiveTool_HandleFunc() { // 开启ws,并且设置处理函数的入口 // 是否生效由每个处理函数决定,可以设置一个变量保存开启状态,判断是否要执行 let ws = new Ex_WebSocket_UnLogin(rid, (ret) => { initPkg_LiveTool_LiveNotice_Handle(ret); // 开播提醒 initPkg_LiveTool_Mute_Handle(ret); // 关键词禁言 initPkg_LiveTool_Reply_Handle(ret); // 关键词回复 initPkg_LiveTool_Gift_Handle(ret); // 自动谢礼物 initPkg_LiveTool_Treasure_Handle(ret); // 自动抢宝箱 initPkg_LiveTool_Enter_Handle(ret); // 自动欢迎 // initPkg_LiveTool_Friend_Handle(ret); initPkg_LiveTool_Vote_Handle(ret); // 投票 initPkg_LiveTool_BarrageSpeed_Handle(ret); // 弹幕时速 initPkg_LiveTool_RankList_Handle(ret); // 排行榜 }); } function getType(str) { return getStrMiddle(str, "type@=", "/"); } function selectOptionByValue(selectId, checkValue) { // 根据value值选择option let select = document.getElementById(selectId); for(let i=0; i 关键词禁言 名单 导出 导入
    `; let panel = `
    `; a.innerHTML = cell + panel; let b = document.getElementsByClassName("livetool")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_Mute_insertFunc() { document.getElementById("mute__export").addEventListener("click", () => { GM_setClipboard(JSON.stringify(muteWordList)); showMessage("【关键词禁言】导出完毕,已复制到剪贴板", "success"); }); document.getElementById("mute__import").addEventListener("click", () => { PostbirdAlertBox.prompt({ 'title': "请输入json文本(会覆盖原来的设置)", 'okBtn': '确定', onConfirm: function (data) { let select_wordList = document.getElementById("mute__select"); let obj = JSON.parse(data || "{}") || {}; if (typeof obj == "object") { muteWordList = {...obj}; select_wordList.options.length = 0; for (let key in muteWordList) { if (muteWordList.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } saveData_Mute(); } showMessage("【关键词禁言】导入完毕", "success"); }, onCancel: function (data) { }, }); }); document.getElementById("mute__idlist").addEventListener("click", () => { if (muteIdListShow.length == 0) { showMessage("暂无禁言名单", "warning"); return; } console.log("【禁言名单】"); for (let i = 0; i < muteIdListShow.length; i++) { let item = muteIdListShow[i]; console.log("id:【" + item.id + "】 | uid:" + item.uid + " | 弹幕:" + item.barrage + " | 检测次数:" + item.count + " | 禁言时长:" + item.time + "分钟 | 禁言时间:" + item.ts); } showMessage("禁言名单已经输出在控制台,请按F12查看", "success"); }); document.getElementById("mute__delmute").addEventListener("click", async () => { if (muteIdListShow.length == 0) { showMessage("暂无禁言名单", "warning"); return; } if (confirm("是否解禁名单上所有的id?") != true) { return; } for (let i = 0; i < muteIdListShow.length; i++) { let item = muteIdListShow[i]; let tmp = await deleteMuteUser(rid, item.uid); } showMessage("解除禁言完毕", "success"); }); document.getElementById("mute__switch").addEventListener("click", () => { let ischecked = document.getElementById("mute__switch").checked; if (ischecked == true) { // 开启关键词禁言 isMuteOn = true; } else{ // 关闭关键词禁言 isMuteOn = false; } saveData_isMute(); }); document.getElementById("mute__title").addEventListener("click", () => { let a = document.getElementsByClassName("mute__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("reply__panel")[0].style.display == "block") { document.getElementsByClassName("reply__panel")[0].style.display = "none"; } if (document.getElementsByClassName("enter__panel")[0].style.display == "block") { document.getElementsByClassName("enter__panel")[0].style.display = "none"; } if (document.getElementsByClassName("gift__panel")[0].style.display == "block") { document.getElementsByClassName("gift__panel")[0].style.display = "none"; } if (document.getElementsByClassName("vote__panel")[0].style.display == "block") { document.getElementsByClassName("vote__panel")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("mute__select").onclick = function() { if (this.options.length == 0) { return; } let word = this.options[this.selectedIndex].text; let count = muteWordList[word].count; let time = muteWordList[word].time; document.getElementById("mute__word").value = word; document.getElementById("mute__count").value = count; selectOptionByValue("mute__time", time); }; document.getElementById("mute__add").addEventListener("click", () => { let select_time = document.getElementById("mute__time"); let select_wordList = document.getElementById("mute__select"); let word = document.getElementById("mute__word").value; let count = document.getElementById("mute__count").value; let time = select_time.options[select_time.selectedIndex].value if (word == "") { return; } // 构造json并添加json muteWordList[word] = { count: count, time: time, } // 添加到select中去 select_wordList.options.add(new Option(word, "")); saveData_Mute(); }); document.getElementById("mute__del").addEventListener("click", () => { let select_wordList = document.getElementById("mute__select"); let word = select_wordList.options[select_wordList.selectedIndex].text; // 删除json内的对象 delete muteWordList[word]; // 删除select里的option select_wordList.options.remove(select_wordList.selectedIndex); saveData_Mute(); }); } function saveData_Mute() { let data = muteWordList; localStorage.setItem("ExSave_Mute", JSON.stringify(data)); // 存储弹幕列表 } function saveData_isMute() { let ridArr = []; let ret = localStorage.getItem("ExSave_isMute"); if (ret != null) { let retJson = JSON.parse(ret); if ("rooms" in retJson == true) { ridArr = retJson.rooms; } } let index = ridArr.indexOf(rid); if (isMuteOn == true) { if (index == -1) { ridArr.push(rid); } } else { ridArr.splice(index, 1); } let data = { rooms: ridArr, }; localStorage.setItem("ExSave_isMute", JSON.stringify(data)); // 存储弹幕列表 } async function initPkg_Mute_Set() { // canMute = await getRoomAdminStatus(); // 设置初始化 let ret = localStorage.getItem("ExSave_Mute"); if (ret != null) { let retJson = JSON.parse(ret); muteWordList = retJson; let select_wordList = document.getElementById("mute__select"); for (let key in retJson) { if (retJson.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } } ret = localStorage.getItem("ExSave_isMute"); if (ret != null) { let retJson = JSON.parse(ret); let ridArr = []; if ("rooms" in retJson == true) { ridArr = retJson.rooms; } if (ridArr.indexOf(rid) == -1) { isMuteOn = false; } else { isMuteOn = true; } document.getElementById("mute__switch").checked = isMuteOn; } else { isMuteOn = false; document.getElementById("mute__switch").checked = isMuteOn; } } async function initPkg_LiveTool_Mute_Handle(text) { // if (canMute != true) { // return; // } if (isMuteOn == false) { return; } // if (rid == "5189167") { // return; // } if (getType(text) == "chatmsg") { let uid = getStrMiddle(text, "uid@=", "/"); if (uid == my_uid) { // 不算自己 return; } let nn = getStrMiddle(text, "nn@=", "/"); let txt = getStrMiddle(text, "txt@=", "/"); let isConform = false; for (let key in muteWordList) { if (key == "") { continue; } if (key.indexOf("re(") != -1) { // 正则 let regStr = getStrMiddle(key, "re(", ")="); let strArr = key.split("=") if (strArr.length > 1) { let str = strArr[1]; let regObj = new RegExp(regStr, "g"); let result = regObj.exec(txt); if (result.length > 0) { if (result[0] == str) { isConform = true; } else { isConform = false; } } } } else { if (String(txt).indexOf(key) == -1) { // 没找到 isConform = false; } else { isConform = true; } } if (isConform == true) { let maxCount = muteWordList[key].count; let time = muteWordList[key].time; if (muteIdList.hasOwnProperty(nn)) { let nextCount = Number(muteIdList[nn].count) + 1; if (nextCount >= maxCount) { let tmp = await addMuteUser(rid, nn, time); showMessageWindow("禁言信息", "【" + nn + "】已被禁言" + time + "分钟" + "\n弹幕:" + txt, () => {}); let obj = { id: nn, uid: uid, barrage: txt, time: time, count: 1, ts: String(dateFormat("yyyy年MM月dd日hh时mm分ss秒 ",new Date())) }; muteIdListShow.push(obj); muteIdList[nn].count = 0; } else { muteIdList[nn].count = String(nextCount); } } else { let nextCount = 1; if (nextCount >= maxCount) { let tmp = await addMuteUser(rid, nn, time); showMessageWindow("禁言信息", "【" + nn + "】已被禁言" + time + "分钟" + "\n弹幕:" + txt, () => {}); let obj = { id: nn, uid: uid, barrage: txt, time: time, count: 1, ts: String(dateFormat("yyyy年MM月dd日hh时mm分ss秒 ",new Date())) }; muteIdListShow.push(obj); } else { muteIdList[nn] = { uid: uid, count: 1, } } } break; } } } } function addMuteUser(roomid, name, ban_time) { return new Promise(resolve => { fetch("https://www.douyu.com/room/roomSetting/addMuteUser", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'ban_nickname=' + name + '&room_id=' + roomid + '&ban_time=' + ban_time + '&reason=7' }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } function deleteMuteUser(roomid, uid) { return new Promise(resolve => { fetch("https://www.douyu.com/room/roomSetting/deleteMuteUser", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'room_id=' + roomid + '&uid=' + uid }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } function getRoomAdminStatus() { return new Promise(resolve => { fetch('https://www.douyu.com/japi/firepower/apinc/roomAdmin/getStatus?rid=' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { let result = false; if (ret.error == "0") { if (ret.data.has == "1") { result = true; } else { result = false; } } else { result = false; } resolve(result); }).catch(err => { console.log("请求失败!", err); }) }); } let rankListData = { day: {}, week: {}, all: {} }; function initPkg_LiveTool_RankList() { let a = new DomHook(".layout-Player-rankAll", false, (m) => { let dom = document.getElementsByClassName("RankAllMain-container"); if (dom.length > 0) { if (Object.keys(rankListData.all).length > 0) { setRankListData("all", document.querySelectorAll(".layout-Player-rankAll .ChatRankWeek-listItem--nickname")); } } }) } function initPkg_LiveTool_RankList_Handle(text) { if (getType(text) == "ranklist") { let data = stt_deserialize(text); if (data.list_day) { rankListData.day = getRankListData(data.list_day); setRankListData("day", document.querySelectorAll(".layout-Player-rank .ChatDayRank .ChatRankWeek-listItem--nickname")); } if (data.list) { rankListData.week = getRankListData(data.list); setRankListData("week", document.querySelectorAll(".layout-Player-rank .ChatRankWeek .ChatRankWeek-listItem--nickname")); } if (data.list_all) { rankListData.all = getRankListData(data.list_all); } setRankListData(); } } function setRankListData(rankItemType, rankItems) { if (!rankItems) return; for (let i = rankItemType === "week" ? 10 : 0; i < rankItems.length; i++) { let rankItem = rankItems[i]; let rankItemName = rankItem.innerHTML.split("${rankContent}`; } else { rankItem.innerHTML = `${rankItemName}${rankContent}`; } } } function getRankListData(list) { let obj = {}; for (let i = 0; i < list.length; i++) { let item = list[i]; obj[item.nickname] = Number(item.gold) / 100; } return obj; } let isReplyOn = false; let replyWordList = {}; let isReplyCD = false; let replyCd = 0; function initPkg_LiveTool_Reply() { LiveTool_Reply_insertDom(); LiveTool_Reply_insertFunc(); initPkg_Reply_Set(); } function LiveTool_Reply_insertDom() { let a = document.createElement("div"); a.className = "livetool__cell"; let cell = `
    关键词回复 导出 导入
    `; let panel = `
    `; a.innerHTML = cell + panel; let b = document.getElementsByClassName("livetool")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_Reply_insertFunc() { document.getElementById("reply__export").addEventListener("click", () => { GM_setClipboard(JSON.stringify(replyWordList)); showMessage("【关键词回复】导出完毕,已复制到剪贴板", "success"); }); document.getElementById("reply__import").addEventListener("click", () => { PostbirdAlertBox.prompt({ 'title': "请输入json文本(会覆盖原来的设置)", 'okBtn': '确定', onConfirm: function (data) { let select_wordList = document.getElementById("reply__select"); let obj = JSON.parse(data || "{}") || {}; if (typeof obj == "object") { replyWordList = {...obj}; select_wordList.options.length = 0; for (let key in replyWordList) { if (replyWordList.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } saveData_Reply(); } showMessage("【关键词回复】导入完毕", "success"); }, onCancel: function (data) { }, }); }); document.getElementById("reply__switch").addEventListener("click", () => { replyCd = String(document.getElementById("reply__time").value) || 0; let ischecked = document.getElementById("reply__switch").checked; if (ischecked == true) { // 开启关键词禁言 isReplyOn = true; } else{ // 关闭关键词禁言 isReplyOn = false; } saveData_isReply(); saveData_ReplyCd(); }); document.getElementById("reply__title").addEventListener("click", () => { let a = document.getElementsByClassName("reply__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("mute__panel")[0].style.display == "block") { document.getElementsByClassName("mute__panel")[0].style.display = "none"; } if (document.getElementsByClassName("enter__panel")[0].style.display == "block") { document.getElementsByClassName("enter__panel")[0].style.display = "none"; } if (document.getElementsByClassName("gift__panel")[0].style.display == "block") { document.getElementsByClassName("gift__panel")[0].style.display = "none"; } if (document.getElementsByClassName("vote__panel")[0].style.display == "block") { document.getElementsByClassName("vote__panel")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("reply__select").onclick = function() { if (this.options.length == 0) { return; } let word = this.options[this.selectedIndex].text; let reply = replyWordList[word].reply; document.getElementById("reply__word").value = word; document.getElementById("reply__reply").value = reply; }; document.getElementById("reply__add").addEventListener("click", () => { let select_wordList = document.getElementById("reply__select"); let word = document.getElementById("reply__word").value; let reply = document.getElementById("reply__reply").value; if (word == "") { return; } // 构造json并添加json replyWordList[word] = { reply: reply, } // 添加到select中去 select_wordList.options.add(new Option(word, "")); saveData_Reply(); }); document.getElementById("reply__del").addEventListener("click", () => { let select_wordList = document.getElementById("reply__select"); let word = select_wordList.options[select_wordList.selectedIndex].text; // 删除json内的对象 delete replyWordList[word]; // 删除select里的option select_wordList.options.remove(select_wordList.selectedIndex); saveData_Reply(); }); } function saveData_Reply() { let data = replyWordList; localStorage.setItem("ExSave_Reply", JSON.stringify(data)); // 存储弹幕列表 } function saveData_ReplyCd() { let data = document.getElementById("reply__time").value; localStorage.setItem("ExSave_ReplyCd", data); // 存储弹幕列表 } function saveData_isReply() { let ridArr = []; let ret = localStorage.getItem("ExSave_isReply"); if (ret != null) { let retJson = JSON.parse(ret); if ("rooms" in retJson == true) { ridArr = retJson.rooms; } } let index = ridArr.indexOf(rid); if (isReplyOn == true) { if (index == -1) { ridArr.push(rid); } } else { ridArr.splice(index, 1); } let data = { rooms: ridArr, }; localStorage.setItem("ExSave_isReply", JSON.stringify(data)); // 存储弹幕列表 } function initPkg_Reply_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Reply"); if (ret != null) { let retJson = JSON.parse(ret); replyWordList = retJson; let select_wordList = document.getElementById("reply__select"); for (let key in retJson) { if (retJson.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } } ret = localStorage.getItem("ExSave_isReply"); if (ret != null) { let retJson = JSON.parse(ret); let ridArr = []; if ("rooms" in retJson == true) { ridArr = retJson.rooms; } if (ridArr.indexOf(rid) == -1) { isReplyOn = false; } else { isReplyOn = true; } document.getElementById("reply__switch").checked = isReplyOn; } else { isReplyOn = false; document.getElementById("reply__switch").checked = isReplyOn; } ret = localStorage.getItem("ExSave_ReplyCd"); if (ret != null) { document.getElementById("reply__time").value = ret; } } function initPkg_LiveTool_Reply_Handle(text) { if (isReplyOn == false) { return; } if (getType(text) == "chatmsg") { let uid = getStrMiddle(text, "uid@=", "/"); if (uid == my_uid) { // 不算自己 return; } let nn = getStrMiddle(text, "nn@=", "/"); let txt = getStrMiddle(text, "txt@=", "/"); let isConform = false; for (let key in replyWordList) { if (key == "") { continue; } if (key.indexOf("re(") != -1) { // 正则 let regStr = getStrMiddle(key, "re(", ")="); let strArr = key.split("=") if (strArr.length > 1) { let str = strArr[1]; let regObj = new RegExp(regStr, "g"); let result = regObj.exec(txt); if (result.length > 0) { if (result[0] == str) { isConform = true; } else { isConform = false; } } } } else { if (String(txt).indexOf(key) != -1) { isConform = true; } else { isConform = false } } if (isConform == true) { let reply = replyWordList[key].reply; reply = String(reply).replace(//g, nn); reply = String(reply).replace(//g, txt); if (isReplyCD == false) { sendBarrage(reply); // 设置CD if (replyCd > 0) { isReplyCD = true; setTimeout(() => { isReplyCD = false; }, replyCd * 1000); } } break; } } } } var treasureNum = 0; function initPkg_LiveTool_Treasure() { LiveTool_Treasure_insertModal(); } function LiveTool_Treasure_insertModal() { let a = document.createElement("div"); a.className = "livetool__Treasure"; a.id = "Ex_Geetest"; let b = document.getElementsByClassName("Barrage-main")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_LiveTool_Treasure_Handle(text) { if (isGetTreasure == false) { return; } if (getType(text) == "tsboxb") { let ot = getStrMiddle(text, "ot@=", "/"); let rpid = getStrMiddle(text, "rpid@=", "/"); let rid = getStrMiddle(text, "rid@=", "/"); let did = getCookieValue("dy_did"); let timeout = Number(ot) - Math.floor(Date.now()/1000); timeout = timeout * 1000 + getTreasureDelay(); treasureNum++; let a = document.createElement("div"); let idName = "Ex_Geetest_no" + String(treasureNum); a.id = idName; let b = document.getElementById("Ex_Geetest"); b.appendChild(a); setTimeout(() => { getTreasure(rid, rpid, did, idName); }, timeout); } } function getTreasure(roomid, rpid, deviceid, idName) { GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/h5nc/member/getRedPacket?token=" + dyToken, data: "room_id=" + roomid + "&package_room_id=" + roomid + "&device_id=" + deviceid + "&packerid=" + rpid + "&version=1", responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.data.code == "-1" && ret.data.validate != "0") { let v = JSON.parse(ret.data.geetest.validate_str); let success = v.success; let challenge = v.challenge; let gt = v.gt; let skey = getTreasureSkey(); if (skey != "") { let url = window.location.href; getTreasure_Auto(skey, gt, challenge, url, deviceid, rpid, roomid); return; } let handler = (e) => { // 2021-3-18 09:51:47 免打扰 // showMessageWindow(rid, "【宝箱】请手动验证领取宝箱", () => { // window.focus(); // }); let idDiv = document.getElementById(idName); e.appendTo("#" + idName); e.onSuccess(() => { let result = e.getValidate(); let geetest_challenge = result.geetest_challenge; let geetest_seccode = result.geetest_seccode; let geetest_validate = result.geetest_validate; let data = "room_id=" + roomid + "&package_room_id=" + roomid + "&device_id=" + deviceid + "&packerid=" + rpid + "&version=1"; data = data + "&geetest_challenge=" + geetest_challenge + "&geetest_validate=" + geetest_validate + "&geetest_seccode=" + encodeURIComponent(geetest_seccode); GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/h5nc/member/getRedPacket?token=" + dyToken, data: data, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; let msg = ""; if (ret.data.prop_id == "") { msg = "鱼丸x" + ret.data.silver; } else { msg = ret.data.prop_name + "x" + ret.data.prop_count; } if (msg != "") { showMessage("【宝箱】获得" + msg, "success"); } if (idDiv != null) { idDiv.remove(); } } }); }); }; if (unsafeWindow.initGeetest != undefined) { unsafeWindow.initGeetest({ gt: gt, challenge: challenge, offline: !success, product: "float", }, handler); } else { showMessage("自动抢宝箱初始化失败", "error"); } } else if(ret.data.msg != "领取失败" && ret.data.msg != "验证码不正确") { let msg = ""; if (ret.data.prop_id == "") { msg = "鱼丸x" + ret.data.silver; } else { msg = ret.data.prop_name + "x" + ret.data.prop_count; } if (msg != "") { showMessage("【宝箱】获得" + msg, "success"); } } else { showMessage("【宝箱】领取失败", "error"); } } }); } function getTreasure_Verify(challenge, validate, seccode, divId) { let data = "room_id=" + roomid + "&package_room_id=" + roomid + "&device_id=" + deviceid + "&packerid=" + rpid + "&version=1"; data += "&geetest_challenge=" + challenge + "&geetest_validate=" + validate + "&geetest_seccode=" + encodeURIComponent(seccode); GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/h5nc/member/getRedPacket?token=" + dyToken, data: data, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (document.getElementById(divId) != null) { document.getElementById(divId).remove(); } } }); } function getTreasure_Auto(skey, gt, challenge, referer, deviceid, rpid, roomid) { // let wtype = "geetest"; // let data = "wtype=" + wtype + "&secretkey=" + skey + ">=" + gt + "&referer=" + referer + "&challenge=" + challenge + "&supporttype=3"; let data = `appkey=${String(skey).trim()}>=${gt}&challenge=${challenge}&referer=${referer}&ip=&host=&sharecode=6fb45916efd144e592f3dbd905b618a5` GM_xmlhttpRequest({ method: "POST", // url: "http://api.ddocr.com/api/gateway.jsonp", url: "http://api.rrocr.com/api/recognize.html", data: data, timeout: 60000, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.status == "-1") { showMessage("【宝箱】自动识别失败", "error"); return; } let data = "room_id=" + roomid + "&package_room_id=" + roomid + "&device_id=" + deviceid + "&packerid=" + rpid + "&version=1"; data = data + "&geetest_challenge=" + ret.data.challenge + "&geetest_validate=" + ret.data.validate + "&geetest_seccode=" + ret.data.validate + "%7Cjordan"; GM_xmlhttpRequest({ method: "POST", url: "https://pcapi.douyucdn.cn/h5nc/member/getRedPacket?token=" + dyToken, data: data, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.data.code == "-1") { showMessage("【宝箱】验证码不正确", "error") return; } let msg = ""; if (ret.data.prop_id == "") { msg = "鱼丸x" + ret.data.silver; } else { msg = ret.data.prop_name + "x" + ret.data.prop_count; } if (msg != "") { showMessage("【宝箱】获得" + msg, "success"); } } }); } }); } let isVoteOn = false; let voteList = {}; let voteNameList = {}; let voteWordList = {}; let voteTotalNum = 0; let timer_Vote; let isRepeat = false; function initPkg_LiveTool_Vote() { LiveTool_Vote_insertDom(); LiveTool_Vote_insertDom_VotePanel(); LiveTool_Vote_insertFunc(); initPkg_Vote_Set(); } function LiveTool_Vote_insertDom() { let a = document.createElement("div"); a.className = "livetool__cell"; let cell = `
    弹幕投票面板
    `; let panel = `
    `; a.innerHTML = cell + panel; let b = document.getElementsByClassName("livetool")[0]; b.insertBefore(a, b.childNodes[0]); } function LiveTool_Vote_insertFunc() { document.getElementById("vote__switch").addEventListener("click", () => { let ischecked = document.getElementById("vote__switch").checked; let selectDom = document.getElementById("vote__select"); let title = selectDom.options[selectDom.selectedIndex].text; let options = voteList[title].options; let time = voteList[title].time; if (ischecked == true) { // 开启关键词禁言 let arr = String(options).split(" "); for (let i = 0; i < arr.length; i++) { voteWordList[arr[i]] = { num: 0, index: i }; } document.getElementById("vote__repeat").disabled = true; voteTotalNum = 0; initVoteOptionsPanel(title, options); isRepeat = document.getElementById("vote__repeat").checked; isVoteOn = true; timer_Vote = setTimeout(() => { voteNameList = {}; voteWordList = {}; isVoteOn = false; document.getElementById("vote__repeat").disabled = false; document.getElementById("vote__switch").checked = false; }, time * 1000); document.getElementsByClassName("vote__result")[0].style.display = "block"; } else{ // 关闭关键词禁言 clearTimeout(timer_Vote); voteNameList = {}; voteWordList = {}; isVoteOn = false; document.getElementById("vote__repeat").disabled = false; } }); document.getElementById("vote__title").addEventListener("click", () => { let a = document.getElementsByClassName("vote__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; if (document.getElementsByClassName("mute__panel")[0].style.display == "block") { document.getElementsByClassName("mute__panel")[0].style.display = "none"; } if (document.getElementsByClassName("enter__panel")[0].style.display == "block") { document.getElementsByClassName("enter__panel")[0].style.display = "none"; } if (document.getElementsByClassName("gift__panel")[0].style.display == "block") { document.getElementsByClassName("gift__panel")[0].style.display = "none"; } if (document.getElementsByClassName("reply__panel")[0].style.display == "block") { document.getElementsByClassName("reply__panel")[0].style.display = "none"; } } else { a.style.display = "none"; } }); document.getElementById("vote__select").onclick = function() { if (this.options.length == 0) { return; } let title = this.options[this.selectedIndex].text; let options = voteList[title].options; let time = voteList[title].time; document.getElementById("vote__theme").value = title; document.getElementById("vote__options").value = options; document.getElementById("vote__time").value = time; }; document.getElementById("vote__add").addEventListener("click", () => { let select_wordList = document.getElementById("vote__select"); let title = document.getElementById("vote__theme").value; let options = document.getElementById("vote__options").value; let time = document.getElementById("vote__time").value; if (title == "" || options == "" || time == "") { return; } // 构造json并添加json voteList[title] = { options: options, time: time } // 添加到select中去 select_wordList.options.add(new Option(title, "")); saveDate_Vote(); }); document.getElementById("vote__del").addEventListener("click", () => { let select_wordList = document.getElementById("vote__select"); let title = select_wordList.options[select_wordList.selectedIndex].text; // 删除json内的对象 delete voteList[title]; // 删除select里的option select_wordList.options.remove(select_wordList.selectedIndex); saveDate_Vote(); }); document.getElementById("vote__show-result").addEventListener("click", () => { let a = document.getElementsByClassName("vote__result")[0]; if (a.style.display != "block") { a.style.display = "block"; } else { a.style.display = "none"; } }) } function initPkg_Vote_Set() { document.getElementById("vote__switch").checked = isReplyOn; // 设置初始化 let ret = localStorage.getItem("ExSave_Vote"); if (ret != null) { let retJson = JSON.parse(ret); voteList = retJson; let select_wordList = document.getElementById("vote__select"); for (let key in retJson) { if (retJson.hasOwnProperty(key)) { select_wordList.options.add(new Option(key, "")); } } } } function initPkg_LiveTool_Vote_Handle(text) { if (isVoteOn == false) { return; } if (getType(text) == "chatmsg") { let uid = getStrMiddle(text, "uid@=", "/"); let txt = getStrMiddle(text, "txt@=", "/"); if (isRepeat) { if (Object(voteWordList).hasOwnProperty(txt)) { voteWordList[txt].num++; voteTotalNum++; changeOptionsData(); } } else { if (Object(voteNameList).hasOwnProperty(uid) == false) { if (Object(voteWordList).hasOwnProperty(txt)) { voteNameList[uid] = 0; voteWordList[txt].num++; voteTotalNum++; changeOptionsData(); } } } } } function saveDate_Vote() { let data = voteList; localStorage.setItem("ExSave_Vote", JSON.stringify(data)); // 存储弹幕列表 } function LiveTool_Vote_insertDom_VotePanel() { let a = document.createElement("div"); a.className = "vote__result"; let panel = `
    投票主题
    X
    `; a.innerHTML = panel; let b = document.getElementsByClassName("layout-Player-main")[0]; b.insertBefore(a, b.childNodes[0]); let box = document.getElementsByClassName("vote__result")[0]; 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; box.style.left = mouseX + "px"; box.style.top = mouseY + "px"; } document.onmouseup = function (event) { event.stopPropagation(); document.onmousemove = null; document.onmouseup = null; } } document.getElementById("vote__result-close").addEventListener("click", () => { document.getElementsByClassName("vote__result")[0].style.display = "none"; }) } function initVoteOptionsPanel(theme, options) { // 设置标题 document.getElementById("vote__result-theme").innerText = theme; // 设置结果面板 document.getElementById("vote__result-options").innerHTML = ""; // 清空信息面板 setVoteOptionsDom(options); } function setVoteOptionsDom(options) { let arr = options.split(" "); let b = document.getElementById("vote__result-options"); for (let i = 0; i < arr.length; i++) { let a = document.createElement("div"); a.className = "vote__option-wrap"; a.innerHTML = `
    ${ arr[i] }
    `; b.appendChild(a); } } function changeOptionsData() { for (const key in voteWordList) { let item = voteWordList[key]; let domNum = document.getElementsByClassName("vote__option-num")[item.index]; let domBar = document.getElementsByClassName("vote__progress-bar")[item.index]; let percent = String(Number(Number(item.num / voteTotalNum) * 100).toFixed(1)) + "%"; domNum.innerText = `${ item.num }(${ percent })`; domBar.style.width = percent; } } // 获取自己所有的粉丝牌房间号 let myFansBadgeList = []; let lotteryHasNoticed = {}; let lotteryHTML = ""; let isLotteryNotice = false; let timer_lottery = 0; function initPkg_Lottery() { setFansBadgeList(); initPkg_Lottery_Dom(); initPkg_Lottery_Func(); Lottery_Set(); timer_lottery = setInterval(() => { initPkg_Lottery_Timer(); }, 60000); } function initPkg_Lottery_Dom() { Lottery_insertModal(); Lottery_insertIcon(); } function Lottery_insertIcon() { let a = document.createElement("div"); a.className = "ex-lottery"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function Lottery_insertModal() { let a = document.createElement("div"); a.className = "exlottery"; a.innerHTML = `
    暂无数据
    `; let b = document.getElementsByClassName("layout-Player-chat")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Lottery_Func() { let dom_notice = document.getElementById("lottery-notice"); document.getElementsByClassName("ex-lottery")[0].addEventListener("click", () => { showExRightPanel("全站抽奖信息"); let dom = document.getElementsByClassName("lottery__wrap")[0]; if (dom) { dom.innerHTML = lotteryHTML; } }) document.getElementById("lottery-refresh").addEventListener("click", debounce(() => { initPkg_Lottery_Timer(); }, 3000)) dom_notice.addEventListener("click", () => { let ischecked = dom_notice.checked; if (ischecked == true) { // 开启提醒 isLotteryNotice = true; } else{ // 停止提醒 isLotteryNotice = false; } saveData_Lottery(); }) } async function initPkg_Lottery_Timer() { let html = ""; let lotteryList = await getExLotteryList(); if (!lotteryList.data.list) return; for (let i = 0; i < lotteryList.data.list.length; i++) { let item = lotteryList.data.list[i]; if (item.status !== 0) { // status不为0说明已经开奖 continue; } let lotteryInfo = await getExLotteryInfo(item.room_id); let condition = lotteryInfo.data.join_condition; let joinText = "command_content" in condition ? `发送弹幕` : `赠送 ${condition.gift_name}(${condition.gift_price})x${condition.gift_num}`; let expireTime = Number(lotteryInfo.data.start_at) + Number(lotteryInfo.data.join_condition.expire_time); let expireText = getTimeDiff(expireTime * 1000, new Date().getTime()); expireText = expireText == -1 ? "已结束" : "距结束:" + expireText; // 有这个房间的牌子或者不需要成为粉丝的 就都能参加 let canJoin = myFansBadgeList.indexOf(String(item.room_id)) !== -1 || condition.lottery_range <= 1; if (canJoin && isLotteryNotice) { let keyName = `${lotteryInfo.data.prize_name}|${lotteryInfo.data.start_at}`; if (!(keyName in lotteryHasNoticed)) { lotteryHasNoticed[keyName] = 1; showMessage(`【${lotteryInfo.data.prize_name}x${lotteryInfo.data.prize_num}】${joinText}`, "special", { timeout: 100, }); } } html += `
    ${item.anchor_name}
    ${expireText}
    ${lotteryInfo.data.prize_name}x${lotteryInfo.data.prize_num}
    ${joinText}
    ${getJoinCondition(condition)}
    `; } let domNodata = document.getElementsByClassName("lottery__nodata")[0]; if (html.trim() !== "") { domNodata.style.display = "none"; } else { domNodata.style.display = "block"; } lotteryHTML = html; let dom = document.getElementsByClassName("lottery__wrap")[0]; if (dom) { dom.innerHTML = lotteryHTML; } } function getJoinCondition(condition) { let ret = ""; switch (condition.lottery_range) { case 0: ret = "所有人可参与"; break; case 1: ret = "关注主播"; break; case 2: ret = "成为粉丝"; break; case 3: ret = "关注主播+成为粉丝"; break; default: break; } return ret; } function getExLotteryList() { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: "https://www.douyu.com/lapi/interact/lottery/getHallList", responseType: "json", onload: response => { let ret = response.response; resolve(ret); }, onerror: err => { reject(err); } }); }) } function getExLotteryInfo(room_id) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/member/lottery/activity_info?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 => { resolve(ret); }).catch(err => { reject(err); }) }) } async function setFansBadgeList() { let ret = []; 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"); ret.push(rid); } myFansBadgeList = ret; } function saveData_Lottery() { let data = { isNotice: isLotteryNotice } localStorage.setItem("ExSave_Lottery", JSON.stringify(data)); } function Lottery_Set() { // 设置初始化 let ret = localStorage.getItem("ExSave_Lottery"); if (ret != null) { let retJson = JSON.parse(ret); if (retJson.isNotice == true) { document.getElementById("lottery-notice").click(); } } } function initPkg_Menu() { GM_registerMenuCommand(`检查更新`, () => { Update_checkVersion(true); }) } function initPkg_MiniProgram() { initPkg_MiniProgram_Dom(); initPkg_MiniProgram_Func(); } function initPkg_MiniProgram_Dom() { MiniProgram_insertIcon(); MiniProgram_insertModal(); } function MiniProgram_insertIcon() { let a = document.createElement("div"); a.className = "MiniProgram"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function MiniProgram_insertModal() { let a = document.createElement("div"); a.className = "miniprogram__panel"; a.innerHTML = `
    DouyuEx移动端上线啦
    微信扫码或搜索DouyuEx
    ↓ 即刻体验 ↓
    `; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_MiniProgram_Func() { document.getElementsByClassName("MiniProgram")[0].addEventListener("click", function() { let a = document.getElementsByClassName("miniprogram__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; } else { a.style.display = "none"; } }); } function initPkg_Monitor() { initPkg_Monitor_Dom(); initPkg_Monitor_Func(); } function initPkg_Monitor_Dom() { Monitor_insertIcon(); } function Monitor_insertIcon() { let a = document.createElement("div"); a.className = "ex-monitor"; a.innerHTML = ''; let b = document.getElementsByClassName("ex-panel__wrap")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Monitor_Func() { document.getElementsByClassName("ex-monitor")[0].addEventListener("click", function() { openPage("https://www.douyuex.com/" + String(rid)); }); } let totalMonthCost = 0; let typeNum = 0; let typeCount = 0; let svg_see = ``; let svg_unsee = ``; let seeStatus = 1; // 0 不可视 1 可视 function initPkg_MonthCost() { // if (document.getElementsByClassName("SociatyLabel")[0].innerText == "伐木累") { // return; // } initPkg_MonthCost_Dom(); initPkg_MonthCost_Func(); seeStatus = MonthCost_getSeeStatus(); if (seeStatus == 1) { document.getElementsByClassName("monthcost__icon")[0].innerHTML = svg_see; MonthCost_updateCost(); } else { document.getElementsByClassName("monthcost__icon")[0].innerHTML = svg_unsee; } } function initPkg_MonthCost_Dom() { MonthCost_insertIcon(); } function MonthCost_insertIcon() { let a = document.createElement("span"); a.className = "month-cost"; a.innerHTML = ` 本月已消费 *** `; a.title = "数据每日更新,根据个人中心消费数据统计" let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_MonthCost_Func() { document.getElementsByClassName("monthcost__icon")[0].addEventListener("click", () => { if (seeStatus == 1) { seeStatus = 0; document.getElementById("monthcost__money").innerText = "***"; document.getElementsByClassName("monthcost__icon")[0].innerHTML = svg_unsee; } else { seeStatus = 1; document.getElementsByClassName("monthcost__icon")[0].innerHTML = svg_see; MonthCost_updateCost(); } MonthCost_saveSeeStatus(); }) } function MonthCost_saveSeeStatus() { localStorage.setItem("ExSave_MonthCost_SeeStatus", seeStatus); } function MonthCost_getSeeStatus() { let storage = localStorage.getItem("ExSave_MonthCost_SeeStatus"); if (storage == null) { storage = 1; } return storage; } function MonthCost_queryData(url) { return new Promise(resolve => { fetch(url, { method: 'GET', mode: 'no-cors', credentials: 'include', }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } async function getMonthCost() { totalMonthCost = 0; let ret = await MonthCost_queryData("https://www.douyu.com/member/cp/getYcConsumeTypeList"); typeNum = ret.data.length - 1; if (ret.code == 0) { // 跳过第一个 也就是全部,全部不支持查询月数据 for (let i = 1; i < ret.data.length; i++) { let item = ret.data[i]; calcMonthCost(item.type); } } } async function calcMonthCost(type) { // type: 礼物(1) 太空魔盒(3) 福袋礼物(5) 甜蜜告白(6) 音乐学徒(19) let [beginTime, endTime] = getMonthTimeRange(); let host = "https://www.douyu.com/member/cp/getYcTransactionList"; let lastId = ""; let currentNum = 0; let currentPage = 1; let total = 0; let ret; do { ret = await MonthCost_queryData(host + "?" + `firstId=&lastId=${lastId}&propType=0&beginTime=${beginTime}&endTime=${endTime}&type=${type}&pageNum=${currentPage}&pageSize=50`) if (ret.code == "0") { let len = ret.data.details.length; if (len == 0) { break; } lastId = ret.data.details[len - 1].id; total = Number(ret.data.total); currentNum += Number(ret.data.pageSize); currentPage++; for (let i = 0; i < ret.data.details.length; i++) { let item = ret.data.details[i]; totalMonthCost += Number(item.price) * Number(item.number); } } else { console.log(ret.msg); break; } } while (currentNum < total); typeCount++; if (typeCount >= typeNum) { // 结束 MonthCost_saveData(); document.getElementById("monthcost__money").innerText = String(totalMonthCost/ 100); } } function getMonthTimeRange() { let now = new Date(); let nowMonth = now.getMonth(); let nowYear = now.getFullYear(); let monthStartDate = new Date(nowYear, nowMonth, 1); return [Math.round(new Date(monthStartDate).getTime() / 1000).toString(), Math.round(now.getTime() / 1000).toString()]; } function MonthCost_saveData() { let data = { monthCost: totalMonthCost, updateTime: new Date().getTime() } let storage = localStorage.getItem("ExSave_MonthCost"); if (storage !== null) { storage = JSON.parse(storage); } else { storage = {}; } storage[my_uid] = data; localStorage.setItem("ExSave_MonthCost", JSON.stringify(storage)); } function MonthCost_getData() { let storage = localStorage.getItem("ExSave_MonthCost"); if (storage !== null) { storage = JSON.parse(storage); } else { storage = {}; } return storage; } function MonthCost_updateCost() { let timeDiff = 1; let tmpCost = 0; // 默认为1,也就是要更新 let now = new Date().getDate(); let storage = MonthCost_getData(); if (my_uid in storage) { let item = storage[my_uid]; timeDiff = Math.abs(now - new Date(item.updateTime).getDate()); tmpCost = item.monthCost; } if (timeDiff >= 1) { getMonthCost(); } else { document.getElementById("monthcost__money").innerText = String(tmpCost/ 100); } } let svg_night = ''; let svg_day = ''; let currentMode = 0; // 0日间模式 1夜间模式 function initPkg_Night() { initPkg_Night_Dom(); initPkg_Night_Func(); initPkg_Night_Set(); watchBottomIframe(); } function initPkg_Night_Dom() { Night_insertIcon(); } function Night_insertIcon() { let a = document.createElement("div"); a.style = "position: absolute;right: -75px;top: 18px;cursor: pointer;" a.id = "ex-night"; a.innerHTML = svg_day; a.title = "切换夜间模式"; let b = document.getElementsByClassName("Header-right")[0]; b.appendChild(a); } function saveData_Mode() { // 0日间模式 1夜间模式 let data = { mode: currentMode } localStorage.setItem("ExSave_Mode", JSON.stringify(data)); // GM_setValue("ExSave_NightMode", currentMode); } function initPkg_Night_Set_Fast() { let ret = localStorage.getItem("ExSave_Mode"); if (ret != null) { let retJson = JSON.parse(ret); if ("mode" in retJson == false) { retJson.mode = 0; } if (retJson.mode == 1) { setNightMode(); } } // let ret = GM_getValue("ExSave_NightMode"); // if (ret && ret == 1) { // setNightMode(); // } } function initPkg_Night_Set() { let ret = localStorage.getItem("ExSave_Mode"); let a = document.getElementById("ex-night"); if (ret != null) { let retJson = JSON.parse(ret); if ("mode" in retJson == false) { retJson.mode = 0; } if (retJson.mode == 1) { currentMode = 1; a.innerHTML = svg_night; a.title = "切换日间模式"; // setNightMode(); } } // let ret = GM_getValue("ExSave_NightMode"); // let a = document.getElementById("ex-night"); // if (ret && ret == 1) { // currentMode = 1; // a.innerHTML = svg_night; // a.title = "切换日间模式"; // } } function initPkg_Night_Func() { document.getElementById("ex-night").addEventListener("click", function() { let a = document.getElementById("ex-night"); if (currentMode == 0) { currentMode = 1; a.innerHTML = svg_night; a.title = "切换日间模式"; setNightMode(); saveData_Mode(); setNightModeIframe(); } else { currentMode = 0; a.innerHTML = svg_day; a.title = "切换夜间模式"; cancelNightMode(); saveData_Mode(); cancelNightModeIframe(); } }); } function setNightMode() { let cssText = ` .layout-Player-barrage,.Barrage--paddedBarrage,.Barrage-firstCharge,.Barrage-notice--replyBarrage{background-color:rgba(37,38,42,1) !important;} .Barrage-userEnter{background-color:rgba(37,38,42,1) !important;color:rgba(187,187,187,1) !important;} /*.Barrage-content,.Barrage-text{color:rgba(187,187,187,1) !important;}*/ .Barrage-content,.Barrage-text{color:rgba(187,187,187,1);} .Barrage-notice--noble{background-color:rgba(37,38,42,1) !important;border:rgba(37,38,42,1) solid 1px !important;} .layout-Player-title{background-color:rgba(35,36,39,1) !important;border:rgba(35,36,39,1) solid 1px !important;} .Title-header{color:rgba(191,191,191,1) !important;} .Title-anchorText{color:rgba(107,176,125,1) !important;} .Title-row-text,.Title-anchorName{color:rgba(153,153,153,1) !important;} #js-player-toolbar{background:rgb(37,38,42) !important;border:1px solid rgb(37,38,42) !important;} .PlayerToolbar-wealthNum,.Header-wrap .Header-menu-link>a,.public-DropMenu-link,.Header-icon{color:rgb(191,191,191) !important;} .layout-Main{background-color:rgba(35,36,39,1) !important;} .ChatRank-rankWraper{background:rgba(47,48,53,1) !important;border:rgba(47,48,53,1) solid 1px !important;} .bg-icon{display:none;} .ChatRankWeek-headerContent,.NobleRank,.NobleRankTips{background-color:rgba(47,48,53,1) !important;} #js-player-asideMain{border:1px solid rgba(37,38,42,1) !important;background-color:rgb(47,48,53) !important;} .Chat,.ChatSend-txt{background:rgba(47,48,53,1) !important;color:rgb(187,187,187) !important;border-radius:0px !important;} .ChatTabContainer-titleWraper--tabLi{background:rgb(29,32,35) !important;border:1px solid rgb(47,48,53) !important;} .ChatTabContainer-titleWraper--tabLi.is-active,.ChatBarrageCollect-tip,.FansRankInfo{background:rgb(47,48,53) !important;} .FansRankInfo-txt{color:rgb(121,127,137) !important;} .Barrage{border:1px solid rgba(35,36,39,1) !important;} .layout-Player-chat{border-top:1px solid rgba(47,48,53,1) !important;} .layout-Player-announce{background-color:rgb(29,32,35) !important;border:1px solid rgb(29,32,35) !important;} .FansRankBottom,.AnchorFriend-footer{border-top:1px solid rgb(47,48,53) !important;} .Title-official{background:rgb(35,36,39) !important;} .Header-wrap{background:rgb(45,46,54) !important;border-bottom:1px solid rgb(45,46,54) !important;} .layout-Menu{background:rgb(47,48,53) !important;border-color:rgb(35,36,39) !important;} .GuessMainPanel{background:rgba(47,48,53,0.9) !important;border:1px solid rgb(47,48,53) !important;} .danmuAuthor-3d7b4a{color:rgb(234,234,234) !important;} .danmudiv-32f498{background:rgba(47,49,53,0.9) !important;} .danmuContent-25f266{background:rgba(35,36,39,0.9) !important;} .word-89c053{background:rgba(35,36,39,0.9) !important;color:rgb(187,187,187) !important;} .FansMedalPanel-Panel{color:black !important;} .AnchorLike-ItemBox,.AnchorFriendPane-content,.SociatyLabelPop-content{border:1px solid rgb(35,36,39) !important;} .AnchorFriendCard-info>h3,.GiftExpandPanel-descName,.GiftInfoPanel-name,.FansMedalInfo-titleL,.SociatyAnchorCard-info>h3{color:rgb(204,204,204) !important;} .GuessReturnYwFdSlider{background:rgba(47,48,53,0.7); !important;border-left:1px solid rgb(35,36,39) !important;} .GuessGuideList-itemBox,.GuessGuideList-moreGuess{background-color:rgba(47,48,53) !important;color:rgb(204,204,204) !important;} .AnchorFriend-footer a{background-color:rgb(47,48,53) !important;color:rgb(204,204,204) !important;} .AnchorFriendPane-title{border-bottom:1px solid rgb(47,48,53) !important;background-color:rgb(35,36,39) !important;} .AnchorLike-friendList .AnchorFriendPane-title h3,.Title svg{color:rgb(153,153,153) !important;} .GiftExpandPanel{background-color:rgb(35,36,39) !important;border:1px solid rgb(35,36,39) !important;} .GiftInfoPanel-cont{background-color:rgb(35,36,39) !important;border:1px solid rgb(35,36,39) !important;} .BatchGiveForm-num{background-color:rgb(35,36,39) !important;} .BatchGiveForm-input{background-color:rgb(35,36,39) !important;color:rgb(149,149,149) !important;} .BatchGiveForm-btn,.Backpack-prop.is-blank,.GuessMainPanel-sliderItem{background-color:rgb(47,48,53) !important;} .Backpack{background-color:rgb(35,36,39) !important;border:1px solid rgb(35,36,39) !important;} .Backpack-name,.NormalCard-btn,.NormalCard-close,.NobleCard-close,.ReportButton-41fa9e,.HideButton-d22988,.txtHidden-486e56,.BackpackInfoPanel-name,.NormalCard-name{color:rgb(187,187,187) !important;} .Backpack-propPage,.BatchProp-content{background-color:rgb(35,36,39) !important;color:rgb(149,149,149)!important;} .BackpackInfoPanel-content{background-color:rgb(35,36,39) !important;border:1px solid rgb(35,36,39) !important;} .BatchProp-customIpt,.BatchGiveForm-num,.GiftInfoPanel-intro{color:rgb(149,149,149) !important;} .GuessReturnYwFdSlider-numIptWrap,.GuessReturnYwFdSlider-numIpt{background-color:rgb(47,48,53) !important;color:rgb(149,149,149) !important;} .GuessReturnYwFdSlider-giftName{color:rgb(160,160,160) !important;} .NormalCard-common,.GuessRankPanel{background-color:rgb(47,48,53) !important;border:1px solid rgb(47,48,53) !important;} .FansMedalPanel-OwnerInfo,.FansMedalPanel-list{background-color:rgb(47,48,53) !important;color:rgb(187,187,187) !important;} .FansMedalList-item:hover{background-color:rgb(37,38,42) !important;} .AnchorFriend-content,.SociatyAnchor-content{background-color:rgb(35,36,39) !important;border-top:1px solid rgb(47,48,53) !important;} .SociatyLabelPop-title{border-bottom:1px solid rgb(121,127,137) !important;background-color:rgb(35,36,39) !important;color:rgb(153,153,153) !important;} .Barrage-nickName{color:rgb(255,119,0) !important;} .wm-general-wrapper{background:rgb(35,36,39) !important;} .ChatRank-rankWraper .ChatRankTab-title.is-active{color:rgb(255,119,0)!important;} .ChatRank-rankWraper .ChatRankTab-title{color:rgb(131,140,154)!important;background:rgb(29,32,35)!important;border:1px solid rgb(47,48,53)!important;} .MatchTeamRankList-topAvatar{background:rgb(47,48,53)!important;} .MatchTeamRankList-topName{color:rgb(131,140,154)!important;background-color:rgb(47,48,53)!important;} .MatchTeamRankTitle-content{background:rgb(47,48,53)!important;color:rgb(131,140,154)!important;} .MatchTeamRankBottom{background:rgb(47,48,53) !important;} .MatchTeamRankBottom-lable{color:rgb(131,140,154);} .MatchTeamRankBottom-desc{color:rgb(121,127,137);} .Barrage-text>a,.Barrage-firstCharge{color:rgb(187,187,187)!important;} .GuessMainPanelHeader-slogon{color:rgb(204,204,204)!important;} .Barrage-hitYwGame--text{color:rgb(187,187,187)!important;} .AnchorFriendPane-title h3{color:rgb(153,153,153)!important;} .Barrage-nickName.is-self{color:rgb(255,0,51)!important;} .barragePanel__funcPanel{background:rgba(47,49,53,0.9) !important;} .layui-text{color:rgb(187,187,187) !important;} .GuessReturnYwFdSlider-ywNum{color:rgb(237,90,101) !important;} .VideoBottomTabs span{color:rgb(204,204,204)} .BackpackHeader-info--title,#point__value{color:rgb(191,191,191) !important;} #red_envelope_text,#red_envelope_query{color:rgb(191,191,191) !important;} .layout-Container{background-color:rgb(35,36,39) !important;} .FansRankBottom-invisible,.ChatRankWeek-invisibleContent{background:rgb(47,48,53) !important;} .Barrage-roomVip--super{border-top: 1px solid rgb(37,38,42)!important;border-bottom: 1px solid rgb(37,38,42)!important;background: rgb(37,38,42)!important;} .Barrage-userEnter--vip{background: rgb(37,38,42)!important;} .ChatRankWeek-nobleInvisible{border-top:1px solid rgb(121,127,137) !important;} #refresh-video2-svg{fill:#ffffff !important} .VideoRecommendItem a{border-bottom: 3px solid rgb(35,36,39) !important;} .AnchorFriendPane-title a:after{display:none !important;} .MedalOwnerInfo-box{border-bottom: 1px solid rgb(79 81 88)!important;} .FansMedalList-item.is-NoWear{border-top: 1px solid rgb(79 81 88)!important;} /*弹幕时速*/ .barrageSpeed{color: rgba(255,255,255,0.5) !important;} /*用户等级*/ ${getUserLevelNightModeStyle()} /*新背包*/ .BackpackHeader{border-bottom: 1px solid rgb(37,38,42) !important;} .BackpackHeader-tabItem{color:rgb(121,127,137)!important;} .RightsPropsList{background-color: rgb(35,36,39) !important;color: rgb(149,149,149)!important;} .RightsPropsList-item{background: rgb(47,48,53) !important;} /*加入公会*/ .SociatyLabelPop-content{background:rgb(35,36,39) !important;} `; StyleHook_set("Ex_Style_NightMode", cssText); } function cancelNightMode() { StyleHook_remove("Ex_Style_NightMode"); } function getUserLevelNightModeStyle() { let ret = ""; for (let i = 1; i < 70; i++) { ret += ".shark-webp .UserLevel--" + String(i) + ","; } ret = ret.substring(0, ret.length - 1); ret += `{background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAADACAMAAAAN8R4NAAAC+lBMVEUlJioDvrdnxgPfkxaJb0lrsSIhrKYDvLVif0ftnhtnxQQKnZlZpAwnKCy+iDDYmzlFfHwrLC/ckhc5OTq1exuIbkg6PjyAa0qehVxzX0JpwA5CQT84PkEpKi5geEksLjE3lZNHamsqpKAfQEIxQiM9QT5Gd3c8RUguoJ1HbG0tLzIRt7FCUlVquxZabUpplD1TYUnOmkRBRkAzNTcVs64/REBSTUZnjEJDPDNGYWMwNDdHOyZGdHVqvRJpxAkKu7RAPz2zhDcwMTMcrqlCgYE6QUQ2ODjekxc/iIdqnjVrpDA0mZY6kY+tjFdliERqmjg9SEvGjCpHZmhEfX1VT0czOTxYaUqPc0avgzjonyZ4ZktVZElhV0k7REfZkRtLVEZ4ZkpFQkBrojJrpi5ccUmRdEY2NjdrtxsasKtGb3BPTElSTkrLmUVkhUVMSEOCc1xEWFo/S05hekinfz2oilpLSUZCSEIHvLVBT1HElktqXkprqSw8j42McUhjgkaaeUO0hDbenTNJUEVOSkThnS5qtB1u1QIkqKRBhYSGdlxpXUpnkECfe0DWkB131BIAy8NfWVFvYUprrSa4klNIRkTpnSA9jIuih1s8OzvMjSYwnZtEe3t8aUnOjiTUkCD+phRmX1NdVUcym5jkniuifT8rop5Ef393bFlQWkiWdkSrgTxqmDvBii3akhkPzMVESUNrqCqXgFyEbUg+PTx0almpfzwTtK9EW12wjVaCbEhOV0fOmUFYUki6hzLRjyLImEtXZ0m4hjPfmihsX0rUmzy4hjTlmRxBhINGTUScekGB0yj/rCXAlU5FTEPRky1tZFa8iDG0klyQfWCKeVy9lFFsX0tNRToZp6KbflA2TE65jkeddDCvfSvYlyrwoyQgzcYZycIVwbubgluFcVAyQkVESkLDkT75rjNqVTNxxBkhnJghi4h5aE5tWz67gydfoRpVjI1yjlZeTDJeqxBs0QGm1HSohUxVRzPJhhhyzBF0z82Tu2mHqmJThCGbY0TbAAAbfUlEQVR42uybe1BUVRzHv7uLyVIrXTZFXTeI8gWC4ZpYKcKaoKTp5pquEYnBWoFUQCkVIUkPSwoCAgwRg0oJKuylSVhE9iILtZe9c9KaXtP0rmmme3b3cL3uuZwzjTNZ2++Pc9z1O2fOxzlz93783YszTgrRcyvkpDOmjhgaxK2hI6aK5s49JczArbBTzhXd3+knDtZxa/CJp+OkUyFQp540YopIbsoI0dwpS0Vyy04R3d+J00RyY05ECIQqZKhYbqhoLkwsFya6v8FiucHQg9SZk4BJcQAdI7Ky7MDLcXI9ClL6INB64krgyqsAOkrr1rlBKyioP5YD5CixnDe8A80ZQGqzBbDcAdDRvOx6kzIBMOihbPAigI7yNy8DuG4LvKXXeeezxwJjLwTk8TQyrr7vaTItICMpnQ94UDBwqf4sAGlzIJOGLF+ufxQTYx977LGso4FDhwMVxmsB5BYBqKjZtcuYowCrY9XemDS8Jt47qIGHhANrDY8DWFIAYG3GmtaMOjpRYGWDo+kGgYv1CYgODrnsKOATTgYm6GYBGHc+gCtiZt92AqIXDn6AAYzYm4AI/ZkAll8AzJmINA8sCxhl8iAZHwKw8xBQVKUAM2PDi3bFk4EFjPodcig1HcCL64EnF/smP2DEBtMNYvT0VxMQPGc5CxiTF8o53dmAacbVMEXOOvn8DUzglSuArEQAkOTsoJuwIis/OIUNXFgKrHMBgFXOhtYqwBqxefFkYAIHOYAXygGgOA94dj2d/IBX3gLEjfR+PnN+AoAEJvB5M4HxM8gBv3vWmGnRAGYzgc+Sz3TaRHjqTn0akBh705yQS5nA18pnOrcKntpuzAUTmMY4wEmGJCwpgbcqU/PoRIFVG7zMs8H5F2AA4Et0l2DcXHKiH7n83suf0gAm403RI718iNiyYiW22MnJZgCTsTbC2ARPSU2lhUxgMh6Qapo4wGjbEZ3q+zXb2uikEwVWb1BPNph1A7SByfhgtG4CgGl3LwBmPK0JnH9X1g8gNfFRIHgFtpiAm1awgTua324GqaocYHipFvBw19fd4AE3fLBtI0hJQz6wkcnxwVSwgPO/u3g6mS8bGRubmHiZJvCYdybEkPlpnQmYeR4LOGGYXCm33nWBFzgt5axBczB9YsTLsQl+wNstctVteq3QC5xrvjK0lwE8j8Qe39RdOBBwtlkut3HPVpB6Zfe3vySZ5embty1mBVjZ4I+/eTaYMnr06LSHh7GAZ4+Sa9Hdj9wOUjEPWi/UTWAB60lJN+gfhWfBOYnT77Tj0TR97AXwAzaSMsX7foseL6pp3h7tB0xjO0lMG9hAyrSmPROkMsin5+lEgZUNWm/QXwdPaR5pHSlrlG4BSF0zWbdqGvyAtcsEKMAiFSSaM3AjFJhXFJhd0VCVLvBuLQNOHgJOD0U3+J8BPtZHdYRTJOf854606EXmP3PRCgJbdFX2CgRp+zBwLZlpTnutzo6HJDEflirfstOfJQ0dPus5AMPyL7LSnyWmDtumjbcBGDXmNF9OR4CZBgupltorBWHFSNmbXaqcfyiarFVcs6sn1Cniw3ntra1hmRSYqcP26SPlbxJvWJ44jAIzdHhUTGSk/GnCqqgNq0YpwGzRpfZKQTRixIgPs4FRViuz0rVsu2th3f2ZiA+3FstTCQVm6TAee1UGvmc+sDyBAvvrMCJvBBaOR1QkcP9sBVjDYDHPD5gZK9z/kBqYvZb53Slw7y4U8WGi2G3bKDBLhy94+OKR8ngzgabA/joM3YXj77sGuH01cFskE5gaLBdYiT0UCgYwe63W0nQxH94atgQUmKHDZw4CASaiqL+ZAvvr8Dm6meeP83girtCt9gemohttbOIBk9Hrw5ZmCxOYSvNuZS3zoZ4Ktg9vO9qHJacjyA8Yg86UPDo8bPowH/CdI7dAAVbrMAE+D4iMBHBvzNXQAu748O094AN3uDZ7fHjfprIyl7EsiQnc8do6Za0pG4uTwPbhPV9QH37fRiwxEwh3+APnf/mHR4ezbo2NHamPHSYNuicFDOAxMe/FgNSqC4GTL4d021eLwACmovvRgYGB5x3pw9bq6uoOV7WSo6EkuTwhutaHH4zIvNLM9OGatsVeHy5PtljMKFliswxpocD+vi7JOnzqyNGYeNfnkybRq7RKhz/16vCNUYvGXn4v5j6yeuxY1lVaMVg2MDsGvyPNXMu5m3zTJzF92KDy4ZSCjK7saArM1mFypBP1P4To76HADB22btDpzjdhBvkyigIL+uu/1IdNJqhKF3i3lgEnDwGnhwEHfIyP6vH/XzwBd9EKgkZDt2KdXDkCPpyyd12KkA9LV+17XMyHgaQ7RHw4Ii7uHBEfjhg/3pfTQdNzq8ri4+P38X3Y0ry/l3yiOU23zqvJLTI+IeLDgH1jI/g+fHMiaWPzfXj1qg0bdAsosJbn5lJYjg/vrwI+W6fkNN36gBw8sEvAh8kfdjeC58O0jc334Q23A/fPpcBanlu6r+Nrm4APG9PtU00CPuyx3J4+ER9G8fr0RvB82NfGDub7MMmdsJACa3muq6ywyNjE9WG3sbQ3l+Y4PvyuMT5CxIfT20CAOT5M29giPnyvbhwosFbft8kG9FYN4MN2Ty7FWAvs388CJqN0pFtLFaF9TB9eJh3pw+aNZgYwGfMjjvLhiGduWSniwxFXzzxPA7jjsK/v+4YJqC3V9uFurw+j5ipWf5g2kV9oBgXe/gZwsMzG8mFHrdeHIxzP2oDKTfX1jan1Zn8fHvT9kT482tvGZvjwx7+rfHjuAmDh5QqwSofNVGGbq6SKsnksYJrz/mXVTvOVpdvVORpS+fDP8dWWnl1MH970UTFItQypk1e21tXVLW2sE/DhtJRJg+azfPgRtQ+PWzT2hEgKrNX3zck1lhUK+LBpl9FYJODDSOmtcVVZMLAP/+ptDJMjzfdhs9zGTrDzfXjR+atiZtv/9+EAubUMOHkIOD0MOGDRI/ifeeQh4C5abM8lOkwKtIL8vZmO1qv2uYV8GEi6SsiH866XK5Prw3Ti+zBwyYU8Hx7e09NTagTfhytcRX2ug2wfvlbda7Z3u8wiPvxK/Zo1ayp5Pkwnrg+TXEwMG1hp6ZLaXiTgw32HgL3dGv1hda/50OHDZhEfXkJguT5MJ74PA1Efx4Dnw4DJ1STgw7Wh0ejbI+DDeHdXusss4sOOymXhNq4P04nvw7g98uwY8HwY6CgT6Q9be4w1NUkCPpweaqbAHB8urw8qCJvC82E68X347BNAgVk+bKc6X/oZE5jmrOWeXF/pGxW9Hyo5rV6zubsJbGC0LXar+sNOO9DyCsOHT1X5sG/i+vComFEDAHd8NNWnsE1G+wDAn+2p9Zxje+lBoNO4lu3D3c5+H66UG8nNxrIKZn94qK8/3EZ8GJ0mYCirP3yLyoeDfW1ihg+/947iwzMX3T15coxu8ig/4Hm+9rBPCouKwAKmqmv0qW78Tre10Oj28+FMucybXPMoMGkkH3RVsH14j68/7PgmyWLGxhIpr34x14ft3onlwzNeUnz4duusWbPGzJgFCqzhuXX0ZHN8OGe/qya3ScCHAXKk2T7c6PPhsF/DZB/OXBJWX8z1YTrxfRggR/oY+rDpfx8+jm8tA04eAk4P/ymQ49+HRR9lWCZ2VP8zPix6MToefFjdH0bF8H2SkOcmdew1H/1zk05E93qAjpmdkIjlptOfmwH7w7ZllTZuf5i+38z34WtOk2sBrz/cYeztKbMJeG5eTdHO0moFuP+eMc9AnCK5QM5tC0tGZ0ZycnKLAqztw+au9S2pj3N92Pt+cxzfh+dOjoqKGs/rDxv3Aj2FAp57aD+ws48BjI3b5JwhHQgvaE3GC8lQyjCQD7eUADsq+T58WRYAAR8edwUAjg/LQBVAVY+A59bsBd4NtTKAi4noZoBUdjLCW9KL8/yAWT4cdsdb4dUCPnxLXH6wTcCHZ44fc5+N68O5vVJOczPfc1PIYwxfH3YzgInoJpdQ4OywkuzGbAVY04ftBkfBklQBH06MXUneb+b68IzJ590/eAIbWFHYTtnl9odq9X0j+j3XTvqlB0ttfsBk3CoZplBgSybpkTGA0fbNuUf6sM0wFFi/ngL7vz5MRXjLOcD8iQwfXqjuD18t5yLnavlw6RfNIOWGpGqIsx6WJsDYPRxyKxQs4GV7ptaDAueZAYuBBdzw7fv0eWmPD7ffofG89J/5R/rwWVusnnPu78NfTVP1h6+2knOu1R/+yFXo1eFedLo6FWC/JjIFfjf02ryavSpgKrq2TY5i9B9ph9nWspECq98f7vLG2gzv15HnpdfYLI6t/P7w9InSzbEJ/P5wzI3S6qdm8/rD1fFG1z6IeO4BY00f1MBUdJMNmf3AKGnMaEmiwMz+cLshg/iwqdVgKOD7MH2/mevDC8bpJr8k4MMmYR/+G557bHzYxPdhdU4XeLeWAScPAaeHx3qDxz3wsT2CS0Vz/9yRPtYXmeP+omWAV0wzgUyPuSZRfwXSGzKP/hlJpwJLRyfWvkXq6BxZjyTo6CRfLnVjYB/uDJ8CrL2elIAPw5YVZ+P3h+lESkeAFTFN8omptKM9GVgyZGtXA90gMxdNPDf8zTffdBg0c8menLyeu7w1m66n4cPF7evb3vQumAq+Dw+bPn8++ZLjw3RSgFViatjs89fNXYCzxA/E57nRXs8t8EpudgErV09znvW2ydH0roF82GbYDGvYWo9EFIDvw0QcguO4PkwnCqz21+vLQWpxsuwrzvB0sEBI7i1vLtsDbCp3auVe6F+v0hGNbY6BfNi8GHCnbiYLZnQK+LD+ubjg17k+TCcK7OevdIMvOoaUlLOONBVYBXjpRtCc9npINrS3J/F8+EkHGZfVA1wftulvmZ+m5/uwb/IDJuMOyeBUgIHN5f4gZCyeKucUYEcDmLm2rW5lvfD69MySfhD2+8PmIWvsdEGuD9tuXQk8/DC3P+ybWMANjju60H+kWz3/+CyQhrLs96EAOw3RADPX/YWyniMciDasZQDv+PCLb0FqSlc2SDnD7Czg/Lt+Uj0vHfKcxvPSn6jeH6aTGnixt1H7WnH/Bp3ta6US9UVGaei6tkEBLigAtHLKeq0vutFgcLN8uNtnv12Oty0WCXiyBYDA89KPpUxacSfLh99R+bB3osB+/ko3iIZ2gyNTAVELrEUBpseW5jTWc5d0tSenM334RW/MaSC3m0vhTnUCAj5sXa7XzzFxfZhOCrBmSaL+KpgzHXMfNgn6MM3pAu/WMuDkIeD08K/2zjNWhiiK42dGlyzGKgnWItFWjW6xeu+9r15WogtC9LASfYPoEi1EjU4QRHQiPuglhEQLgsQXH9xr7zV7uHPPZBBlzYd3n+efO/55a9/83jn3f2rlaUrfuGmeWu50f4Hhn/9S/cN/xdMUXF1N3er++Dctm4cFudb7yq8NemAe5jJc9gX/mi/13Hprlli2zgl0JWbT9eEGS3pJnekcLz2zPL80PCzipScW5ZcCHkbYPLx3ZzeotyDHpp3oQQHJDgD7NDr9QNTPlk2n2ltS5wy6HJ/d1IeXrNs2NqqpD4t46ayJRGKIKQ07x0t3jMfjQw1p+Lt6btMk53aDTdNtDELPvmvzCxmc2gRwYBBMH8T/RuqcQZdjsZv6cPslAPNlqcU5Xppf85pLw87x0sCu5RtswxhMl3A+8kHXbtCtK3/Ya/L9PzAvx+aoqOdy08wOdD0ldTrQ7VrfTX24/jawjucXhnXx0uCL2GlLmnhpbl0aVnMuN7xkbT9r7PoRdD23SYaC/LUgdRrQ5Ybp/WDwgmjTHDoelvHSMLAcSMO6eGmIVQGVYWi/N7CzkzTsW5dhZ9cMfgXO5chrycf7aWs7QYMMI+zyJubh/EEMurZhXB9uIGRwgfdL5xi79NgO2U2ri5eGIWNA1S9dO4jjpWHoatsw5tcL7eGr4X0+6LVAWc+9/07Uc+/dDbIlOok5PyB1SNg3Kay24AiAo+E1d3uI/Y7nece/4yuAvXEpeRjHSx81GyjztF68xfHSo4wwgIqHm5yNDpKG2cH0JoHpU1T13CYPNia/3u31R99gPwzK0WBEtJeSh08L0M3xbjADXWzYlq1sn7zthR3PrH1+a2dGaNDtmpKHcbx087ZgG9bES2/gb9kqHg7wQq00DJsWNLVBPIMKh6MZojv5ed8DGaJ51dwsQZdfPZBhJIuKfummX/K0jnWLrpsvfyxp4qWbmEdtw5p46c7GKGz4x/nV542bf32/dAjwZaTfo2XawUPa4eHPvvFv0rk3/LNfWr9F570+/ONvHr9L556HdVw6K/8SC3PpeIDxjEjlx2D5LwXaqmMGipAdUzkfiSu2fvnDVrB1aL9Kcr8GydxoS+iI+nBPn5v6cDhWU+gM0HHpmtybjq9s8O0j3kw5l4l/ygKtxsPMSNvEkCAyjIXQpkCF2UMglNUcYBu2ZZJz2UZiPzs3WlMfZug0r3mErA8XYui0vOUEWR/WcWnuvozWpmi4VARaTa4u/gYbhjrsQ4gLQ5ErEDC3Zm3ewjbsPOcJ5Ubr6sNDygO0nUfVh4vC0NLsU1lq0XCpxStf2+QzLZ7LVD4iHrB4oBX/R1RPYMNYGBDf7+rYsJRJzrW+IBHKjdbVhyfPg1DCRZ7W5uUQiucShnVc2m2T1e/EWg2XMgdmC/DzJ9zCdZDh74R1zIGADWOZPecJ50br+qWbRCJmJhfnhzvXnWDEQRjGddrggtRzvCPWZlg5P4cjlyYDrYYMr2zOlGVLbBhmTw1mF0J/efMKNoznPKXsx30XOKrSDcR5WpnaXtmaqTqdp5W55ehDmZspDE/b+Oqe6Fs+VZktDcBSHlweM7ti8vtZYfwXp5Eu7NP+yLAE2K1v+Hqlwhf3yDCSDXyTul8wsaeJUpdA54e3msXZ5wUUPNzwSWp9uDF/F4uVQYaTXFpjfXfBpac78b7lsZtg6YIR33Op/8NzOZfJX5UFWlXPVPl8pCIyLIQCYKHAmEBFsycyrOBcGZBVYeH44jI3WlMfrhwZ7gu3SJD90sEJjXzhVXFhWJ1rtfMLl+6bnnvBEkWd1ie51N+WBVqFAFiddqptBAFsJUj+pzMzFQZs2JZZcr8mbSMFWEBWAf5FYURXH97aIlJge3G6Pnxo1YS6RdCPJZJz3fctO+kCYqV0QOh+9Pxw+j1aph08pB0eut3wZw+i+m2Gvb20fnzUmNv9ftv84Z89TO63vWkh3kRcKheaX/kfTwI1p3jx4/0px33U97XKlx/MlsGF+ULzcJ+sA0NueLhsx1hIM39YBjeLheLX3SjXyvE88q1ll3PmDCLD8r6Yr5+KPmiah8dkb5soF6b7pUtkKRKvEqbnD4uF5lcGahcLEHOKK7PzyIFlI23DmHOtlP1EHzTNw9kZgCXa0P3SWWIA8bnCMOZNG18DjEvFouZXW8fxtGIBYk6xv7UfBi+7jgxjbLbnHptdymd9CiQPhzilzctE8zAfPbQ8Ts8fthd840pmJcSvHE+ZYXJOMdyZYWcFaHh4sDmE90HTPDygbWh8nTo0D5cqEmpXpoxy/nDgPeNQGdwsFiW/mkdtfmV4yg1Tc4r9Z84sBYVh/vErX1tsv8FmSh+07vzw+XJmue2ZFDy8Ooh4ePRBo0qRzArDhRd+Kpcyf1gsKn7NV8fWvSkscq3Uc4ov3UgG5lU7e9gCteHCz0+K/Z5+uaHZxeG+s/ugeUuVIaQ8MF3iZgz1S4eZrkgrbHje9/OH24qF5NdAEk+JOcWnr95oMsxOjXDYb/CX+05uUlX2QZt4/DDql27e1nclcp7kYWhZxDe67mjbMOZNe/6wWDRcagsqFiDmFHfKlu3s2WzjbMOYh5/K/XhgtCX6oCkeLr7HjAwEmocbFzPqxkAY/tlc6jZPy20ftF4XoHkY64z0e7RMO3hIOzz8Z8De7fXP/OrG7fXP/HLO7WU6lnNxP7IjN4dFnZbWSX6lObc4qzfrOFcGZDUuERM6w7VhJW+2qVMh0xDcj4x0mIdFnZbUIX7Vz1FqO3lISMO5IiBrYt0ixYaGPBm2eVOWc33Zt6J+ZE19WNRpSZ3gV5JzRb1Zw7kiIOtFMx405M0w5k1Llu/tfmQHHa8PizotqRP8SnKuqDdrOFcEZHHzzeIeDKvLubgfWcOvok5L6SS/kpybjxekCpdz5txkQNbEkFESoPZBz4b5x6Dk0nwDs19B/cjfcDPXSW5GdVqss5BO8CvFueE5dr0Zc26JJOeKgKywMRFg9dAfMDyGc6ldzkX9yJiHs9ZJ4ebiok6r0FmpOkjlV3zfyuhcsKg3Kzg32QedDMh6AXWLArTa4M0w5tICYyxWzhX9yCQPB0WdltIJfiXrvqzeHGb1ZmfOTQZknYNmmcOj69b0ZhjzZsUEK+fifmSFTg48EnVaUif4leZc6G9Gpuo4VwZkbTAmbAEPhjWg6bGeS/Prj+ZkAdYZ/x8t/8ND8ko/PHS74Z+uc23Y7UvmT9e5Nuz2TeFP17k2bIAKODtw4LQA2h2SMi2XFipRNEDr5BxgWsfnI5G6xjg32r1hFXAacQachUIds2yWMh2Xlp1QbNWEQqROzAEmdWI+EqUrKuTeDGPgDCbP6uVquco2rOHSYkUANjQjdWIOMKkT85EonVy8GcbA2XjR6KJPgF3NbMNqLg2HGZfOZdQSL6LTcX6Vc4ApnZyPROnE4tEwBs6yxuYtmctgwwpZSnBzzJhI6eQcYEon5iPROrF4MWw3GieBs8EoXms8hAwjGeJSbqTMKFqH5gBjXShVJ+YjkTqxeDFsB1ElG407822HdkSGFTIZ3GzFX3ZW6qrcRjoxB5jQ3QynzkfCudFv0X5i8WQYA+dEo2aAvUiRYUcubQatdpXtXbIQqUNzgLHuUYquI5qPhHRZUnXNxOLRMAbOWEOjWAdAhjVcWpd/sRipE3OASZ2Yj0Tp5OLFMA3EhoZLf5MO8/D/R8v/8JCuePinG/nPw/952AMPO3ApymU2nLEZ5VVp9+PneGkd6m/W9EF7qw9ruBTlMhvO2IzyqjT7iXO8pA71N2v6oL3VhzW8iXKZDWdsRnlVmv3EOV5Sh/qbdX3QxbzUhx1480nnyjiX2VBj8+3OgPOqHPYre6iyPMdLcm4otb9Z0wftrT6s4U2Uy2zosBliVWhuFud4SR3ub9b0QRfyVB9GvBmDVN5EucyGDpvtvCqs64h4GJ3jxftZSCf6m1X3zYJyo73UhxFvPiqKeFO0Gyt4uHMqNqO8KrxfzdT90DlevF8sVYf6m5Hu4aEXKX3Q3urDGn5FucyGDpt5XhXNzeIcL6lD/c2aPmhv9WENb6JcZkODzSKviuJXcY6X1KH+Zk0ftLf6MMGbPoJLA7+GcwOkzvefh//Dw3885NdnBn9Rvur73V4AAAAASUVORK5CYII=) !important; !important}`; return ret; } function watchBottomIframe() { let h = new DomHook(".BottomGroup", true, (m) => { if (currentMode == 0) { return; } if (m.length == 1) { setNightModeIframe(); } }) } function setNightModeIframe() { // 设置底部鱼吧的夜间模式 let dom = document.getElementsByClassName("BottomGroup")[0].getElementsByTagName("iframe")[0]; if (dom == undefined) { return } StyleHook_setIframe(dom.contentWindow.document, "Ex_Style_NightModeIframe", ` body,#groupListBox,.mainbg,.wb_card-wbCardDetail-1wzCV,.video-imgWrap-3Mf6v{background: rgb(35,36,39) !important;} .wb_card-wbCardWrap-22KrE,.wb_card-topListItemBox-1ui_g{border-bottom: 1px solid rgb(47,48,53) !important;} .wb_card-wbInfo-19JiQ a,.wb_card-wbText-2fk2Y{color: rgb(204,204,204) !important;} .wb_handle-wbRowLine-3OXI6 li,.wb_card-groupnameAndGrouplevel-38MGW{background: rgb(47,48,53) !important;} .index-dyPage-260IV a{background-color: rgb(47,48,53)!important;border: 1px solid rgb(47,48,53)!important;} .index-topTypeStyle-2ksW4{background-color: rgb(47,48,53)!important;color: rgb(204,204,204) !important;} .index-dyPage-260IV span{background-color: rgb(47,48,53)!important;} .index-editorArea-3XhrM input[data-input=title]{background-color: rgb(47,48,53)!important;color:rgb(204,204,204)!important;border: 1px solid rgb(47,48,53)!important;} .index-dyPageGoNumber-LGN4a{background-color: rgb(47,48,53)!important;color:rgb(204,204,204)!important;} span.index-dyPageActive-op79B{color:rgb(204,204,204)!important;} .editor-editorPluginsWrapper-HGPzc{background-color: rgb(47,48,53)!important;border-bottom: 1px solid rgb(47,48,53)!important;border-top: 1px solid rgb(47,48,53)!important;} .style-voteicon-3aTqD{color:rgb(204,204,204)!important;} .editor-editorWrapper-2fChb{border: 1px solid rgb(47,48,53)!important;} .editor-editorPluginsWrapper-HGPzc [data-role="menu"]:hover{background-color: rgb(47,48,53)!important;cursor: pointer!important;} .editor-editorContentRoot-3PCjH{color: rgb(204,204,204) !important;} .editor-editorNotLoginMask-1hCr-{background-color: rgb(47,48,53)!important;color: rgb(204,204,204) !important;} .style-newvoteTopwrapper-3PgJY{background: rgb(47,48,53)!important;} .style-newvoteHead-j0bH1{color: rgb(204,204,204) !important;} .style-newvoteHeadAttendView-1EgXK, .style-newvoteHeadAttendView-1EgXK:focus{background: rgb(47,48,53)!important;} .style-optionWrapper-2FhfD{background: rgb(35,36,39) !important;cursor: pointer!important;} .style-newvotestyleTitle-32flx{color: rgb(204,204,204) !important;} .editor-3MzrC{background: rgb(47,48,53)!important;border-top: 1px solid rgb(47,48,53)!important;border-bottom: 1px solid rgb(47,48,53)!important;} .editor-2y1wx{border: 1px solid rgb(47,48,53)!important;color:rgb(204,204,204)!important;} .VideoRecommendItem-liveTitle,.Bottom-tab--header{color:rgb(204,204,204)!important;} .wb_card-wbCardDetail-3bz_l{background-color: rgb(35,36,39)!important;} .wb_card-topListItemBox-7rXH3{border-bottom: 1px solid rgb(47,48,53)!important;} .wb_card-wbCardWrap-2iAew{border-bottom: 1px solid rgb(47,48,53)!important;} .wb_card-wbInfo-CLCyv a{color: rgb(204,204,204)!important;} .wb_card-groupnameAndGrouplevel-1KuV5{background: rgb(47,48,53)!important;} .wb_handle-line-FzKRd{color: rgb(125,125,125)!important;} .wb_handle-wbRowLine-2qn-s li{background: rgb(47,48,53)!important;} .wb_card-wbText-3sLfN{color: rgb(167,167,167)!important;} .editor-editorWrapper-2y1wx{border: 1px solid rgb(47,48,53)!important;} .editor-editorPluginsWrapper-3MzrC{border-top: 1px solid rgb(47,48,53)!important;border-bottom: 1px solid rgb(47,48,53)!important;background-color: rgb(47,48,53)!important;} .index-dyPageGoNumber-2Ib1r,.index-topTypeStyle-3MKuW,.editor-editorNotLoginMask-35J9d{background-color: rgb(47,48,53)!important;color: rgb(125,125,125)!important;} .index-titleInput-1uVJS{border: 1px solid rgb(47,48,53)!important;background: rgb(47,48,53)!important;color: rgb(167,167,167)!important;} .index-dyPage-1CwXA span, .index-dyPage-1CwXA a{color: rgb(125,125,125)!important;background-color: rgb(47,48,53)!important;border: 1px solid rgb(47,48,53)!important;} .editor-editorContentRoot-3QvJi{color: rgb(167,167,167)!important;} .wb_card-wbCardDetail-wYiL6{background: rgb(35,36,39)!important;} .wb_handle-wbRowLine-L5WHa>li{background: rgb(47,48,53)!important;} .wb_handle-line-lCiNT{color: rgb(125,125,125)!important;} .wb_card-wbCardWrap-OQ\\+ac{border-bottom: rgba(47,48,53,1) solid 1px !important;} .wb_card-groupnameAndGrouplevel-Q8fGX{background: rgb(47,48,53)!important;color: rgb(125,125,125)!important;} .wb_card-hiddenText-oUz98{color: rgb(125,125,125)!important;} .wb_card-wbCardWrap-OQ+ac,.wb_card-topListItemBox-wRCrz{border-bottom:1px solid rgba(47,48,53,1)!important;} .index-topTypeStyle-WHbMC{background: rgb(47,48,53)!important;color: rgb(125,125,125)!important;} .index-tagWrapper-x5Bnl{color: rgb(125,125,125)!important;} .index-dyPage-\\+pup\\+ span, .index-dyPage-\\+pup\\+ a{background-color: rgb(47,48,53)!important;border: 1px solid rgb(125,125,125)!important;} input[type="text"], textarea{background-color: rgb(47,48,53)!important;border: 1px solid rgb(125,125,125)!important;} .style-newvoteHeadAttendView-JwNdc, .style-indexLefttabcontentItemVote-VxGBz{background: rgb(47,48,53)!important;} .style-newvoteHead-CetsR strong{color: rgb(125,125,125)!important;} .style-optionWrapper-GJ6RJ{background: rgb(125,125,125)!important;} .style-newvotestyleTitle-j27SH{color:rgb(47,48,53)!important;} .index-wrapperBox-fPzNk{background: rgb(35,36,39)!important;} .index-content-pC8LK,.index-hotTopTitle-q1ajK,.index-title-Hmt3k{color:rgb(167,167,167)!important;} .index-aboutTitle-gEBas,.index-title-Hmt3k,.index-itemTitle-M\\+\\+1W{color:rgb(167,167,167)!important;} .index-itemContent-ti7Xk{background:rgb(47,48,53)!important;} .index-controlBgL-tdJKP,.index-controlBg-Pexdr{background: transparent!important;} .index-wrapperBox-fPzNk{border:1px solid rgb(125,125,125) !important;} .wb_card-wbCardWrap-4JJpr,.wb_card-topListItemBox-035It{border-bottom:1px solid rgb(125,125,125)!important;} .index-aboutTopic-akyQd .index-itemWrap-6-qcp{background: rgb(47,48,53)!important;} .index-aboutTopic-akyQd .index-topicName-a5Qxh{color:rgb(167,167,167)!important;} .wb_card-wbCardDetail-HysKF{background: rgb(35,36,39)!important;} .wb_card-wbInfo-a7-LR a,.wb_card-wbText-mwDSN{color:rgb(167,167,167)!important;} .wb_card-groupnameAndGrouplevel-EbL7t{background: rgb(47,48,53)!important;color: rgb(125,125,125)!important;} .wb_handle-wbRowLine-6D3SZ a{background: rgb(47,48,53)!important;color: rgb(125,125,125)!important;} .wb_handle-line-Dd0zJ{color: rgb(125,125,125)!important;} `) } function cancelNightModeIframe() { StyleHook_removeIframe(document.getElementsByClassName("BottomGroup")[0].getElementsByTagName("iframe")[0].contentWindow.document, "Ex_Style_NightModeIframe") } function initPkg_Point() { initPkg_Point_insertDom(); initPkg_Point_Func(); initPkg_Point_Constructor(); initPkg_Point_Module(); } function initPkg_Point_Module() { initPkg_Point_PointPanel(); } function initPkg_Point_insertDom() { let a = document.createElement("div"); a.id = "ex-point"; a.innerHTML = ` 💗 积分 `; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Point_Func() { document.getElementById("ex-point").addEventListener("click", () => { let a = document.getElementsByClassName("point__panel")[0]; if (a.style.display != "block") { a.style.display = "block"; } else { a.style.display = "none"; } }) } async function initPkg_Point_Constructor() { let ret = await getUserPoint(dyToken); let valueDom = document.getElementById("point__value"); if (ret.error == "0") { valueDom.className = ""; valueDom.innerText = ret.data[0].point; document.getElementById("ex-point").title = `更新时间:${ ret.data[0].update_time }`; } else if (ret.error == "2") { alert(ret.msg); } else { valueDom.className = ""; valueDom.innerText = "0"; } } async function updateUserPoint() { let ret = await getUserPoint(dyToken); let valueDom = document.getElementById("point__value"); if (ret.error == "0") { valueDom.className = ""; valueDom.innerText = ret.data[0].point; document.getElementById("ex-point").title = `更新时间:${ ret.data[0].update_time }`; showMessage("【积分系统】积分更新完毕", "success"); } else if (ret.error == "2") { alert(ret.msg); } else { valueDom.className = ""; valueDom.innerText = "0"; } } function getUserPoint(token) { // 获取用户积分 return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "http://122.51.5.63:27999/douyu/point/5189167/query_by_uid", data: "token=" + token, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function getItemList(token) { // 获取物品列表 return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "http://122.51.5.63:27999/douyu/point/5189167/query_item", data: "token=" + token, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function exchangeItem(token, item_id, id, info) { // 兑换物品 return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "http://122.51.5.63:27999/douyu/point/5189167/exchange", data: "token=" + token + "&item_id=" + item_id + "&id=" + id + "&info=" + info, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function getExchangeRecord(token, offset) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "http://122.51.5.63:27999/douyu/point/5189167/query_exchange", data: "token=" + token + "&offset=" + offset, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function getPointList(token) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "http://122.51.5.63:27999/douyu/point/5189167/point_list", data: "token=" + token, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function initPkg_Point_PointExchange() { initPkg_Point_PointExchange_insertDom(); initPkg_Point_PointExchange_insertFunc(); } function initPkg_Point_PointExchange_insertDom() { renderExchangePanel(); } function initPkg_Point_PointExchange_insertFunc() { } async function renderExchangePanel() { if (document.getElementById("ex-exchange") !== null) { return; } let ret = await getItemList(dyToken); if (ret.error != "0") { showMessage("【积分系统】获取物品列表失败:" + ret.msg, "error"); return; } if (ret.data == null) { showMessage("【积分系统】暂无可兑换的物品", "error"); return; } let a = document.createElement("div"); a.id = "ex-exchange"; let html = `
    X
    `; for (let i = 0; i < ret.data.length; i++) { html = html + `
    ${ ret.data[i].name } ${ ret.data[i].description } 剩余 ${ ret.data[i].num } 件 💗${ ret.data[i].price }
    兑换
    `; } html = html + "
    "; a.innerHTML = html; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); bindExchangePanel(ret); } function bindExchangePanel(itemJson) { let dom = document.getElementsByClassName("item__exchange"); for (let i = 0; i < dom.length; i++) { dom[i].onclick = () => { exchangeItemEvent(itemJson.data[i].id, itemJson.data[i].num, itemJson.data[i].price); } } document.getElementsByClassName("exchange__close")[0].onclick = () => { let a = document.getElementById("ex-exchange"); if (a !== null) { a.remove(); } } } async function exchangeItemEvent(item_id, item_num, item_price){ if (item_num <= 0) { showMessage("【积分系统】兑换失败:物品数量不足", "error"); return; } let currentPoint = document.getElementById("point__value").innerText; if (currentPoint - item_price < 0) { showMessage("【积分系统】兑换失败:积分不足", "error"); return; } showPrompt("请填写备注信息(联系方式/收货地址)",async (info) => { if (info == "") { showMessage("【积分系统】兑换失败:未填写备注信息", "error"); return; } let id = await getUserName(); let ret = await exchangeItem(dyToken, item_id, id, info); if (ret.error == "0") { showMessage("【积分系统】" + ret.msg, "success"); if (ret.data.length > 0) { document.getElementById("point__value").innerText = ret.data[0].point; document.getElementById("ex-point").title = `更新时间:${ ret.data[0].update_time }`; } } else { showMessage("【积分系统】" + ret.msg, "error"); } }, () => {return}); } function initPkg_Point_PointList() { initPkg_Point_PointList_insertDom(); } function initPkg_Point_PointList_insertDom() { renderPointList(); } function initPkg_Point_PointList_insertFunc() { document.getElementsByClassName("pointlist__close")[0].onclick = () => { let a = document.getElementById("ex-pointlist"); if (a !== null) { a.remove(); } } } async function renderPointList() { if (document.getElementById("ex-pointlist") !== null) { return; } let ret = await getPointList(dyToken); if (ret.error != "0") { showMessage("【积分系统】获取积分榜失败:" + ret.msg, "error"); return; } if (ret.data == null) { showMessage("【积分系统】积分榜暂无数据", "error"); return; } let a = document.createElement("div"); a.id = "ex-pointlist"; let html = `
    X
    `; for (let i = 0; i < ret.data.length; i++) { html = html + ` `; } html = html + "
    排名 昵称 积分
    ${ i + 1 } ${ ret.data[i].id } ${ ret.data[i].point }
    "; a.innerHTML = html; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); // 异步函数所以要把绑定函数放在最后 initPkg_Point_PointList_insertFunc(); } function initPkg_Point_PointPanel() { initPkg_Point_PointPanel_insertDom(); initPkg_Point_PointPanel_insertFunc(); } function initPkg_Point_PointPanel_insertDom() { let a = document.createElement("div"); a.className = "point__panel"; a.innerHTML = `
    更新积分
    积分榜
    兑换物品
    兑换记录
    积分规则
    `; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Point_PointPanel_insertFunc() { document.getElementById("panel__update").addEventListener("click", () => { closePointPanel(); updateUserPoint(); }); document.getElementById("panel__pointlist").addEventListener("click", () => { closePointPanel(); initPkg_Point_PointList(); }); document.getElementById("panel__exchange").addEventListener("click", async () => { closePointPanel(); initPkg_Point_PointExchange(); }); document.getElementById("panel__record").addEventListener("click", async () => { closePointPanel(); initPkg_Point_PointRecord(); }); document.getElementById("panel__rules").addEventListener("click", async () => { closePointPanel(); openPage("https://qianjiachun.github.io/DouyuEx/rules", true); }); } function closePointPanel() { document.getElementsByClassName("point__panel")[0].style.display = "none"; } let currentOffset = 0; let maxOffset = 99999; function initPkg_Point_PointRecord() { currentOffset = 0; initPkg_Point_PointRecord_insertDom(); initPkg_Point_PointRecord_insertFunc(); } function initPkg_Point_PointRecord_insertDom() { renderRecordWrap(); renderRecord(currentOffset); } function initPkg_Point_PointRecord_insertFunc() { document.getElementsByClassName("record__close")[0].onclick = () => { let a = document.getElementById("ex-record"); if (a !== null) { a.remove(); } } document.getElementsByClassName("record__prev")[0].onclick = () => { if (currentOffset < 10) { showMessage("【积分系统】兑换系统已到首页", "error"); return; } currentOffset = currentOffset - 10; renderRecord(currentOffset); } document.getElementsByClassName("record__next")[0].onclick = () => { if (currentOffset >= maxOffset) { showMessage("【积分系统】兑换系统已到尾页", "error"); return; } currentOffset = currentOffset + 10; renderRecord(currentOffset); } } function renderRecordWrap() { if (document.getElementById("ex-record") !== null) { return; } let a = document.createElement("div"); a.id = "ex-record"; let html = `
    X
    上一页
    下一页
    `; a.innerHTML = html; let b = document.getElementsByClassName("PlayerToolbar-Wealth")[0]; b.insertBefore(a, b.childNodes[0]); } async function renderRecord(offset) { let dom = document.getElementsByClassName("records__wrap"); if (dom.length <= 0) { return; } dom[0].innerHTML = ""; let recordList = await getExchangeRecord(dyToken, offset); if (recordList.error != "0") { showMessage("【积分系统】" + recordList.msg, "error"); return; } if (recordList.data == null) { maxOffset = currentOffset; showMessage("【积分系统】无兑换记录", "error"); return; } let html = ""; for (let i = 0; i < recordList.data.length; i++) { html += `
    (${ recordList.data[i].status=="1"?"已发货":"未发货" })${ recordList.data[i].item_name }
    ${ recordList.data[i].update_time }
    💗${ recordList.data[i].price }
    `; } dom[0].innerHTML = html; bindRecord(recordList); } function bindRecord(recordJson) { let dom = document.getElementsByClassName("record__wrap"); for (let i = 0; i < dom.length; i++) { dom[i].onclick = () => { PostbirdAlertBox.alert({ 'title': '备注信息', 'content': recordJson.data[i].info, 'okBtn': '确定', 'contentColor': 'rgb(51,51,51)', }); } } } var 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, a[a.length - 1], a[a.length - 1]); break; default: createNewVideo_Douyu(id, rid); break; } } function setElementVideo(id, l) { if (flvjs.isSupported()) { var videoElement = document.getElementById("exVideoPlayer" + 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("exVideoDiv" + String(id)); let scale = document.getElementById("exVideoScale" + 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(400, ev.clientX - pos.x + pos.w) h = Math.max(0, 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 box.style.width = w + 'px'; box.style.height = h + 'px'; } document.onmouseup = function (e) { e.stopPropagation(); e.preventDefault(); document.onmousemove = null; document.onmouseup = null; } } } function setElementDrag(id) { let box = document.getElementById("exVideoDiv" + 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; box.style.left = mouseX + "px"; box.style.top = mouseY + "px"; } document.onmouseup = function (event) { event.stopPropagation(); document.onmousemove = null; document.onmouseup = null; } } } // Douyu function createNewVideo_Douyu(id, rid) { getRealLive_Douyu(rid, true, false, "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 = "exVideoDiv" + String(id); a.rid = rid; a.className = "exVideoDiv"; html += "
    " + "斗鱼 - " + rid + ""; html += ""; html += ""; html += "无视频?"; 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("exVideoDiv" + String(id)); let exVideoPlayer = document.getElementById("exVideoPlayer" + String(id)); let info = document.getElementById("exVideoInfo" + String(id)); let scale = document.getElementById("exVideoScale" + String(id)); let exVideoEmbed = document.getElementById("exVideoEmbed" + String(id)); let exVideoUnEmbed = document.getElementById("exVideoUnEmbed" + String(id)); let originVideo = document.getElementById("__video2"); exVideoPlayer.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("exVideoDiv" + String(i)); if (box != null) { if (i == id) { box.style.zIndex = 1016; } else { box.style.zIndex = 1015; } } } } let exVideoQn = document.getElementById("exVideoQn" + String(id)); let exVideoCDN = document.getElementById("exVideoCDN" + String(id)); let exVideoClose = document.getElementById("exVideoClose" + String(id)); exVideoQn.onchange = function() { getRealLive_Douyu(rid, true, false, exVideoQn.value, (lurl) => { videoPlayerArr[id].destroy(); setElementVideo(id, lurl); }) } exVideoCDN.onchange = function() { getRealLive_Douyu(rid, true, false, exVideoQn.value, (lurl) => { videoPlayerArr[id].destroy(); setElementVideo(id, lurl); }) } exVideoClose.onclick = function() { originVideo.style.display = "block"; videoPlayerArr[id].destroy(); exVideoPlayer.remove(); box.remove(); } let exVideoCopy = document.getElementById("exVideoCopy" + String(id)) || document.getElementById("exVideoRID" + String(id)); if (exVideoCopy) { exVideoCopy.onclick = function() { getRealLive_Douyu(rid, !exVideoCopy.innerHTML.includes("斗鱼音频流"), false, exVideoQn.value, (lurl) => { GM_setClipboard(String(lurl).replace("https", "http")); showMessage("复制成功", "success"); }) } } if (exVideoEmbed) { exVideoEmbed.onclick = function() { originVideo.style.display = "none"; exVideoEmbed.style.display = "none"; exVideoUnEmbed.style.display = "inline"; box.style.height = "0px"; originVideo.parentElement.insertBefore(exVideoPlayer, originVideo); } } if (exVideoUnEmbed) { exVideoUnEmbed.onclick = function() { originVideo.style.display = "block"; exVideoUnEmbed.style.display = "none"; exVideoEmbed.style.display = "inline"; box.style.height = "250px"; box.insertBefore(exVideoPlayer, box.childNodes[box.childNodes.length - 1]); } } } function createNewAudio_Douyu(id, rid) { getRealLive_Douyu(rid, false, true, "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 = "exVideoDiv" + String(id); a.rid = rid; a.className = "exVideoDiv"; 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); } }); } // 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 = "exVideoDiv" + String(id); a.rid = rid; a.className = "exVideoDiv"; html += "
    " + "Bilibili - " + rid + ""; html += ""; html += ""; 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_Bilibili(id, rid); setElementVideo(id, lurl); } }); } function setElementFunc_Bilibili(id, rid) { let box = document.getElementById("exVideoDiv" + String(id)); let exVideoPlayer = document.getElementById("exVideoPlayer" + String(id)); let info = document.getElementById("exVideoInfo" + String(id)); let scale = document.getElementById("exVideoScale" + String(id)); exVideoPlayer.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("exVideoDiv" + String(i)); if (box != null) { if (i == id) { box.style.zIndex = 1016; } else { box.style.zIndex = 1015; } } } } let exVideoQn = document.getElementById("exVideoQn" + String(id)); let exVideoCDN = document.getElementById("exVideoCDN" + String(id)); let exVideoClose = document.getElementById("exVideoClose" + String(id)); let exVideoEmbed = document.getElementById("exVideoEmbed" + String(id)); let exVideoUnEmbed = document.getElementById("exVideoUnEmbed" + String(id)); let originVideo = document.getElementById("__video2"); exVideoQn.onchange = function() { getRealLive_Bilibili(rid, exVideoQn.value, exVideoCDN.value, (lurl) => { videoPlayerArr[id].destroy(); setElementVideo(id, lurl); }) } exVideoCDN.onchange = function() { getRealLive_Bilibili(rid, exVideoQn.value, exVideoCDN.value, (lurl) => { videoPlayerArr[id].destroy(); setElementVideo(id, lurl); }) } exVideoClose.onclick = function() { originVideo.style.display = "block"; videoPlayerArr[id].destroy(); exVideoPlayer.remove(); box.remove(); } exVideoEmbed.onclick = function() { originVideo.style.display = "none"; exVideoEmbed.style.display = "none"; exVideoUnEmbed.style.display = "inline"; box.style.height = "0px"; originVideo.parentElement.insertBefore(exVideoPlayer, originVideo); } exVideoUnEmbed.onclick = function() { originVideo.style.display = "block"; exVideoUnEmbed.style.display = "none"; exVideoEmbed.style.display = "inline"; box.style.height = "250px"; box.insertBefore(exVideoPlayer, box.childNodes[box.childNodes.length - 1]); } let exVideoCopy = document.getElementById("exVideoCopy" + String(id)); exVideoCopy.onclick = function() { getRealLive_Bilibili(rid, exVideoQn.value, exVideoCDN.value, (lurl) => { GM_setClipboard(lurl); showMessage("复制成功", "success"); }) } } // Huya function createNewVideo_Huya(id, rid, rname){ getRealLive_Huya(rid, "1", (lurl, msg) => { if (lurl != "" || lurl != null) { if (msg != "") { showMessage(msg, "error"); return; } let a = document.createElement("div"); let html = ""; a.id = "exVideoDiv" + String(id); a.rid = rid; a.className = "exVideoDiv"; html += "
    " + "Huya - " + rname + ""; html += ""; // html += ""; 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_Huya(id, rid); setElementVideo(id, lurl); } }); } function setElementFunc_Huya(id, rid) { let box = document.getElementById("exVideoDiv" + String(id)); let exVideoPlayer = document.getElementById("exVideoPlayer" + String(id)); let info = document.getElementById("exVideoInfo" + String(id)); let scale = document.getElementById("exVideoScale" + String(id)); let exVideoEmbed = document.getElementById("exVideoEmbed" + String(id)); let exVideoUnEmbed = document.getElementById("exVideoUnEmbed" + String(id)); exVideoPlayer.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("exVideoDiv" + String(i)); if (box != null) { if (i == id) { box.style.zIndex = 1016; } else { box.style.zIndex = 1015; } } } } let exVideoQn = document.getElementById("exVideoQn" + String(id)); // let exVideoCDN = document.getElementById("exVideoCDN" + String(id)); let exVideoClose = document.getElementById("exVideoClose" + String(id)); let originVideo = document.getElementById("__video2"); exVideoQn.onchange = function() { getRealLive_Huya(rid, exVideoQn.value, (lurl, msg) => { if (msg != "") { showMessage(msg, "error"); return; } videoPlayerArr[id].destroy(); setElementVideo(id, lurl); }) } exVideoClose.onclick = function() { originVideo.style.display = "block"; videoPlayerArr[id].destroy(); exVideoPlayer.remove(); box.remove(); } let exVideoCopy = document.getElementById("exVideoCopy" + String(id)); exVideoCopy.onclick = function() { getRealLive_Huya(rid, exVideoQn.value, (lurl, msg) => { if (msg != "") { showMessage(msg, "error"); return; } GM_setClipboard(lurl); showMessage("复制成功", "success"); }) } exVideoEmbed.onclick = function() { originVideo.style.display = "none"; exVideoEmbed.style.display = "none"; exVideoUnEmbed.style.display = "inline"; box.style.height = "0px"; originVideo.parentElement.insertBefore(exVideoPlayer, originVideo); } exVideoUnEmbed.onclick = function() { originVideo.style.display = "block"; exVideoUnEmbed.style.display = "none"; exVideoEmbed.style.display = "inline"; box.style.height = "250px"; box.insertBefore(exVideoPlayer, box.childNodes[box.childNodes.length - 1]); } } // 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 = "exVideoDiv" + String(id); a.rid = rid; a.className = "exVideoDiv"; 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("exVideoDiv" + String(id)); let exVideoClose = document.getElementById("exVideoClose" + String(id)); exVideoClose.onclick = function() { videoPlayerArr[id].destroy(); box.remove(); } box.onclick = function(e) { e.stopPropagation(); e.preventDefault(); for (let i = 0; i < videoPlayerArr.length; i++) { let box = document.getElementById("exVideoDiv" + String(i)); if (box != null) { if (i == id) { box.style.zIndex = 1016; } else { box.style.zIndex = 1015; } } } } } let real_info = { view: "", showtime: 1015, danmu_person_count: "", gift_person_count: "", paid_person_count: "", isShow: 2, money_yc: 0, money_bag: 0, money_total: 0, } let hasAvatarBottom = false; function initPkg_RealAudience() { initPkg_RealAudience_StyleHook(); initPkg_RealAudience_Dom(); initPkg_RealAudience_Func(); setAvatarVideo(); 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; setRealViewer(); setInterval(setRealViewer, 150000); setInterval(switchRealAndTodayWatch, 10000); }).catch(err => { console.log("请求失败!", err); }) } function initPkg_RealAudience_StyleHook() { StyleHook_set("Ex_Style_RealAudience", ` .VideoEntry{display:none !important;} .layout-Player-rank{top:34px !important;} `); } function initPkg_RealAudience_Dom() { let real_viewIcon = ''; let real_danmuIcon = ''; // let real_giftIcon = '' let real_money_yc = ''; document.getElementsByClassName("VideoEntry")[0].style.display = "none"; // document.querySelector(".AnchorAnnounce > h3").style.display = "none"; let html = ""; let a = document.createElement("div"); a.className = "real-audience"; html += "
    "; html += "
    " + real_viewIcon + '****
    '; html += "
    " + real_danmuIcon + '****
    '; // html += "
    " + real_giftIcon + '****
    '; html += "
    " + real_money_yc + '****
    '; html += "
    "; html += '' + "已播:" + "****" + ""; html += '"; a.innerHTML = html; let b = document.getElementsByClassName("layout-Player-announce")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_RealAudience_Func() { document.getElementsByClassName("real-audience")[0].addEventListener("click", function() { openPage(`https://www.doseeing.com/room/${rid}`, true); }) } async function setRealViewer() { if(document.querySelector(".MatchSystemChatRoomEntry") != null){ document.querySelector(".MatchSystemChatRoomEntry").style.display = "none"; } let retData = await getRealViewer(rid); let todayWatchData = await getTodayWatch(rid); let showedTime = 0; if (real_info.isShow == 2) { showedTime = 0; } else { if (real_info.showtime == 1015) { showedTime = 0; } else { showedTime = Math.floor(Date.now()/1000) - Number(real_info.showtime); } } real_info.view = retData.data["active.uv"] || 0; real_info.danmu_person_count = retData.data["chat.uv"] || 0; real_info.gift_person_count = retData.data["gift.all.uv"] || 0; real_info.paid_person_count = retData.data["gift.paid.uv"] || 0; real_info.money_yc = Number(retData.data["gift.paid.price"] / 100 || 0).toFixed(2); real_info.money_total = Number(retData.data["gift.all.price"] / 100 || 0).toFixed(2); 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 + " 付费人数:" + real_info.paid_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; document.getElementById("real-audience__time").innerText = "已播:" + formatSeconds(showedTime); document.getElementById("real-audience__time").title = "开播时间:" + String(dateFormat("yyyy年MM月dd日hh时mm分ss秒 ",new Date(Number(real_info.showtime + "000")))) + "\n已观看:" + formatSeconds(todayWatchData.data.todayWatch); if (todayWatchData.error == 0) { document.getElementById("real-audience__watchtime").innerText = "已观看:" + formatSeconds(todayWatchData.data.todayWatch); document.getElementById("real-audience__watchtime").title = "开播时间:" + String(dateFormat("yyyy年MM月dd日hh时mm分ss秒 ",new Date(Number(real_info.showtime + "000")))) + "\n已观看:" + formatSeconds(todayWatchData.data.todayWatch); } } function setAvatarVideo() { // 1. 插入对应的dom // 2. 绑定相应的函数 // 3. 拉高黑框 // 4. 对头像框鼠标移入移出事件绑定 let homeDom = document.querySelectorAll(".VideoEntry-tabItem>a")[0]; if (homeDom == undefined) { return; } let videoUrl = homeDom.href + "?type=video"; let videoReplayUrl = homeDom.href + "?type=liveReplay"; setAvatarVideo_Dom(); setAvatarVideo_Func(videoUrl, videoReplayUrl); document.getElementsByClassName("Title-anchorPic-bottom")[0].style.display = "none"; document.getElementsByClassName("Title-anchorPic-bottom")[0].style.height = hasAvatarBottom ? "44px" : "22px"; document.getElementsByClassName("Title-anchorPicBack")[0].addEventListener("mouseenter", () => { document.getElementsByClassName("Title-anchorPic-bottom")[0].style.display = "block"; }); document.getElementsByClassName("Title-anchorPicBack")[0].addEventListener("mouseleave", () => { document.getElementsByClassName("Title-anchorPic-bottom")[0].style.display = "none"; }); } function setAvatarVideo_Dom() { let a = document.createElement("div"); hasAvatarBottom = !!document.getElementsByClassName("Title-anchorPic-bottom")[0]; a.className = hasAvatarBottom ? "" : "Title-anchorPic-bottom"; a.innerHTML = `
    回看
    投稿
    ` let b = document.getElementsByClassName("Title-anchorPic-bottom")[0] || document.getElementsByClassName("Title-anchorPicBack")[0]; b.append(a); } function setAvatarVideo_Func(videoUrl, videoReplayUrl) { document.getElementById("Ex_VideoSubmit").addEventListener("click", () => { openPage(videoUrl, true); }) document.getElementById("Ex_VideoReview").addEventListener("click", () => { openPage(videoReplayUrl, true); }) } function getTodayWatch(rid) { return new Promise((resolve, reject) => { fetch('https://www.douyu.com/japi/interactnc/web/fsjk/getCardTaskInfo?rid=' + rid,{ method: 'GET', mode: 'no-cors', credentials: 'include' }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { reject(err); }) }) } function getRealViewer(rid) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "POST", url: `https://www.doseeing.com/xeee/room/aggr`, headers: { "Connection": "keep-alive", "Content-Type": "application/json;charset=UTF-8", "Origin": "https://www.doseeing.com", "Referer": "https://www.doseeing.com/room/" + rid, "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/91.0.4472.114" }, data: `{"m":"${window.btoa(`rid=${rid}&dt=0`).split("").reverse().join("")}"}`, responseType: "json", onload: (response) => { resolve(response.response); }, onerror: (err) => { reject(err); } }); }) } function switchRealAndTodayWatch() { let realDom = document.getElementById("real-audience__time"); let watchDom = document.getElementById("real-audience__watchtime"); if (realDom.style.display == "none") { realDom.style.display = "block"; watchDom.style.display = "none"; } else { realDom.style.display = "none"; watchDom.style.display = "block"; } } function initPkg_Refresh() { initPkg_Refresh_BarrageFrame(); initPkg_Refresh_Video(); initPkg_Refresh_Barrage(); } function saveData_Refresh() { // 此处为保存简洁模式的数据,请在每次操作后都调用这个函数以保存状态 // 数据结构 // {功能1:{子功能1:{}}} // 每个子模块需要提供相应的返回数据函数 let data = { barrageFrame: { status: refresh_BarrageFrame_getStatus(), }, video: { status: refresh_Video_getStatus(), }, barrage: { status: refresh_Barrage_getStatus(), } } localStorage.setItem("ExSave_Refresh", JSON.stringify(data)); // 存储弹幕列表 } let current_barrage_status = 0; // 0没被简化 1被简化 function initPkg_Refresh_Barrage() { initPkg_Refresh_Barrage_Dom(); initPkg_Refresh_Barrage_Func(); initPkg_Refresh_Barrage_Set(); } function initPkg_Refresh_Barrage_Dom() { Refresh_Barrage_insertIcon(); } function Refresh_Barrage_insertIcon() { let a = document.createElement("a"); a.className = "refresh-barrage"; a.id = "refresh-barrage"; a.innerHTML = '前缀'; let b = document.getElementsByClassName("Barrage-toolbar")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Refresh_Barrage_Func() { document.getElementById("refresh-barrage").addEventListener("click", function() { if (current_barrage_status == 0) { // 简化 current_barrage_status = 1; setRefreshBarrage(); } else { current_barrage_status = 0; cancelRefreshBarrage(); } saveData_Refresh(); }); } function refresh_Barrage_getStatus() { if (current_barrage_status == 1) { // 被简化 return true; } else { // 没被简化 return false; } } function initPkg_Refresh_Barrage_Set() { let ret = localStorage.getItem("ExSave_Refresh"); if (ret != null) { let retJson = JSON.parse(ret); if ("barrage" in retJson == false) { retJson.barrage = {status: false}; } if (retJson.barrage.status == true) { current_barrage_status = 1; setRefreshBarrage(); } } } function setRefreshBarrage() { let cssText = ` .UserCsgoGameDataMedal,.Barrage-honor,.Barrage-listItem .Barrage-icon,.Barrage-listItem .FansMedal.is-made,.Barrage-listItem .RoomLevel,.Barrage-listItem .Motor,.Barrage-listItem .ChatAchievement,.Barrage-listItem .Barrage-hiIcon,.Barrage-listItem .Medal,.Barrage-listItem .MatchSystemTeamMedal{display:none !important;} /*.Barrage-listItem .UserLevel{display:none !important;}*/ `; StyleHook_set("Ex_Style_RefreshBarrage", cssText); } function cancelRefreshBarrage() { StyleHook_remove("Ex_Style_RefreshBarrage"); } function initPkg_Refresh_BarrageFrame() { initPkg_Refresh_BarrageFrame_Dom(); initPkg_Refresh_BarrageFrame_Func(); initPkg_Refresh_BarrageFrame_Set(); } function initPkg_Refresh_BarrageFrame_Dom() { Refresh_BarrageFrame_insertIcon(); } function Refresh_BarrageFrame_insertIcon() { let a = document.createElement("a"); a.className = "Barrage-toolbarLock"; a.id = "refresh-barrage-frame"; a.innerHTML = '拉高'; let b = document.getElementsByClassName("Barrage-toolbar")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Refresh_BarrageFrame_Func() { document.getElementById("refresh-barrage-frame").addEventListener("click", function() { let dom_rank = document.getElementsByClassName("layout-Player-rank")[0]; let dom_barrage = document.getElementById("js-player-barrage"); let dom_activity = document.getElementById("js-room-activity"); if (dom_rank.style.display == "none") { // 被拉高 dom_rank.style.display = "block"; dom_barrage.style = ""; dom_activity.style.display = "block"; document.getElementById("refresh-barrage-frame__text").innerText = "拉高"; } else { // 没拉高 let topHeight = document.getElementsByClassName("layout-Player-announce")[0].offsetHeight; dom_rank.style.display = "none"; dom_activity.style.display = "none"; dom_barrage.style = "top:" + topHeight + "px"; document.getElementById("refresh-barrage-frame__text").innerText = "恢复"; } saveData_Refresh(); }); } function refresh_BarrageFrame_getStatus() { let dom_rank = document.getElementsByClassName("layout-Player-rank")[0]; if (dom_rank.style.display == "none") { // 被拉高 return true; } else { // 没拉高 return false; } } function initPkg_Refresh_BarrageFrame_Set() { let ret = localStorage.getItem("ExSave_Refresh"); if (ret != null) { let retJson = JSON.parse(ret); if ("barrageFrame" in retJson == false) { retJson.barrageFrame = {status: false}; } if (retJson.barrageFrame.status == true) { let dom_rank = document.getElementsByClassName("layout-Player-rank")[0]; let dom_barrage = document.getElementById("js-player-barrage"); let dom_activity = document.getElementById("js-room-activity"); let topHeight = document.getElementsByClassName("layout-Player-announce")[0].offsetHeight; dom_rank.style.display = "none"; dom_activity.style.display = "none"; dom_barrage.style = "top:" + topHeight + "px"; document.getElementById("refresh-barrage-frame__text").innerText = "恢复"; } } } let video_num = 0; function initPkg_Refresh_Video() { let timer = setInterval(() => { if (document.getElementsByClassName("right-e7ea5d").length > 0) { clearInterval(timer); initPkg_Refresh_Video_Dom(); initPkg_Refresh_Video_Func(); initPkg_Refresh_Video_Set(); } video_num++; if (video_num >= 100) { clearInterval(timer); } }, 1500); } function initPkg_Refresh_Video_Dom() { Refresh_Video_insertIcon(); } function Refresh_Video_insertIcon() { let a = document.createElement("li"); a.id = "refresh-video"; a.innerText = "简洁模式"; let b = document.getElementsByClassName("menu-da2a9e")[0]; b.insertBefore(a, b.childNodes[b.childNodes.length -1]); a = document.createElement("div"); a.id = "refresh-video2"; a.title = "视频区简洁模式"; a.innerHTML = ''; b = document.getElementsByClassName("PlayerToolbar")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_Refresh_Video_Func() { document.getElementById("refresh-video").addEventListener("click", (e) => { let dom_toolbar = document.getElementsByClassName("PlayerToolbar-ContentRow")[0]; let dom_video = document.getElementsByClassName("layout-Player-video")[0]; let dom_refresh = document.getElementById("refresh-video"); let dom_refresh2 = document.getElementById("refresh-video2"); if (dom_toolbar.style.visibility == "hidden") { dom_toolbar.style.visibility = "visible"; dom_video.style = ""; dom_refresh2.style.display = "none"; dom_refresh.innerText = "简洁模式"; refresh_Video_removeStyle(); } else { dom_toolbar.style.visibility = "hidden"; dom_video.style = "bottom:0;z-index:25"; dom_refresh2.style.display = "block"; dom_refresh.innerText = "√ 简洁模式"; refresh_Video_setStyle(); } saveData_Refresh(); }); document.getElementById("refresh-video2").addEventListener("click", () => { let dom_toolbar = document.getElementsByClassName("PlayerToolbar-ContentRow")[0]; let dom_video = document.getElementsByClassName("layout-Player-video")[0]; let dom_refresh = document.getElementById("refresh-video"); let dom_refresh2 = document.getElementById("refresh-video2"); if (dom_toolbar.style.visibility == "hidden") { dom_toolbar.style.visibility = "visible"; dom_video.style = ""; dom_refresh2.style.display = "none"; dom_refresh.innerText = "简洁模式"; refresh_Video_removeStyle(); } else { dom_toolbar.style.visibility = "hidden"; dom_video.style = "bottom:0;z-index:25"; dom_refresh2.style.display = "block"; dom_refresh.innerText = "√ 简洁模式"; refresh_Video_setStyle(); } saveData_Refresh(); }); } function refresh_Video_getStatus() { let dom_toolbar = document.getElementsByClassName("PlayerToolbar-ContentRow")[0]; if (dom_toolbar.style.visibility == "hidden") { return true; } else { return false; } } // FullPageFollowGuide function initPkg_Refresh_Video_Set() { let ret = localStorage.getItem("ExSave_Refresh"); if (ret != null) { let retJson = JSON.parse(ret); if ("video" in retJson == false) { retJson.video = {status: false}; } if (retJson.video.status == true) { let dom_toolbar = document.getElementsByClassName("PlayerToolbar-ContentRow")[0]; let dom_video = document.getElementsByClassName("layout-Player-video")[0]; let dom_refresh2 = document.getElementById("refresh-video2"); let dom_refresh = document.getElementById("refresh-video"); dom_toolbar.style.visibility = "hidden"; dom_video.style = "bottom:0;z-index:25"; dom_refresh2.style.display = "block"; dom_refresh.innerText = "√ 简洁模式"; refresh_Video_setStyle(); } } } function refresh_Video_setStyle() { StyleHook_set("Ex_Style_VideoRefresh", ` .PELact,.pushTower-wrapper-gf1HG,.PkView-9f6a2c,.MorePk,.RandomPKBar,.LiveRoomLoopVideo,.LiveRoomDianzan,.maiMaitView-68e80c,.PkView{display:none !important;} `) } function refresh_Video_removeStyle() { StyleHook_remove("Ex_Style_VideoRefresh"); } function initPkg_RemoveAD() { let t = setInterval(() => { let a = document.getElementsByClassName("PlayerToolbar-wealthNum")[0]; if (a != undefined) { optimizePageStyle(); removeChatLimit(); initPkg_RemoveMsgNotice(); clearInterval(t); } }, 1000); } // .dy-ModalRadius-mask,dy-ModalRadius-wrap{display:none !important;} function removeAD() { StyleHook_set("Ex_Style_RemoveAD", ` .ScreenBannerAd,.XinghaiAd,.CustomGroupGuide,.FudaiGiftToolBarTips,.UserInfo-tryEnterHiddenLead,.BargainingKit,.AnchorPocketTips,.FishShopTip,.FollowGuide,#js-bottom-right-cloudGame,.CloudGameLink,.RoomText-icon-horn,.RoomText-list,.Search-ad,.RedEnvelopAd,.noHandlerAd-0566b9,.PcDiversion,.DropMenuList-ad,.DropPane-ad,.WXTipsBox,.igl_bg-b0724a,.closure-ab91fb,.VideoAboveVivoAd,.pwd-990896,.css-widgetWrapper-EdVVC,.watermark-442a18,.FollowGuide-FadeOut,.MatchSystemChatRoomEntry-roomTabs,.FansMedalDialog-normal,.GameLauncher,.recommendAD-54569e,.recommendApp-0e23eb,.Title-ad,.Bottom-ad,.SignBarrage,.corner-ad-495ade,.SignBaseComponent-sign-ad,.SuperFansBubble,.is-noLogin,.PlayerToolbar-signCont,#js-widget,.Frawdroom,.HeaderGif-right,.HeaderGif-left,.liveos-workspace{display:none !important;} .Barrage-topFloater{z-index:999} .danmuAuthor-3d7b4a, .danmuContent-25f266{overflow: initial} .BattleShipTips{display:none !important;} .LastLiveTime,.recommendView-3e8b62{display:none !important;} .TurntableLottery-actTips{display:none !important;} .feedback-e27241{display:none !important;} .FansMedalEnter-maxFlag{display:none !important;} .Header-follow-listBox{max-height:640px !important;} .GuessGameMiniPanelB-wrapper{display:none !important;} .ZoomTip{display:none !important;} /*福利券*/ .PlayerToolbar-couponInfo{display:none !important;} /*太空探险tips*/ .AroundStarsActTips-actTips,.AroundStarsMoonBoxTips,.AroundStarsPlanetTips{display:none !important;} /*优化页面*/ #js-barrage-list-parent{scrollbar-width: none;-ms-overflow-style: none;width:98%;height:100%} #js-barrage-list-parent::-webkit-scrollbar{display: none;} /*陪玩*/ .InteractPlayWithEnter-enterTips1{display:none !important;} /*恢复emoji彩色 chrome加粗情况下emoji会变灰,需要找一个fontweight起始值在500的字体库才可以兼容*/ /*右侧分享*/ .SharePanel,.CommonShareToolkit{ display: none!important; } /*去除还在电脑面前的mask*/ .mask1-63237a,.mask2-a8df6e,.panel1-1484c9,.panel2-5ece0e{ display: none!important; } `); // body{transform: translateZ(0)!important;} // .RomanticDatePanelModal-middle--small{height:220px !important;} // .MainDialog-main--content{height:450px !important;} // .RomanticDatePanelModal-middle--rowItemBottom--rowItemBottomBtn{margin-left:0px !important;margin-top:0px !important;width:170px !important;height:40px !important;background:orange !important;} // } } function removeChatLimit() { let a; a = document.getElementsByClassName("ChatSend-button")[0]; if (a != undefined) { a.className = "ChatSend-button"; } a = document.getElementsByClassName("ChatSend-txt")[0]; if (a != undefined) { a.maxLength = a.maxLength + 20; // 原来为50字符,修改成70字符 } } function optimizePageStyle() { // 弹幕框滚动条隐藏 let dom_barrage = document.getElementById("js-barrage-list").parentNode; dom_barrage.id = "js-barrage-list-parent"; } let isRemoveMsgNotice = 0; function initPkg_RemoveMsgNotice() { initPkg_RemoveMsgNotice_Dom(); initPkg_RemoveMsgNotice_Func(); initPkg_RemoveMsgNotice_Set(); } function initPkg_RemoveMsgNotice_Dom() { let a = document.createElement("div"); a.style = "position: absolute;right: 5px;top: 40px;cursor: pointer;" a.id = "ex-removeMsgNotice"; a.innerHTML = ``; a.title = "关闭角标提醒"; let b = document.getElementsByClassName("PrivateLetter-frame")[0]; if (b) { b.appendChild(a); } } function initPkg_RemoveMsgNotice_Func() { let dom = document.getElementById("msg-removeNotice"); if (!dom) return; let checkbox = dom.querySelector("input"); dom.addEventListener("click", () => { let ischecked = checkbox.checked; if (ischecked == true) { isRemoveMsgNotice = 1; removeMsgNotice(); } else{ isRemoveMsgNotice = 0; removeMsgNoticeCanel(); } saveData_removeMsgNotice(); }) } function initPkg_RemoveMsgNotice_Set() { let ret = localStorage.getItem("ExSave_isRemoveMsgNotice"); if (ret && ret == "1") { isRemoveMsgNotice = 1; removeMsgNotice(); let dom = document.getElementById("msg-removeNotice"); if (dom) { dom.querySelector("input").checked = true; } } } function removeMsgNotice() { StyleHook_set("Ex_Style_RemoveMsgNotice", `.UserInfo .Badge,.ChatLetter-PopUnread{display:none!important;}`); } function removeMsgNoticeCanel() { StyleHook_remove("Ex_Style_RemoveMsgNotice"); } function saveData_removeMsgNotice() { localStorage.setItem("ExSave_isRemoveMsgNotice", isRemoveMsgNotice); } function initPkg_ShowDanmaku() { let accessor = Object.getOwnPropertyDescriptor(unsafeWindow.XMLHttpRequest.prototype, 'responseText'); Object.defineProperty(unsafeWindow.XMLHttpRequest.prototype, 'responseText', { get: function() { let text = accessor.get.call(this); if (this.responseURL.indexOf("/betard") !== -1) { return text.replace('player_barrage\":0', 'player_barrage\":1'); } return text; }, configurable: true }); } function initPkg_Sign() { initPkg_Sign_Dom(); initPkg_Sign_Func(); } function initPkg_Sign_Func() { let dom = new CClick(document.getElementsByClassName("ex-sign")[0]); dom.click(() => { initPkg_Sign_Main(false); // 只签到开播的 }); dom.longClick(() => { initPkg_Sign_Main(true); // 全部签到 }); } 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_Main(isAll) { // 这里挂载每个子模块的函数入口 // 入口即为调用 initPkg_Sign_Yuba(); // 鱼吧签到 initPkg_Sign_Client(); // initPkg_Sign_Motorcade(); initPkg_Sign_Room(isAll); // initPkg_Sign_Ad_666(); // 此处移动到鱼塘鱼丸领取中去以免观看冲突 // initPkg_Sign_Ad_Sign(); // 2022年9月1日23:41:59 失效 // initPkg_Sign_Aoligei(); // initPkg_Sign_Ad_Yuba(); // initPkg_Sign_Bycc(); // saobai后每秒签到一个 // initPkg_Sign_Saobai(); // initPkg_Sign_Changzheng(); // initPkg_Sign_Chengxiao(); // initPkg_Sign_WuXuanyi(); // initPkg_Sign_1000(); // initPkg_Sign_Zhuli(); // initPkg_Sign_TV(); // 2022年9月1日23:41:59 失效 // initPkg_Sign_Yuba_Like(); // 2022年9月1日23:41:59 失效 // initPkg_Sign_Renlei(); initPkg_Sign_Act(); // initPkg_Sign_Bowuyuan(); // initPkg_Sign_ZBXSL2(); // initPkg_Sign_COD(); // initPkg_Sign_Wangzhe(); initPkg_Sign_ReadPosts(); initPkg_Sign_Follow(); initPkg_Sign_FansTree(); initPkg_Sign_SuperFans(); } // function takeActPrize(name) { // // 关注20200911LMJX_T2 // // 分享20200911LMJX_T5 // return new Promise(resolve => { // fetch('https://www.douyu.com/japi/carnival/nc/actTask/takePrize',{ // method: 'POST', // mode: 'no-cors', // credentials: 'include', // headers: {'Content-Type': 'application/x-www-form-urlencoded'}, // body: `token=${ dyToken }&aid=android&taskAlias=${ name }` // }).then(res => { // return res.json(); // }).then(ret => { // resolve(ret); // }).catch(err => { // console.log("请求失败!", err); // }) // }) // } // function addFollowRoom(rid) { // return new Promise(resolve => { // fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/add',{ // 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 => { // resolve(ret); // }).catch(err => { // console.log("请求失败!", err); // }) // }) // } // function removeFollowRoom(rid) { // return new Promise(resolve => { // fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/rm',{ // 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 => { // resolve(ret); // }).catch(err => { // console.log("请求失败!", err); // }) // }) // } // function shareAct(name) { // // 20200911LMJX // return new Promise(resolve => { // fetch('https://www.douyu.com/japi/carnival/common/share',{ // method: 'POST', // mode: 'no-cors', // credentials: 'include', // headers: {'Content-Type': 'application/x-www-form-urlencoded'}, // body: `actAlias=${ name }&token=${ dyToken }` // }).then(res => { // return res.json(); // }).then(ret => { // resolve(ret); // }).catch(err => { // console.log("请求失败!", err); // }) // }) // } // function getJackpot(id) { // return new Promise(resolve => { // fetch("https://www.douyu.com/japi/carnival/nc/lottery/jackpot", { // method: 'POST', // headers: {'Content-Type': 'application/json;charset=UTF-8'}, // body: `{"activityId":"${ id }","token":"${ dyToken }"}` // }).then(res => { // return res.json(); // }).then(ret => { // resolve(ret); // }) // }) // } // function getActRemaining(id) { // return new Promise(resolve => { // fetch("https://www.douyu.com/japi/carnival/nc/lottery/remaining?activityId=" + id, { // method: 'GET', // mode: 'no-cors', // credentials: 'include', // headers: {'Content-Type': 'application/json;charset=UTF-8'}, // }).then(res => { // return res.json(); // }).then(ret => { // resolve(ret); // }) // }) // } // 本地化的活动地址 // { // "version": "2021.01.29.01", // "data": [{ // "name": "斗鱼党宣", // "script": [{ // "name": "signAct", // "value": "XSDXZC" // }, { // "name": "getActRemaining", // "value": "610" // }] // }, // { // "name": "春节签到", // "script": [{ // "name": "doSign", // "value": "20210210lhqd" // }] // }, // ] // } let actList = {}; function initPkg_Sign_Act() { getAct(); } async function getAct() { // actList = JSON.parse(decodeURIComponent(escape(window.atob(actList))) || "{}"); if ("data" in actList == false) { return; } for (let i = 0; i < actList.data.length; i++) { let eachAct = actList.data[i]; let name = eachAct.name; for (let j = 0; j < eachAct.script.length; j++) { let script = eachAct.script[j]; let value = script.value; let ret; let ret2; switch (script.name) { case "signAct": ret = await signAct(value); if (ret.error == "0") { showMessage(`【${name}】签到完毕`, "success"); } else { showMessage(`【${name}】${ret.msg}`, "error"); } break; case "userStatus": ret = await userStatus(value); if (ret.error == 0) { for (let key in ret.data) { let item = ret.data[key]; let cnt = item.curCompleteNum - item.curDeliverNum; let name2 = name + "-" + item.taskName; for (let i = 0; i < cnt; i++) { let ret2 = await takeActPrize(key); if (ret2.error == "0") { showMessage(`【${name2}】获得` + ret2.data.sendRes.items[0].prizeName + "*" + ret2.data.sendRes.items[0].prizeNum, "success"); } else { showMessage(`【${name2}】${ret2.msg}`, "error"); } } } } break; case "addFollowRoom": await addFollowRoom(value); break; case "removeFollowRoom": await removeFollowRoom(value); break; case "shareAct": await shareAct(value); break; case "doSign": await doSign(value); break; case "getActRemaining": ret = await getActRemaining(value); if (ret.error == "0") { for (let i = 0; i < ret.data.freeCount; i++) { ret2 = await getJackpot(value); if (ret2.error == "0") { showMessage(`【${name}】礼盒开启:${ret2.data.giftName}`, "success"); } } } default: break; } } } } 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("【客户端】签到成功! 可惜没获得东西"); } } } }); } async function initPkg_Sign_FansTree() { for (let i = 0; i < myFansBadgeList.length; i++) { const roomId = myFansBadgeList[i]; let ret = await signRoomTree(roomId); if (ret.error !== 0) { showMessage(`【粉丝家园】${roomId}${ret.msg}`, "error"); } else { showMessage(`【粉丝家园】${roomId}签到成功!`, "success"); } } } function signRoomTree(rid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/japi/interactnc/web/fanshome/sign", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `ctn=${getCCN()}&rid=${rid}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } async function initPkg_Sign_Follow() { // 此处为了完成斗鱼等级任务 const room_id = "3186571"; await followRoom(room_id); await unfollowRoom(room_id); } function unfollowRoom(rid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/wgapi/livenc/liveweb/follow/rm", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `ctn=${getCCN()}&rid=${rid}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } function followRoom(rid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/wgapi/livenc/liveweb/follow/add", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `ctn=${getCCN()}&rid=${rid}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } function initPkg_Sign_Motorcade() { signMotorcade(); } function signMotorcade() { openPage("https://msg.douyu.com/motorcade/#/motorcade/list/recommend?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; } async function signMotorcade_Sign() { let retConnect = await motorcadeConnect(); let retConnect2 = await motorcadeConnect2(retConnect.data.uid, retConnect.data.sig); let mid = await getMotorcadeID(retConnect2.TinyId, retConnect2.A2Key, retConnect.data.uid); if (!mid || mid == "") { closePage(); return; } console.log("mid是:", mid); mid = encodeURIComponent(mid); GM_xmlhttpRequest({ method: "GET", url: 'https://msg.douyu.com/v3/motorcade/signs/weekly?mid=' + mid + '×tamp=' + Math.random().toFixed(17), responseType: "json", headers: { 'dy-device-id':'-', "dy-client": "web", "dy-csrf-token":getCookie("post-csrfToken"), 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; console.log("weekly:", ret); if (ret.data.is_sign == "1") { closePage(); } else { GM_xmlhttpRequest({ method: "POST", url: 'https://msg.douyu.com/v3/msign/add?timestamp=' + Math.random().toFixed(17), data: "to_mid="+ mid +"&expression=" + String(Number(ret.data.total) + 1), responseType: "json", headers: { 'dy-device-id':'-', "dy-client": "web", "dy-csrf-token":getCookie("post-csrfToken"), 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { if (Math.floor(response.response.status_code / 100) == 2){ console.log("【车队】签到成功") } else { console.log(response.response.message); } closePage(); } }); } } }); } function motorcadeConnect() { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: 'https://msg.douyu.com/v3/login/getusersig?t=' + String(new Date().getTime()) + '×tamp=' + Math.random().toFixed(17), data: '{"State":"Online"}', responseType: "json", headers: { 'dy-device-id':'-', "dy-client": "web", "dy-csrf-token":getCookie("post-csrfToken"), 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { resolve(response.response); } }); }) } function motorcadeConnect2(identifier, sig) { let url = "https://webim.tim.qq.com/v4/openim/login?identifier=" + identifier + "&usersig=" + sig +"&contenttype=json&sdkappid=1400029396"; return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: url, data: '{"State":"Online"}', responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", }, onload: function(response) { resolve(response.response); } }); }) } function getMotorcadeID(tinyid, a2, identifier) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://webim.tim.qq.com/v4/group_open_http_svc/get_joined_group_list?tinyid=" + tinyid + "&a2=" + a2 + "&contenttype=json&sdkappid=1400029396", data: '{"Member_Account":"' + identifier + '"}', responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded" }, onload: function(response) { if (response.response.GroupIdList && response.response.GroupIdList.length > 0) { resolve(response.response.GroupIdList[0].GroupId); } else { resolve(""); } } }); }) } async function initPkg_Sign_ReadPosts() { const counts = 5; for (let i = 0; i < counts; i++) { await readPosts(); await sleep(2000); } } function readPosts() { GM_xmlhttpRequest({ method: "GET", url: "https://yuba.douyu.com/wbapi/web/post/detail/555691541586843641?cid=×tamp=" + new Date().getTime(), responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded', "dy-token": dyToken, "dy-client": "pc" }, onload: function(response) { } }); } function initPkg_Sign_Room(isAll) { signAllRoom(isAll); } function signAllRoom(isAll) { // 1. get page counts(1015) // 2. for in all pages // 3. sign each room let pageCount = 0; let signedCount = 0; let count = 0; fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/list?page=1015',{ 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(ret1 => { let roomCount = Number(ret1.data.list.length); for (let i = 0; i < roomCount; i++) { if (isAll == false) { if (ret1.data.list[i].show_status == "1") { signRoom(ret1.data.list[i].room_id); signedCount++; } } else { signRoom(ret1.data.list[i].room_id); signedCount++; } count++; if (count == ret1.data.total && i == roomCount - 1) { let rest = Number(ret1.data.total) - signedCount; showMessage("【房间签到】" + String(signedCount) + "个房间签到已完成," + String(rest) + "个房间未签到", "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?client_sys=android", data: 'rid=' + r, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'token': dyToken, 'aid': 'android1' }, onload: function(response) { } }); } async function initPkg_Sign_SuperFans() { for (let i = 0; i < myFansBadgeList.length; i++) { const roomId = myFansBadgeList[i]; let ret = await signSuperFans(roomId); if (ret.error !== 0) { // showMessage(`【钻粉联赛签到】${roomId}${ret.msg}`, "error"); } else { showMessage(`【钻粉联赛签到】${roomId}签到成功!`, "success"); } } } function signSuperFans(rid) { return new Promise((resolve, reject) => { fetch("https://www.douyu.com/japi/interactnc/web/dfansact/userSign", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `ctn=${getCCN()}&rid=${rid}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); reject(err); }) }) } function initPkg_Sign_TV() { signTV(); } function signTV() { let did = window.btoa(getDyDid()); GM_xmlhttpRequest({ method: "GET", url: "https://apitv.douyucdn.cn/user/sign/index?token=" + dyToken + "&client_sys=android", responseType: "json", headers: { 'User-Device': did }, onload: function(response) { let ret = response.response; if (ret.error == "0") { showMessage("【电视端】签到成功!获得100鱼丸", "success"); } else { showMessage("【电视端】" + ret.data.msg, "warning"); } } }); } let signedYuba = 0; let totalYuba = 0; let doneYuba = 0; let signCountMap = {}; function initPkg_Sign_Yuba() { signYubaList(); } function signYubaFast() { GM_xmlhttpRequest({ method: "POST", url: "https://mapi-yuba.douyu.com/wb/v3/fastSign", responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded", "client": "android", "token": dyToken, }, onload: function (response) { console.log("快速签到",response.response) if (response.response.message == "" && response.response.data != 0) { // showMessage("【鱼吧】一键签到成功! 获得经验" + response.response.data, "success"); // console.log("【极速鱼吧】" + group_id + "签到成功! 连续" + response.response.data.count + "天 获得经验" + response.response.data.exp); } else if (response.response.data == 0) { // showMessage("【鱼吧】没有7级以上的鱼吧或极速签到已完成", "warning"); // console.log("【极速鱼吧】" + group_id + response.response.message); } else { // showMessage("【鱼吧】" + response.response.message, "warning"); // console.log("【极速鱼吧】" + response.response.message); } } }); } async 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: async function (response) { if (signCountMap[group_id] >= 10) { return; } if (response.response.message == "签到失败") { await sleep(2000); signYuba(group_id, t); return; } if (signCountMap[group_id]) { signCountMap[group_id]++; } else { signCountMap[group_id] = 1; } doneYuba++; if (response.response.message == "") { signedYuba++; // 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); } signYubaSupplementary(group_id); if (doneYuba == totalYuba) { // 完成全部签到 if (signedYuba > 0) { if (totalYuba - signedYuba == 0) { showMessage("【鱼吧】" + String(signedYuba) + "个鱼吧签到完成", "success") } else { showMessage("【鱼吧】" + String(signedYuba) + "个鱼吧签到完成," + String(totalYuba - signedYuba) + "个鱼吧已签到", "success"); } } else { showMessage("【鱼吧】"+ String(totalYuba) + "个鱼吧已签到", "warning"); } signedYuba = null; totalYuba = null; doneYuba = null; } } }); } async function signYubaSupplementary(group_id) { let result = await signSupplementary(group_id); for (let i = 0; i < result.data.supplementary_cards; i++) { await signSupplementary(group_id); } } async function signYubaList() { let yubaList = []; let ret = await getYubaPage(1); yubaList = yubaList.concat(ret.list); let pageNum = Number(ret.count_page) - 1; if (pageNum >= 1) { for (let i = 0; i < pageNum; i++) { let curPage = 2 + i; ret = await getYubaPage(curPage); yubaList = yubaList.concat(ret.list); } } totalYuba = yubaList.length; signYubaFast(); for (let i = 0; i < yubaList.length; i++) { signYuba(yubaList[i].group_id, dyToken); } } function getYubaPage(page) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "https://yuba.douyu.com/wbapi/web/group/myFollow?page=" + String(page) + "&limit=30", responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded", "dy-client": "pc", "dy-token": dyToken }, onload: function(response) { resolve(response.response.data) } }); }) } function getSupplementaryNums(group_id) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "GET", url: "https://yuba.douyu.com/wbapi/web/signDetail?group_id=" + group_id, responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded", "dy-client": "pc", "dy-token": dyToken }, onload: function(response) { resolve(response.response); } }); }) } function signSupplementary(group_id) { return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://mapi-yuba.douyu.com/wb/v3/supplement", responseType: "json", headers: { "Content-Type": "application/x-www-form-urlencoded", "client": "android", "token": dyToken, }, data: "group_id=" + group_id, onload: function(response) { resolve(response.response); } }); }) } function initPkg_Sign_Yuba_Like() { likeYuba(); } function likeYuba() { let pid = "555691541586843641"; // likeYubaPostComment(pid, "1483548421625277411", "-1").then(() => {likeYubaPostComment(pid, "1483548421625277411", "1")}); // likeYubaPostComment(pid, "1483548421625277411", "-1").then(() => {likeYubaPostComment(pid, "1483548421625277411", "1")}); // likeYubaPostComment(pid, "1482171839375552044", "-1").then(() => {likeYubaPostComment(pid, "1482171839375552044", "1")}); // likeYubaPostComment(pid, "1481389816302095706", "-1").then(() => {likeYubaPostComment(pid, "1481389816302095706", "1")}); // likeYubaPostComment(pid, "1470603012833589758", "-1").then(() => {likeYubaPostComment(pid, "1470603012833589758", "1")}); likeYubaPost(pid, "-1").then(() => {likeYubaPost(pid, "1")}); showMessage("【鱼吧点赞】已完成", "success"); } function likeYubaPostComment(post_id, commnet_id, type) { let data = `pid=${ post_id }&comment_id=${ commnet_id }&type=${ type }`; return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://yuba.douyu.com/ybapi/follow/like", data: data, responseType: "json", headers: { "dy-token": dyToken, "dy-client": "pc", "Content-Type": "application/x-www-form-urlencoded", "Referer": "https://yuba.douyu.com/p/555691541586843641" }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } function likeYubaPost(post_id, type) { let data = `pid=${ post_id }&type=${ type }`; return new Promise(resolve => { GM_xmlhttpRequest({ method: "POST", url: "https://yuba.douyu.com/ybapi/follow/like", data: data, responseType: "json", headers: { "dy-token": dyToken, "dy-client": "pc", "Content-Type": "application/x-www-form-urlencoded", "Referer": "https://yuba.douyu.com/p/" + post_id }, onload: function(response) { let ret = response.response; resolve(ret); } }); }) } var _hmt = _hmt || []; function initPkg_Statistics() { let hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?4dc4fb0549a56fe03ba53c022b1ff455"; let s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); } function initPkg_TabSwitch() { // // Try to trick the site into thinking it's never hidden // Object.defineProperty(document, 'hidden', {value: false, writable: false}); // Object.defineProperty(document, 'visibilityState', {value: 'visible', writable: false}); // Object.defineProperty(document, 'webkitVisibilityState', {value: 'visible', writable: false}); // document.dispatchEvent(new Event('visibilitychange')); // document.hasFocus = function () { return true; }; // // visibilitychange events are captured and stopped // document.addEventListener('visibilitychange', function(e) { // e.stopImmediatePropagation(); // }, true, true); } // 版本号 // 格式 yyyy.MM.dd.** // var curVersion = "2020.01.12.01"; var curVersion = "2023.08.31.02" var isNeedUpdate = false var lastestVersion = "" function initPkg_Update() { initPkg_Update_Dom(); initPkg_Update_Func(); // Update_checkVersion(); // 首次检查更新 if (isNeedUpdate) { Update_showTip(true); } } 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 checkUpdate_Src() { return new Promise((resolve, reject) => { fetch('http://src.douyuex.com/src/douyuex_version.txt',{ method: 'GET', mode: 'cors', cache: 'no-store', credentials: 'omit', }).then(res => { return res.text(); }).then(txt => { if(txt != undefined){ if (txt != curVersion) { resolve([true, txt]); } } resolve(false); }).catch(err => { console.error('请求失败', err); reject(); }) }) } function checkUpdate_GreasyFork() { return new Promise((resolve, reject) => { 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) { resolve([true, v.innerText]); } } resolve(false); }).catch(err => { console.error('请求失败', err); reject(); }) }) } async function Update_checkVersion(isShowNotUpdate = false) { // 用解构赋值会导致函数undefined,暂不知原因 let tmp = []; tmp = await checkUpdate_GreasyFork().catch(err => { tmp = [false, curVersion]; isNeedUpdate = tmp[0]; lastestVersion = tmp[1]; if (isNeedUpdate) { Update_showMessage(); if (isNeedUpdate) { Update_showTip(true); } } else { if (isShowNotUpdate) { showMessage(`【版本更新】当前版本${curVersion}已为最新,点击查看更新内容`, "success") } } }) isNeedUpdate = tmp[0]; lastestVersion = tmp[1]; if (isNeedUpdate) { Update_showMessage(); if (isNeedUpdate) { Update_showTip(true); } } else { if (isShowNotUpdate) { showMessage(`【版本更新】当前版本${curVersion}已为最新,点击查看更新内容`, "success") } } } function Update_openUpdatePage() { openPage("https://xiaochunchun.gitee.io/douyuex/install/web.html", true); } function Update_showTip(a) { let d = document.getElementById("ex-update__tip"); if (d) { if (a) { if (d.style.display != "block") { d.style.display = "block"; } } else { d.style.display = "none"; } } } function Update_showMessage() { let msg = `【版本更新】最新版本:${lastestVersion},点击官方源或者GreasyFork源更新,点击查看更新内容` showMessage(msg, "error", { timeout: 50, }); } let videoStartTime = 0; let videoTime_domhook_videoChange = null; let videoTime_domhook_showtime = null; let videoTime_timeout = 0; function initPkg_VideoTime() { let timer = setInterval(() => { VideoTime_setData(); let videoDom = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("__video"); let showtimeDom = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot.querySelector("demand-video-controller-preview"); if (videoDom !== undefined && videoDom !== null) { clearInterval(timer); videoTime_domhook_videoChange = new MutationObserver(function(mutations) { VideoTime_setData(); }); videoTime_domhook_videoChange.observe(videoDom, { attributes: true, childList: true, subtree: false }); videoTime_domhook_showtime = new MutationObserver(function(mutations) { for (let i = 0; i < mutations.length; i++) { let item = mutations[i]; if (item.attributeName == "showtime") { // 此时修改时间 let showtime = Number(VideoTime_getShowTime()); VideoTime_setShowTime(String(dateFormat("yyyy-MM-dd hh:mm:ss", new Date(Number(videoStartTime + showtime * 1000)))) + "
    " + formatSeconds2(showtime)); break; } else if (item.attributeName == "isshow") { clearTimeout(videoTime_timeout); let showtime = Number(VideoTime_getShowTime()); // 宏任务 模拟nextTick videoTime_timeout = setTimeout(() => { VideoTime_setShowTime(String(dateFormat("yyyy-MM-dd hh:mm:ss", new Date(Number(videoStartTime + showtime * 1000)))) + "
    " + formatSeconds2(showtime)); }, 0); break; } } }); videoTime_domhook_showtime.observe(showtimeDom, { attributes: true, childList: true, subtree: false }); } }, 1000) } function VideoTime_setData() { let pathnameArr = String(window.location.pathname).split("/"); let videoId = pathnameArr[pathnameArr.length - 1]; fetch("https://v.douyu.com/video/video/getVideoUrl?vid=" + videoId, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, }).then(res => { return res.json(); }).then(ret => { let imgUrl = ret.data.viewthumb[0].url; let timeStr = getStrMiddle(imgUrl, "--", "/"); videoStartTime = new Date(timeStr.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, "$1-$2-$3 $4:$5:$6")).getTime(); }).catch(err => { console.log("请求失败!", err); }) } function VideoTime_getShowTime() { let t = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot.querySelector("demand-video-controller-preview").getAttribute("showtime"); return Number(t).toFixed(0); } function VideoTime_setShowTime(timeStr) { let dom = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("demandcontroller-bar").shadowRoot.querySelector("demand-video-controller-progress").shadowRoot.querySelector("demand-video-controller-preview").shadowRoot.querySelector(".Preview-Time"); if (dom) { dom.style.position = "relative"; dom.style.bottom = "60px" dom.style.backgroundColor = "rgba(0,0,0,0.4)"; dom.innerHTML = timeStr; } } var gifworkerStr = `(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=ByteArray.pageSize)this.newPage();this.pages[this.page][this.cursor++]=val};ByteArray.prototype.writeUTFBytes=function(string){for(var l=string.length,i=0;i=0)this.dispose=disposalCode};GIFEncoder.prototype.setRepeat=function(repeat){this.repeat=repeat};GIFEncoder.prototype.setTransparent=function(color){this.transparent=color};GIFEncoder.prototype.addFrame=function(imageData){this.image=imageData;this.colorTab=this.globalPavarte&&this.globalPavarte.slice?this.globalPavarte:null;this.getImagePixels();this.analyzePixels();if(this.globalPavarte===true)this.globalPavarte=this.colorTab;if(this.firstFrame){this.writeLSD();this.writePavarte();if(this.repeat>=0){this.writeNetscapeExt()}}this.writeGraphicCtrlExt();this.writeImageDesc();if(!this.firstFrame&&!this.globalPavarte)this.writePavarte();this.writePixels();this.firstFrame=false};GIFEncoder.prototype.finish=function(){this.out.writeByte(59)};GIFEncoder.prototype.setQuality=function(quality){if(quality<1)quality=1;this.sample=quality};GIFEncoder.prototype.setDither=function(dither){if(dither===true)dither="FloydSteinberg";this.dither=dither};GIFEncoder.prototype.setGlobalPavarte=function(pavarte){this.globalPavarte=pavarte};GIFEncoder.prototype.getGlobalPavarte=function(){return this.globalPavarte&&this.globalPavarte.slice&&this.globalPavarte.slice(0)||this.globalPavarte};GIFEncoder.prototype.writeHeader=function(){this.out.writeUTFBytes("GIF89a")};GIFEncoder.prototype.analyzePixels=function(){if(!this.colorTab){this.neuQuant=new NeuQuant(this.pixels,this.sample);this.neuQuant.buildColormap();this.colorTab=this.neuQuant.getColormap()}if(this.dither){this.ditherPixels(this.dither.replace("-serpentine",""),this.dither.match(/-serpentine/)!==null)}else{this.indexPixels()}this.pixels=null;this.colorDepth=8;this.palSize=7;if(this.transparent!==null){this.transIndex=this.findClosest(this.transparent,true)}};GIFEncoder.prototype.indexPixels=function(imgq){var nPix=this.pixels.length/3;this.indexedPixels=new Uint8Array(nPix);var k=0;for(var j=0;j=0&&x1+x=0&&y1+y>16,(c&65280)>>8,c&255,used)};GIFEncoder.prototype.findClosestRGB=function(r,g,b,used){if(this.colorTab===null)return-1;if(this.neuQuant&&!used){return this.neuQuant.lookupRGB(r,g,b)}var c=b|g<<8|r<<16;var minpos=0;var dmin=256*256*256;var len=this.colorTab.length;for(var i=0,index=0;i=0){disp=dispose&7}disp<<=2;this.out.writeByte(0|disp|0|transp);this.writeShort(this.delay);this.out.writeByte(this.transIndex);this.out.writeByte(0)};GIFEncoder.prototype.writeImageDesc=function(){this.out.writeByte(44);this.writeShort(0);this.writeShort(0);this.writeShort(this.width);this.writeShort(this.height);if(this.firstFrame||this.globalPavarte){this.out.writeByte(0)}else{this.out.writeByte(128|0|0|0|this.palSize)}};GIFEncoder.prototype.writeLSD=function(){this.writeShort(this.width);this.writeShort(this.height);this.out.writeByte(128|112|0|this.palSize);this.out.writeByte(0);this.out.writeByte(0)};GIFEncoder.prototype.writeNetscapeExt=function(){this.out.writeByte(33);this.out.writeByte(255);this.out.writeByte(11);this.out.writeUTFBytes("NETSCAPE2.0");this.out.writeByte(3);this.out.writeByte(1);this.writeShort(this.repeat);this.out.writeByte(0)};GIFEncoder.prototype.writePavarte=function(){this.out.writeBytes(this.colorTab);var n=3*256-this.colorTab.length;for(var i=0;i>8&255)};GIFEncoder.prototype.writePixels=function(){var enc=new LZWEncoder(this.width,this.height,this.indexedPixels,this.colorDepth);enc.encode(this.out)};GIFEncoder.prototype.stream=function(){return this.out};module.exports=GIFEncoder},{"./LZWEncoder.js":2,"./TypedNeuQuant.js":3}],2:[function(require,module,exports){var EOF=-1;var BITS=12;var HSIZE=5003;var masks=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Math.max(2,colorDepth);var accum=new Uint8Array(256);var htab=new Int32Array(HSIZE);var codetab=new Int32Array(HSIZE);var cur_accum,cur_bits=0;var a_count;var free_ent=0;var maxcode;var clear_flg=false;var g_init_bits,ClearCode,EOFCode;function char_out(c,outs){accum[a_count++]=c;if(a_count>=254)flush_char(outs)}function cl_block(outs){cl_hash(HSIZE);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)}function cl_hash(hsize){for(var i=0;i=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]===fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent<1<0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}}function MAXCODE(n_bits){return(1<0)cur_accum|=code<=8){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==BITS)maxcode=1<0){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}}this.encode=encode}module.exports=LZWEncoder},{}],3:[function(require,module,exports){var ncycles=100;var netsize=256;var maxnetpos=netsize-1;var netbiasshift=4;var intbiasshift=16;var intbias=1<>betashift;var betagamma=intbias<>3;var radiusbiasshift=6;var radiusbias=1<>3);var i,v;for(i=0;i>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}}function altersingle(alpha,i,b,g,r){network[i][0]-=alpha*(network[i][0]-b)/initalpha;network[i][1]-=alpha*(network[i][1]-g)/initalpha;network[i][2]-=alpha*(network[i][2]-r)/initalpha}function alterneigh(radius,i,b,g,r){var lo=Math.abs(i-radius);var hi=Math.min(i+radius,netsize);var j=i+1;var k=i-1;var m=1;var p,a;while(jlo){a=radpower[m++];if(jlo){p=network[k--];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}}}function contest(b,g,r){var bestd=~(1<<31);var bestbiasd=bestd;var bestpos=-1;var bestbiaspos=bestpos;var i,n,dist,biasdist,betafreq;for(i=0;i>intbiasshift-netbiasshift);if(biasdist>betashift;freq[i]-=betafreq;bias[i]+=betafreq<>1;for(j=previouscol+1;j>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos}function inxsearch(b,g,r){var a,p,dist;var bestd=1e3;var best=-1;var i=netindex[g];var j=i-1;while(i=0){if(i=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i=lengthcount)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j `; let b = document.getElementsByClassName("player-dialog")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_VideoTools_Camera_Func() { let dom = document.getElementsByClassName("layout-Player-video")[0]; let dom_video = document.getElementsByClassName("room-Player-Box")[0]; let camera = document.getElementById("ex-camera"); let gif = null; let timer = 0; let downTime = 0; let imgBase64; let timer_timeout = 0; dom.addEventListener("mouseenter", () => { camera.style.display = "flex"; timer_timeout = setTimeout(() => { camera.style.display = "none"; }, 2000); }) dom_video.addEventListener("mousemove", () => { camera.style.display = "flex"; clearTimeout(timer_timeout); timer_timeout = setTimeout(() => { camera.style.display = "none"; }, 2000); }) camera.addEventListener("mouseenter", () => { camera.style.display = "flex"; clearTimeout(timer_timeout); }) dom.addEventListener("mouseleave", () => { camera.style.display = "none"; }) camera.addEventListener("mousedown", (e) => { downTime = new Date().getTime(); camera_canvas_img.getContext('2d').drawImage(liveVideoNode, 0, 0, camera_canvas_img.width, camera_canvas_img.height); imgBase64 = camera_canvas_img.toDataURL("image/png"); gif = new GIF({ workers: 5, quality: 3, width: camera_width, height: camera_height, workerScript: gifworkerBlob });; cameraAddFrame(liveVideoNode, camera_canvas, gif, camera_fps); timer = setInterval(() => {cameraAddFrame(liveVideoNode, camera_canvas, gif, camera_fps)}, camera_fps); }) camera.addEventListener("mouseup", (e) => { let upTime = new Date().getTime(); clearInterval(timer); if (upTime - downTime >= 800) { showMessage("【录制】正在生成gif...", "info"); gif.on('finished', blob => { let el = document.createElement('a'); el.href = URL.createObjectURL(blob); el.download = `【${camera_anchorName}】${dateFormat("yyyy-MM-dd hh-mm-ss",new Date())}`; document.body.appendChild(el); let evt = document.createEvent("MouseEvents"); evt.initEvent("click", false, false); el.dispatchEvent(evt); document.body.removeChild(el); }); gif.render(); } else { let el = document.createElement("a"); el.download = `【${camera_anchorName}】${dateFormat("yyyy-MM-dd hh-mm-ss",new Date())}`; el.href = imgBase64; document.body.appendChild(el); let evt = document.createEvent("MouseEvents"); evt.initEvent("click", false, false); el.dispatchEvent(evt); document.body.removeChild(el); } }) } function initPkg_VideoTools_Camera_Video() { let timer = setInterval(() => { liveVideoNode = document.getElementsByTagName("demand-video")[0].shadowRoot.getElementById("__video"); if (liveVideoNode !== undefined && liveVideoNode !== null && liveVideoNode.videoWidth) { clearInterval(timer); camera_anchorName = document.getElementsByTagName("demand-video-anchor")[0].shadowRoot.querySelector(".anchor-name").innerText; camera_width = liveVideoNode.videoWidth * 0.25; camera_height = liveVideoNode.videoHeight * 0.25; camera_canvas = document.createElement("canvas"); camera_canvas.width = camera_width; camera_canvas.height = camera_height; camera_canvas_img = document.createElement("canvas"); camera_canvas_img.width = liveVideoNode.videoWidth; camera_canvas_img.height = liveVideoNode.videoHeight; initPkg_VideoTools_Camera_Video_Dom(); initPkg_VideoTools_Camera_Video_Func(); } }, 1000) } function initPkg_VideoTools_Camera_Video_Dom() { Camera_Video_insertIcon(); } function Camera_Video_insertIcon() { let a = document.createElement("div"); a.id = "ex-camera"; a.title = "单击截图 长按录制gif" a.innerHTML = ` `; let b = document.getElementsByClassName("Video")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_VideoTools_Camera_Video_Func() { let dom = document.getElementsByTagName("demand-video")[0]; let camera = document.getElementById("ex-camera"); let gif = null; let timer = 0; let downTime = 0; let imgBase64; let timer_timeout = 0; dom.addEventListener("mouseenter", () => { camera.style.display = "flex"; timer_timeout = setTimeout(() => { camera.style.display = "none"; }, 2000); }) dom.addEventListener("mousemove", () => { camera.style.display = "flex"; clearTimeout(timer_timeout); timer_timeout = setTimeout(() => { camera.style.display = "none"; }, 2000); }) camera.addEventListener("mouseenter", () => { camera.style.display = "flex"; clearTimeout(timer_timeout); }) dom.addEventListener("mouseleave", () => { camera.style.display = "none"; }) camera.addEventListener("mousedown", (e) => { downTime = new Date().getTime(); camera_canvas_img.getContext('2d').drawImage(liveVideoNode, 0, 0, camera_canvas_img.width, camera_canvas_img.height); imgBase64 = camera_canvas_img.toDataURL("image/png"); gif = new GIF({ workers: 5, quality: 3, width: camera_width, height: camera_height, workerScript: gifworkerBlob });; cameraAddFrame(liveVideoNode, camera_canvas, gif, camera_fps); timer = setInterval(() => { cameraAddFrame(liveVideoNode, camera_canvas, gif, camera_fps) }, camera_fps); }) camera.addEventListener("mouseup", (e) => { let upTime = new Date().getTime(); clearInterval(timer); if (upTime - downTime >= 800) { showMessage("【录制】正在生成gif...", "info"); gif.on('finished', blob => { let el = document.createElement('a'); el.href = URL.createObjectURL(blob); el.download = `【${camera_anchorName}】${dateFormat("yyyy-MM-dd hh-mm-ss",new Date())}`; document.body.appendChild(el); let evt = document.createEvent("MouseEvents"); evt.initEvent("click", false, false); el.dispatchEvent(evt); document.body.removeChild(el); }); gif.render(); } else { let el = document.createElement("a"); el.download = `【${camera_anchorName}】${dateFormat("yyyy-MM-dd hh-mm-ss",new Date())}`; el.href = imgBase64; document.body.appendChild(el); let evt = document.createEvent("MouseEvents"); evt.initEvent("click", false, false); el.dispatchEvent(evt); document.body.removeChild(el); } }) } function initPkg_VideoTools_Cinema() { initPkg_VideoTools_Cinema_Dom(); initPkg_VideoTools_Cinema_Func(); } function initPkg_VideoTools_Cinema_Dom() { Cinema_insertIcon(); } function Cinema_insertIcon() { // let a = document.createElement("div"); // a.id = "ex-cinema"; // a.innerHTML = ` //
    //
    //
      //
    • 默认
    • //
    • 剪裁
    • //
    • 拉伸
    • //
    //
    //
    // // `; // let b = document.getElementsByClassName("right-e7ea5d")[0]; // b.insertBefore(a, b.childNodes[0]); let a = document.createElement("li"); a.id = "ex-cinema"; a.innerHTML = ` 影院比例
    • 默认
    • 剪裁
    • 拉伸
    `; let b = document.getElementsByClassName("menu-da2a9e")[0]; b.insertBefore(a, b.childNodes[1]); } function initPkg_VideoTools_Cinema_Func() { document.getElementById("cinema__default").addEventListener("click", () => { StyleHook_remove("Ex_Style_Cinema"); }); document.getElementById("cinema__cover").addEventListener("click", () => { setVideoCinemaMode("cover"); }); document.getElementById("cinema__fill").addEventListener("click", () => { setVideoCinemaMode("fill"); }); } function setVideoCinemaMode(fit) { let newHeigth = String(parseInt(liveVideoNode.style.width) / 2.39) + "px"; StyleHook_remove("Ex_Style_Cinema"); let style = ` .layout-Player-videoEntity video{object-fit:${ fit } !important;height:${ newHeigth } !important;} `; StyleHook_set("Ex_Style_Cinema", style); } let icon_joysound_on = `joysound-on`; let icon_joysound_off = `joysound-off`; function initPkg_VideoTools_Joysound() { initPkg_VideoTools_Joysound_Dom(); initPkg_VideoTools_Joysound_Func(); } function initPkg_VideoTools_Joysound_Dom() { Joysound_insertIcon(); } function Joysound_insertIcon() { let a = document.createElement("div"); a.id = "ex-joysound"; a.title = "Joysound音效增强" if (unsafeWindow.hasInstalledJoysound && localStorage.getItem("Ex_isJoysound") == 1) { a.innerHTML = icon_joysound_on; } else { a.innerHTML = icon_joysound_off; } let b = document.getElementsByClassName("right-e7ea5d")[0]; b.insertBefore(a, b.childNodes[0]); } function initPkg_VideoTools_Joysound_Func() { let dom = document.getElementById("ex-joysound"); document.getElementById("ex-joysound").addEventListener("click", () => { if (unsafeWindow.hasInstalledJoysound) { if (localStorage.getItem("Ex_isJoysound") == 1) { unsafeWindow.disableJoysound(); dom.innerHTML = icon_joysound_off; } else { unsafeWindow.enableJoysound(); dom.innerHTML = icon_joysound_on; } } else { openPage("https://greasyfork.org/zh-CN/scripts/439845"); } }) } let currentBrightness = ""; let currentContrast = ""; let currentSaturate = ""; let liveVideoParentClassName = ""; let isMirror = false; let rotateAngle = 0; let transformCss = { rotateY: "", rotate: "", scale: "", } let panorama = null; function initPkg_VideoTools_Filter() { liveVideoParentClassName = liveVideoNode.parentNode.className; initPkg_VideoTools_Filter_Dom(); initPkg_VideoTools_Filter_Func(); } function initPkg_VideoTools_Filter_Dom() { Filter_insertIcon(); } function Filter_insertIcon() { let a = document.createElement("div"); a.id = "ex-filter"; a.innerHTML = `
    明亮度
    对比度
    饱和度

    滤镜

    • 重置
    `; let b = document.getElementsByClassName("right-e7ea5d")[0]; b.insertBefore(a, b.childNodes[0]); b = document.getElementsByClassName("menu-da2a9e")[0]; let domPanorama = document.createElement("li"); domPanorama.id = "filter__panorama"; domPanorama.innerText = "全景"; b.insertBefore(domPanorama, b.childNodes[1]); let domMirror = document.createElement("li"); domMirror.id = "filter__mirror"; domMirror.innerText = "镜像画面"; b.insertBefore(domMirror, b.childNodes[1]); let domRotate = document.createElement("li"); domRotate.id = "filter__rotate"; domRotate.innerText = "旋转画面"; b.insertBefore(domRotate, b.childNodes[1]); let domReset = document.createElement("li"); domReset.id = "filter__reset"; domReset.innerText = "重置"; b.insertBefore(domReset, b.childNodes[1]); let domDivider = document.createElement("div"); domDivider.className = "divider-f9d33d"; b.insertBefore(domDivider, b.childNodes[1]); } function initPkg_VideoTools_Filter_Func() { document.onmouseup = function () { document.onmousemove = null; //弹起鼠标不做任何操作 } setScrollFunc(document.getElementById("scroll__bright"), document.getElementById("bar__bright"), document.getElementById("mask__bright"), (data) => { currentBrightness = `brightness(${ data }%)`; liveVideoNode.style.filter = `${ currentBrightness } ${ currentContrast } ${ currentSaturate }`; }); setScrollFunc(document.getElementById("scroll__contrast"), document.getElementById("bar__contrast"), document.getElementById("mask__contrast"), (data) => { currentContrast = `contrast(${ data }%)`; liveVideoNode.style.filter = `${ currentBrightness } ${ currentContrast } ${ currentSaturate }`; }); setScrollFunc(document.getElementById("scroll__saturate"), document.getElementById("bar__saturate"), document.getElementById("mask__saturate"), (data) => { currentSaturate = `saturate(${ data }%)`; liveVideoNode.style.filter = `${ currentBrightness } ${ currentContrast } ${ currentSaturate }`; }); document.getElementById("ex-filter").addEventListener("mouseover", function () { document.getElementsByClassName("filter__wrap")[0].style.display = "block"; }); document.getElementsByClassName("filter__wrap")[0].addEventListener("mouseleave", function () { document.getElementsByClassName("filter__wrap")[0].style.display = "none" }); document.getElementById("filter__reset").addEventListener("click", () => { resetVideoFilter(); }); document.getElementById("filter__reset2").addEventListener("click", () => { resetVideoFilter(); }); document.getElementById("filter__mirror").addEventListener("click", () => { if (!isMirror) { isMirror = true; transformCss.rotateY = "rotateY(180deg)"; } else { isMirror = false; transformCss.rotateY = "rotateY(0deg)"; } liveVideoNode.parentNode.style.transition = "all .5s"; liveVideoNode.parentNode.style.transform = transformCss.rotateY + " " + transformCss.rotate + " " + transformCss.scale; }); document.getElementById("filter__rotate").addEventListener("click", () => { rotateAngle += 90; transformCss.rotate = `rotate(${String(rotateAngle)}deg)`; liveVideoNode.parentNode.style.transition = "all .5s"; if ((rotateAngle/90) % 2 !== 0) { transformCss.scale = "scale(" + String(liveVideoNode.videoHeight / liveVideoNode.videoWidth) + ")"; } else { transformCss.scale = ""; } liveVideoNode.parentNode.style.transform = transformCss.rotateY + " " + transformCss.rotate + " " + transformCss.scale; }); document.getElementById("filter__select").onchange = function() { let option = this.options[this.selectedIndex].text; switch (option) { case "default": StyleHook_remove("Ex_Style_Filter") break; case "1977": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(110%)brightness(110%)saturate(130%);filter:contrast(110%)brightness(110%)saturate(130%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:screen;background:rgba(243,106,188,0.3);z-index:10}`) break; case "Aden": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(90%)brightness(120%)saturate(85%)hue-rotate(20deg);filter:contrast(90%)brightness(120%)saturate(85%)hue-rotate(20deg)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:darken;background:-webkit-linear-gradient(to right,rgba(66,10,14,0.2)1,rgba(66,10,14,0));background:linear-gradient(to right,rgba(66,10,14,0.2)1,rgba(66,10,14,0));z-index:10}`) break; case "Amaro": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(90%)brightness(110%)saturate(150%)hue-rotate(-10deg);filter:contrast(90%)brightness(110%)saturate(150%)hue-rotate(-10deg)}`) break; case "Brannan": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(140%)sepia(50%);filter:contrast(140%)sepia(50%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:lighten;background:rgba(161,44,199,0.31);z-index:10}`) break; case "Brooklyn": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(90%)brightness(110%);filter:contrast(90%)brightness(110%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:overlay;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(168,223,193,0.4)1,rgba(183,196,200,0.2));background:radial-gradient(50%50%,circle closest-corner,rgba(168,223,193,0.4)1,rgba(183,196,200,0.2));z-index:10}`) break; case "Claredon": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(120%)saturate(125%);filter:contrast(120%)saturate(125%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:overlay;background:rgba(127,187,227,0.2);z-index:10}`) break; case "Earlybird": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(90%)sepia(20%);filter:contrast(90%)sepia(20%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:overlay;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(208,186,142,1)20,rgba(29,2,16,0.2));background:radial-gradient(50%50%,circle closest-corner,rgba(208,186,142,1)20,rgba(29,2,16,0.2));z-index:10}`) break; case "Gingham": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:brightness(105%)hue-rotate(350deg);filter:brightness(105%)hue-rotate(350deg)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:darken;background:-webkit-linear-gradient(to right,rgba(66,10,14,0.2)1,rgba(0,0,0,0));background:linear-gradient(to right,rgba(66,10,14,0.2)1,rgba(0,0,0,0));z-index:10}`) break; case "Hudson": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(90%)brightness(120%)saturate(110%);filter:contrast(90%)brightness(120%)saturate(110%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:multiply;opacity:0.5;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(255,177,166,1)50,rgba(52,33,52,1));background:radial-gradient(50%50%,circle closest-corner,rgba(255,177,166,1)50,rgba(52,33,52,1));z-index:10}`) break; case "Inkwell": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(110%)brightness(110%)sepia(30%)grayscale(100%);filter:contrast(110%)brightness(110%)sepia(30%)grayscale(100%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;background:rgba(0,0,0,0);z-index:10}`) break; case "Lofi": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(150%)saturate(110%);filter:contrast(150%)saturate(110%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:multiply;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(0,0,0,0)70,rgba(34,34,34,1));background:radial-gradient(50%50%,circle closest-corner,rgba(0,0,0,0)70,rgba(34,34,34,1));z-index:10}`); break; case "Maven": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(95%)brightness(95%)saturate(150%)sepia(25%);filter:contrast(95%)brightness(95%)saturate(150%)sepia(25%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:hue;background:rgba(3,230,26,0.2);z-index:10}`) break; case "Perpetua": setVideoFilter(`.${ liveVideoParentClassName }{position:relative}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:soft-light;opacity:0.5;background:-webkit-linear-gradient(to bottom,rgba(0,91,154,1)1,rgba(61,193,230,0));background:linear-gradient(to bottom,rgba(0,91,154,1)1,rgba(61,193,230,0));z-index:10}`) break; case "Reyes": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(85%)brightness(110%)saturate(75%)sepia(22%);filter:contrast(85%)brightness(110%)saturate(75%)sepia(22%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:soft-light;opacity:0.5;background:rgba(173,205,239,1);z-index:10}`) break; case "Stinson": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(75%)brightness(115%)saturate(85%);filter:contrast(75%)brightness(115%)saturate(85%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:soft-light;background:rgba(240,149,128,0.2);z-index:10}`) break; case "Toaster": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(150%)brightness(90%);filter:contrast(150%)brightness(90%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:screen;opacity:0.5;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(15,78,128,1)1,rgba(59,0,59,1));background:radial-gradient(50%50%,circle closest-corner,rgba(15,78,128,1)1,rgba(59,0,59,1));z-index:10}`) break; case "Walden": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:brightness(110%)saturate(160%)sepia(30%)hue-rotate(350deg);filter:brightness(110%)saturate(160%)sepia(30%)hue-rotate(350deg)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:screen;opacity:0.3;background:rgba(204,68,0,1);z-index:10}`) break; case "Valencia": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:contrast(108%)brightness(108%)sepia(8%);filter:contrast(108%)brightness(108%)sepia(8%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:exclusion;opacity:0.5;background:rgba(58,3,57,1);z-index:10}`) break; case "Xpro2": setVideoFilter(`.${ liveVideoParentClassName }{position:relative;-webkit-filter:sepia(30%);filter:sepia(30%)}.${ liveVideoParentClassName }::before{content:"";display:block;height:100%;width:100%;top:0;left:0;position:absolute;pointer-events:none;mix-blend-mode:color-burn;background:-webkit-radial-gradient(50%50%,circle closest-corner,rgba(224,231,230,1)40,rgba(43,42,161,0.6));background:radial-gradient(50%50%,circle closest-corner,rgba(224,231,230,1)40,rgba(43,42,161,0.6));z-index:10}`) break; default: StyleHook_remove("Ex_Style_Filter") break; } } document.getElementById("filter__panorama").addEventListener("click", () => { let tmp = document.getElementById("ex-panorama"); if (tmp) { tmp.remove(); panorama = null; } else { let node = document.getElementById("__h5player"); let dom = document.createElement("div"); dom.id = "ex-panorama"; dom.style = "width:100%;height:100%;z-index:1;background:black;" node.insertBefore(dom, node.childNodes[0]); panorama = new PanoramaVideo(dom, liveVideoNode); panoramaAnimation(panorama); } }) } function resetVideoFilter() { StyleHook_remove("Ex_Style_Filter"); document.getElementById("filter__select").selectedIndex = 0; liveVideoNode.style.filter = ""; rotateAngle = 0; transformCss = { rotateY: "", rotate: "", scale: "", } liveVideoNode.parentNode.style.transform = ""; document.getElementById("bar__bright").style.left = "100px"; document.getElementById("bar__contrast").style.left = "100px"; document.getElementById("bar__saturate").style.left = "100px"; document.getElementById("mask__bright").style.width = "100px"; document.getElementById("mask__contrast").style.width = "100px"; document.getElementById("mask__saturate").style.width = "100px"; // 重置全景 let domPanorama = document.getElementById("ex-panorama"); if (domPanorama) { domPanorama.remove(); panorama = null; } // 重置缩放 let domVideoWrap = document.getElementsByClassName("layout-Player-videoEntity")[0]; domVideoWrap.style.transform = ""; domVideoWrap.style.transformOrigin = ""; videoScale = 1; // 重置影院模式 StyleHook_remove("Ex_Style_Cinema"); // 重置视频倍速 liveVideoNode.playbackRate = 1; } function panoramaAnimation(panorama) { requestAnimationFrame(() => { panoramaAnimation(panorama) }) panorama.update(); } function setVideoFilter(style) { // liveVideoNode.style.filter = text; // liveVideoNode.style.webkitFilter = text; StyleHook_remove("Ex_Style_Filter"); StyleHook_set("Ex_Style_Filter", style); document.getElementsByClassName("filter__wrap")[0].style.display = "none"; } function setScrollFunc(scrollDom, barDom, maskDom, callback) { let scroll = scrollDom; let bar = barDom; let mask = maskDom; let barleft = 0; bar.onmousedown = function (e) { let event = e || window.event; let leftVal = event.clientX - this.offsetLeft; let that = this; // 拖动一定写到 down 里面才可以 document.onmousemove = function (e) { let event = e || window.event; barleft = event.clientX - leftVal; if (barleft < 0) barleft = 0; else if (barleft > scroll.offsetWidth - bar.offsetWidth) barleft = scroll.offsetWidth - bar.offsetWidth; mask.style.width = barleft + 'px'; that.style.left = barleft + "px"; callback(parseInt(barleft / (scroll.offsetWidth - bar.offsetWidth) * 255)); //防止选择内容--当拖动鼠标过快时候,弹起鼠标,bar也会移动,修复bug window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); } } } function initPkg_VideoTools_VideoRecall() { initPkg_VideoTools_VideoRecall_Func(); } function initPkg_VideoTools_VideoRecall_Func() { document.getElementsByClassName("layout-Player-video")[0].addEventListener("keydown", (e) => { if (isInput == true) { return; } if (e.keyCode == 37) { liveVideoNode.currentTime += -3; } else if (e.keyCode == 39) { liveVideoNode.currentTime += 3; } }); } function initPkg_VideoTools_VideoSpeed() { initPkg_VideoTools_VideoSpeed_Dom(); initPkg_VideoTools_VideoSpeed_Func(); } function initPkg_VideoTools_VideoSpeed_Dom() { VideoSpeed_insertIcon(); } function VideoSpeed_insertIcon() { let a = document.createElement("li"); a.id = "ex-videospeed"; a.innerHTML = ` 倍速播放
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    `; let b = document.getElementsByClassName("menu-da2a9e")[0]; b.insertBefore(a, b.childNodes[1]); } function initPkg_VideoTools_VideoSpeed_Func() { document.getElementById("videospeed__2.0").addEventListener("click", () => { liveVideoNode.playbackRate = 2; }); document.getElementById("videospeed__1.5").addEventListener("click", () => { liveVideoNode.playbackRate = 1.5; }); document.getElementById("videospeed__1.25").addEventListener("click", () => { liveVideoNode.playbackRate = 1.25; }); document.getElementById("videospeed__1.0").addEventListener("click", () => { liveVideoNode.playbackRate = 1; }); document.getElementById("videospeed__0.75").addEventListener("click", () => { liveVideoNode.playbackRate = 0.75; }); document.getElementById("videospeed__0.5").addEventListener("click", () => { liveVideoNode.playbackRate = 0.5; }); } function initPkg_VideoTools_VideoSync() { initPkg_VideoTools_VideoSync_Dom(); initPkg_VideoTools_VideoSync_Func(); } function initPkg_VideoTools_VideoSync_Dom() { VideoSync_insertIcon(); } function VideoSync_insertIcon() { let a = document.createElement("div"); a.id = "ex-videosync"; a.title = "同步时间"; a.innerHTML = ` `; let b = document.getElementsByClassName("left-d3671e")[0]; b.insertBefore(a, b.childNodes[3]); } function initPkg_VideoTools_VideoSync_Func() { document.getElementById("ex-videosync").addEventListener("click", () => { setVideoSync(); }) } function setVideoSync() { let buffered = liveVideoNode.buffered; if (buffered.length == 0) { // 暂停中 return; } liveVideoNode.currentTime = buffered.end(0); } var liveVideoNode; // 直播video标签节点 var isInput = false; let videotools_num = 0; function initPkg_VideoTools() { let timer = setInterval(() => { if (document.getElementsByClassName("right-e7ea5d").length > 0) { clearInterval(timer); liveVideoNode = document.querySelector(".layout-Player-videoEntity video"); document.getElementsByClassName("disable-23f484")[0].innerHTML = `DouyuEx_${curVersion}`; initPkg_VideoTools_Module(); initPkg_VideoTools_Func(); } videotools_num++; if (videotools_num >= 100) { clearInterval(timer); } }, 1500); } function initPkg_VideoTools_Module() { // 添加模块 initPkg_VideoTools_Joysound(); initPkg_VideoTools_VideoSpeed(); initPkg_VideoTools_Cinema(); initPkg_VideoTools_VideoSync(); initPkg_VideoTools_VideoRecall(); initPkg_VideoTools_Filter(); initPkg_VideoTools_Camera(); initPkg_VideoTools_VideoZoom(); } function initPkg_VideoTools_Func() { document.getElementById("js-player-toolbar").addEventListener("mouseover", () => { document.getElementsByClassName("filter__wrap")[0].style.display = "none"; }); document.getElementById("js-player-asideMain").addEventListener("mouseover", () => { document.getElementsByClassName("filter__wrap")[0].style.display = "none"; }); document.getElementsByClassName("inputView-2a65aa")[0].addEventListener("focus", () => { isInput = true; }); document.getElementsByClassName("inputView-2a65aa")[0].addEventListener("blur", () => { isInput = false; }); let m = new DomHook(".app-f0f9c7", false, (m) => { if (m.length > 0) { if (m[0].addedNodes.length > 0) { isInput = true; } else if (m[0].removedNodes.length > 0) { isInput = false; } } }); } let videoScale = 1; function initPkg_VideoTools_VideoZoom() { let domWrap = document.getElementsByClassName("layout-Player-video")[0]; let domVideoWrap = document.getElementsByClassName("layout-Player-videoEntity")[0]; let x = 0; let y = 0; let mousedownX = 0; let mousedownY = 0; let mouseupX = 0; let mouseupY = 0; domVideoWrap.style.transition = "all 0.1s"; domWrap.addEventListener("mousewheel", e => { if (!e.ctrlKey) { return; } e.preventDefault(); e.stopPropagation(); let delta = e.wheelDelta || -e.detail; x = e.screenX - domWrap.getBoundingClientRect().left; y = e.screenY - domWrap.getBoundingClientRect().top; if (delta >= 0) { videoScale += 0.1; } else { videoScale -= 0.1; } domVideoWrap.style.transform = `scale(${videoScale})`; domVideoWrap.style.transformOrigin = `${x}px ${y}px`; }); domWrap.addEventListener("mousedown", e => { if (!e.ctrlKey) { return; } if (e.button === 0) { mousedownX = e.clientX - domWrap.getBoundingClientRect().left; mousedownY = e.clientY - domWrap.getBoundingClientRect().top; } }); domWrap.addEventListener("mouseup", e => { if (!e.ctrlKey) { return; } if (e.button === 0) { mouseupX = e.clientX - domWrap.getBoundingClientRect().left; mouseupY = e.clientY - domWrap.getBoundingClientRect().top; let delX = mouseupX - mousedownX; let delY = mouseupY - mousedownY; x -= delX; y -= delY; if (domVideoWrap.style.transform !== "") { domVideoWrap.style.transformOrigin = `${x}px ${y}px`; } } }); } function initPkg_WeeklyPanel() { if (isShowWeeklyPanel()) { initPkg_WeeklyPanel_Dom(); initPkg_WeeklyPanel_Func(); } } function initPkg_WeeklyPanel_Dom() { let a = document.createElement("div"); a.className = "weeklypanel__panel-wrap"; a.innerHTML = `
    ×
    😳项目维护不易,如果觉得DouyuEx有帮助到你的话
    请点击下方链接,在右上角点个免费的⭐吧!
    以鼓励我长期维护下去,感谢使用😇
    `; let b = document.getElementById("root"); b.insertBefore(a, b.childNodes[0]); } function initPkg_WeeklyPanel_Func() { let weeklyPanel = document.getElementsByClassName("weeklypanel__panel-wrap")[0]; document.getElementsByClassName("weeklypanel__close")[0].addEventListener("click", () => { weeklyPanel.style.display = "none"; }); } function isShowWeeklyPanel() { const LOCAL_NAME = "Ex_WeeklyPanel_NextTime"; let tt = new Date().getTime(); let nt = tt + 604800000; let nextTime = Number(localStorage.getItem(LOCAL_NAME)); if (nextTime) { if (tt >= nextTime) { localStorage.setItem(LOCAL_NAME, nt); return true; } } else { localStorage.setItem(LOCAL_NAME, nt); return true; } return false; } function doSign(alias) { return new Promise(resolve => { fetch('https://www.douyu.com/japi/carnival/nc/hostSnowSign/doSign',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `actAlias=${alias}&token=${dyToken}&ctn=${getCCN()}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function signAct(alias) { return new Promise(resolve => { fetch("https://www.douyu.com/japi/carnival/nc/signAct/signIn", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'token=' + dyToken + "&signAlias=" + alias }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } function userStatus(tasks) { return new Promise(resolve => { fetch("https://www.douyu.com/japi/carnival/nc/actTask/userStatus", { method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `tasks=${tasks}&token=${dyToken}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function takeActPrize(name) { // 该接口会在userStatus后自动执行 // 关注20200911LMJX_T2 // 分享20200911LMJX_T5 return new Promise(resolve => { fetch('https://www.douyu.com/japi/carnival/nc/actTask/takePrize',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `token=${ dyToken }&aid=android&taskAlias=${ name }` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function addFollowRoom(rid) { return new Promise(resolve => { fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/add',{ 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 => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function removeFollowRoom(rid) { return new Promise(resolve => { fetch('https://www.douyu.com/wgapi/livenc/liveweb/follow/rm',{ 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 => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function shareAct(name) { // 20200911LMJX return new Promise(resolve => { fetch('https://www.douyu.com/japi/carnival/common/share',{ method: 'POST', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `actAlias=${ name }&token=${ dyToken }` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }).catch(err => { console.log("请求失败!", err); }) }) } function getJackpot(id) { return new Promise(resolve => { fetch("https://www.douyu.com/japi/carnival/nc/lottery/jackpot", { method: 'POST', headers: {'Content-Type': 'application/json;charset=UTF-8'}, body: `{"activityId":"${ id }","token":"${ dyToken }"}` }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } function getActRemaining(id) { return new Promise(resolve => { fetch("https://www.douyu.com/japi/carnival/nc/lottery/remaining?activityId=" + id, { method: 'GET', mode: 'no-cors', credentials: 'include', headers: {'Content-Type': 'application/json;charset=UTF-8'}, }).then(res => { return res.json(); }).then(ret => { resolve(ret); }) }) } function getActList() { // return new Promise(resolve => { // fetch('http://src.douyuex.com/src/actList.txt',{ // method: 'GET', // mode: 'cors', // cache: 'no-store', // credentials: 'omit', // }).then(res => { // return res.text(); // }).then(txt => { // resolve(txt); // }).catch(err => { // console.error('请求失败', err); // }) // }) } // function douyuVideo_createUp(cookie, vid, ctn) { // // 斗鱼视频点赞 // return exHttpRequest("https://v.douyu.com/api/video/createUp", "POST", { // cookie: cookie // }, "vid=" + vid + "&ccn=" + ctn); // } // function douyuVideo_destroyUp(cookie, vid, ctn) { // // 斗鱼视频取消点赞 // return exHttpRequest("https://v.douyu.com/api/video/destroyUp", "POST", { // cookie: cookie // }, "vid=" + vid + "&ccn=" + ctn); // } // function douyuVideo_createCollect(cookie, vid, ctn) { // // 斗鱼视频收藏 // return exHttpRequest("https://v.douyu.com/api/video/createCollect", "POST", { // cookie: cookie // }, "vid=" + vid + "&ccn=" + ctn); // } // function douyuVideo_destroyCollect(cookie, vid, ctn) { // // 斗鱼视频取消收藏 // return exHttpRequest("https://v.douyu.com/api/video/destroyCollect", "POST", { // cookie: cookie // }, "vid=" + vid + "&ccn=" + ctn); // } // function douyuVideo_createSub(cookie, uid, ctn) { // // 斗鱼关注UP主 // return exHttpRequest("https://v.douyu.com/api/video/createSub", "POST", { // cookie: cookie // }, "uid=" + uid + "&ccn=" + ctn); // } // function douyuVideo_destroySub(cookie, uid, ctn) { // // 斗鱼取消关注UP主 // return exHttpRequest("https://v.douyu.com/api/video/destroySub", "POST", { // cookie: cookie // }, "uid=" + uid + "&ccn=" + ctn); // } // function douyuVideo_shareVideo(token, vid) { // // 斗鱼分享视频 // return exHttpRequest("https://apiv2.douyucdn.cn/mgapi/vodnc/share/success?token=" + token + "&client_sys=android", "POST", {}, "hash_id=" + vid + "&share_type=weixin"); // } // https://blog.csdn.net/hongszh/article/details/104354252 /** * options: * - width: 视频宽度 * - height: 视频高度 * - fontSize: 字体大小 * - color: 字体颜色 * - alpha: 字体透明度 0~256 * - stayTime: 弹幕停留时间 */ class ASS { constructor(options) { let defaultOptions = { width: 1920, height: 1080, fontSize: 36, alpha: this._prefixInteger(Number(0).toString(16), 2), // 0~255 0不透明 255全透明 stayTime: 10, title: "Default" }; this.options = { ...defaultOptions, ...options, ...options ? options.alpha ? this._prefixInteger(this.options.alpha.toString(16), 2) : {} : {}, }; this.lines = 20; // 弹幕行数 this.lineBase = this.options.height / this.lines; // 每行高度 this.currentLine = 0; // 当前行数 this.diffTime = 1500; // 如果上下两条在n秒内连续发送,就换行 } generate(list) { /** * list: * - time: 时间,单位毫秒 * - txt: 文本 * - color: 颜色 */ let sortList = list.sort((a, b) => { return a.time - b.time; }) let result = this._getScriptInfo() + this._getV4Styles() + this._getEvents(); for (let i = 0; i < sortList.length; i++) { if (i > 0 && sortList[i].time - sortList[i-1].time <= this.diffTime) { this.currentLine++; } else { this.currentLine = 0; } if (this.currentLine >= this.lines) { this.currentLine = 0; } let item = sortList[i]; let endTime = Number(item.time) + Number(this.options.stayTime) * 1000; let heightOffset = this.lineBase * this.currentLine + this.options.fontSize; let fontWidth = this.options.fontSize * item.txt.length; result += `Dialogue: 0,${formatSeconds2(Number(item.time)/1000)}.00,${formatSeconds2(endTime/1000)}.00,Color${item.color},,0,0,0,,{\\move(${this.options.width + fontWidth},${heightOffset},${-fontWidth},${heightOffset})}${item.txt}\n`; } return result; } _prefixInteger(num, length) { num = '' + num; return Array(length + 1 - num.length).join('0') + num; } _getScriptInfo() { return `[Script Info] ; DouyuEx -By qianjiachun ; https://github.com/qianjiachun/douyuEx ScriptType: v4.00+ Title: ${this.options.title} PlayResX: ${this.options.width} PlayResY: ${this.options.height} ` } _getV4Styles() { return ` [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Color0,黑体,${this.options.fontSize},&H${this.options.alpha}FFFFFF,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color7,黑体,${this.options.fontSize},&H${this.options.alpha}5456FF,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color8,黑体,${this.options.fontSize},&H${this.options.alpha}2375FF,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color9,黑体,${this.options.fontSize},&H${this.options.alpha}B369FE,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color10,黑体,${this.options.fontSize},&H${this.options.alpha}00BCFF,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color11,黑体,${this.options.fontSize},&H${this.options.alpha}46C978,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color12,黑体,${this.options.fontSize},&H${this.options.alpha}FF7F9E,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 Style: Color13,黑体,${this.options.fontSize},&H${this.options.alpha}FF9B3D,&H80000000,&H80000000,&H80000000,0,0,0,0,100,100,0,0,0,0,0,0,0,0,0,134 ` } _getEvents() { return ` [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text ` } } /* CClick 单双击/长按不冲突的解决方案 By: 小淳 调用方法: let a = new CClick(document.getElementById("")); a.click((e) => {// TODO}); a.dbClick((e) => {// TODO}); a.longClick((e) => {// TODO}); */ class CClick { constructor(element) { const CONST_LONG_TIME = 700; // 长按多少ms执行 const CONST_DOUBLE_TIME = 250; // 双击的间隔 this.func_click = null; this.func_dbClick = null; this.func_longClick = null; let isLong = false; let timer_long; let clickTimes = 0; let timer_db; element.onmousedown = (event) => { if (event.button !== 0) { return; } isLong = false; timer_long = setTimeout(() => { isLong = true; if (this.func_longClick !== null) { this.func_longClick(event); } }, CONST_LONG_TIME); }; element.onmouseup = (event) => { if (event.button !== 0) { return; } if (isLong == false) { clearTimeout(timer_long); clickTimes++; if (clickTimes >= 2) { clearTimeout(timer_db); clickTimes = 0; if (this.func_dbClick !== null) { this.func_dbClick(event); } return; } timer_db = setTimeout(() => { clickTimes = 0; if (this.func_click !== null) { this.func_click(event); } }, CONST_DOUBLE_TIME); } }; } click(callback) { this.func_click = callback; } dbClick(callback) { this.func_dbClick = callback; } longClick(callback) { this.func_longClick = callback; } } class DomHook { constructor(selector, isSubtree, callback) { this.selector = selector; this.isSubtree = isSubtree; let targetNode = document.querySelector(this.selector); if (targetNode == null) { return; } let observer = new MutationObserver(function(mutations) { callback(mutations); }); this.observer = observer; this.observer.observe(targetNode, { attributes: true, childList: true, subtree: this.isSubtree }); } closeHook() { if (this.observer) { this.observer.disconnect(); } } } // 获取斗鱼视频站post body sign // -By 小淳 // 用法: let dyVideoSign = new DyVideoSign("视频point_id"); let sign = dyVideoSign.getSign(); // 注意: 使用完记得将实例null,point_id为window.$DATA.ROOM.point_id class DyVideoSign { constructor(pointId) { this.pointId = pointId; this.decoder = new TextDecoder(); } getSign() { let did = "10000000000000000000000000001501"; // DEFAULT_DID$1 let tt = parseInt((new Date).getTime() / 1e3, 10); return unsafeWindow[this.d539fa2cf7732d2a(256042, "9f4f419501570ad13334")](this.pointId, did, tt); } d539fa2cf7732d2a(e, t) { for (var n = CryptoJS.MM(e.toString()).toString(), r = n[0].charCodeAt(0), a = n[16].charCodeAt(0), i = [], o = 0; o < 4; o++) i[o] = r << 24 | r << 16 | r << 8 | r, i[o + 4] = a << 24 | a << 16 | a << 8 | a; var s = Math.floor(t.length / 16) % 4, l = [], d = t.length % 8, c = Math.floor(t.length / 8); for (o = 0; o < c; o++) l[o] = 255 & parseInt(t.substr(8 * o, 2), 16) | parseInt(t.substr(8 * o + 2, 2), 16) << 8 & 65280 | parseInt(t.substr(8 * o + 4, 2), 16) << 24 >>> 8 | parseInt(t.substr(8 * o + 6, 2), 16) << 24; var p = []; p = 0 == s ? e86500e2(l, i) : 1 == s ? this.c30070a4(l, i) : d831eb20(l, i); var h = []; for (o = 0; o < p.length; o++) { var f = 255 & p[o], u = p[o] >>> 8 & 255, m = p[o] >>> 16 & 255, g = p[o] >>> 24 & 255; f && h.push(f), u && h.push(u), m && h.push(m), g && h.push(g) } var b = Math.floor(d / 2); for (o = 0; o < b; o++) h.push(255 & parseInt(t.substr(8 * c + 2 * o, 2), 16)); return this.decoder.decode(new Uint8Array(h)) } c30070a4(e, t) { for (var n = Math.floor(e.length / 2), r = e.slice(0), a = 0; a < n; a++) { var i = this.f5a40d76(e.slice(2 * a, 2 * a + 2), 32, t.slice(4 * a % 8, 4 * a % 8 + 4)); r[2 * a + 0] = i[0], r[2 * a + 1] = i[1] } return r } f5a40d76(e, t, n) { for (var r = 0; r < e.length; r += 2) { var a, i = e[r], o = e[r + 1], s = 2654435769 * t; for (a = 0; a < t; a++) i -= ((o -= (i << 4 ^ i >>> 5) + i ^ s + n[s >>> 11 & 3]) << 4 ^ o >>> 5) + o ^ (s -= 2654435769) + n[3 & s]; e[r] = i, e[r + 1] = o } return e } } class DyWacthAd { constructor(posid, token, rid) { this.posid = posid; this.token = token; this.rid = rid; this._uid = String(token).split("_")[0]; this._mid = 0; this._infoBack = ""; } async start() { let info = await this.getInfo(this.posid, this.token, this.rid); if (info == false) { return false; } this._mid = info.mid; this._infoBack = info.infoBack; let isStart = await this.getStart(this.posid, this.token, this._uid, this._mid, this._infoBack); return isStart; } async finish() { let isFinish = await this.getFinish(this.posid, this.token, this._uid, this._mid, this._infoBack); return isFinish; } getInfo(posid, token, rid) { 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 + "&roomid=" + rid + "&cate1=1&cate2=1&chanid=30" + '&device={"nt":"1"}', responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, onload: function(response) { let ret = response.response; if (ret.error == "0") { if (ret.data.length == 0) { resolve(false); return; } let mid = ret.data[0].mid; let infoBack = encodeURIComponent(JSON.stringify(ret.data)); resolve({mid: mid, infoBack: infoBack}); } } }); }) } getStart(posid, 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: "&uid=" + uid + "&roomId=" + rid + "&posCode=" + posid + "&token=" + token + "&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); } } }); }) } getFinish(posid, 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 + "&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") { if (ret.data == "1") { resolve(true); } else { resolve(false); } } else { resolve(false); } } }); }) } } function M3U8() { var _this = this; // access root scope this.ie = navigator.appVersion.toString().indexOf(".NET") > 0; this.ios = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); this.start = function(m3u8, options) { if (!options) options = {}; var callbacks = { progress: null, finished: null, error: null, aborted: null } var recur; // the recursive download instance to later be initialized. Scoped here so callbakcs can access and manage it. function handleCb(key, payload) { if (key && callbacks[key]) callbacks[key](payload); } if (_this.ios) return handleCb("error", "Downloading on IOS is not supported."); var startObj = { on: function(str, cb) { switch (str) { case "progress": { callbacks.progress = cb; break; } case "finished": { callbacks.finished = cb; break; } case "error": { callbacks.error = cb; break; } case "aborted": { callbacks.aborted = cb; break; } } return startObj; }, abort: function() { ; recur && (recur.aborted = function() { handleCb("aborted"); }); } } var download = new Promise(function(resolve, reject) { var url = new URL(m3u8); var req = fetch(m3u8) .then(function(d) { return d.text(); }) .then(function(d) { var filtered = filter(d.split(/(\r\n|\r|\n)/gi), function(item) { return item.indexOf(".ts") > -1; // select only ts files }); var mapped = map(filtered, function(v, i) { if (v.indexOf("http") === 0 || v.indexOf("ftp") === 0) { // absolute url return v; } return url.protocol + "//" + url.host + url.pathname + "/./../" + v; // map ts files into url }); if (!mapped.length) { reject("Invalid m3u8 playlist"); return handleCb("error", "Invalid m3u8 playlist"); } recur = new RecurseDownload(mapped, function(data) { var blob = new Blob(data, { type: "octet/stream" }); handleCb("progress", { status: "Processing..." }); if (!options.returnBlob) { if (_this.ios) { // handle ios? } else if (_this.ie) { handleCb("progress", { status: "Sending video to Internet Explorer... this may take a while depending on your device's performance." }); window.navigator.msSaveBlob(blob, (options && options.filename) || "video.mp4"); } else { handleCb("progress", { status: "Sending video to browser..." }); var a = document.createElementNS("http://www.w3.org/1999/xhtml", "a"); a.href = URL.createObjectURL(blob); a.download = (options && options.filename) || "video.mp4"; a.style.display = "none"; document.body.appendChild(a); // Firefox fix a.click(); handleCb("finished", { status: "Successfully downloaded video", data: blob }); resolve(blob); } } else { handleCb("finished", { status: "Successfully downloaded video", data: blob }); resolve(blob) } }, 0, []); recur.onprogress = function(obj) { handleCb("progress", obj); } }) .catch(function(err) { handleCb("error", "Something went wrong when downloading m3u8 playlist: " + err); }); }); return startObj; } function RecurseDownload(arr, cb, i, data) { // recursively download asynchronously 2 at the time var _this = this; this.aborted = false; this.threadNum = 10; this.step = 0; recurseDownload(arr, cb, i, data); function recurseDownload(arr, cb, i, data) { let taskList = []; for (let j = 0; j < _this.threadNum; j++) { if (arr[i+j]) { taskList.push(fetch(arr[i+j]).catch(err => { fetch(arr[i+j]).catch(err => { fetch(arr[i+j]); }) })); } else { taskList.push(Promise.resolve()); break; } } _this.step = taskList.length; var req = Promise.all(taskList) // HTTP protocol dictates only TWO requests can be simultaneously performed .then(function(d) { return map(filter(d, function(v) { return v && v.blob; }), function(v) { return v.blob(); }); }) .then(function(d) { return Promise.all(d); }) .then(function(d) { var blobs = map(d, function(v, j) { return new Promise(function(resolve, reject) { var reader = new FileReader(); var read = reader.readAsArrayBuffer(new Blob([v], { type: "octet/stream" })); // IE can't read Blob.arrayBuffer :( reader.addEventListener("loadend", function(event) { resolve(reader.result);; (_this.onprogress && _this.onprogress({ segment: i + j + 1, total: arr.length, percentage: ((i + j + 1) / arr.length * 100).toFixed(3), downloaded: formatNumber(+reduce(map(data, function(v) { return v.byteLength; }), function(t, c) { return t + c; }, 0)), status: "Downloading..." })); }); }); }); Promise.all(blobs).then(function(d) { for (var n = 0; n < d.length; n++) { // polymorphism data.push(d[n]); } let step = _this.step; var increment = arr[i + 2] ? 2 : 1; if (_this.aborted) { data = null; _this.aborted(); return; // exit promise } else if (arr[i + step]) { if (_this.ie) { setTimeout(function() { recurseDownload(arr, cb, i + step, data); }, 500); } else { recurseDownload(arr, cb, i + step, data); } } else { cb(data); } }); }) .catch(function(err) { ; _this.onerror && _this.onerror("Something went wrong when downloading ts file, nr. " + i + ": " + err); }); } } function filter(arr, condition) { var result = []; for (var i = 0; i < arr.length; i++) { if (condition(arr[i], i)) { result.push(arr[i]); } } return result; } function map(arr, condition) { var result = arr.slice(0); for (var i = 0; i < arr.length; i++) { result[i] = condition(arr[i], i); } return result; } function reduce(arr, condition, start) { var result = start; arr.forEach(function(v, i) { var res = +condition(result, v, i); result = res; }); return result; } function formatNumber(n) { var ranges = [{ divider: 1e18, suffix: "EB" }, { divider: 1e15, suffix: "PB" }, { divider: 1e12, suffix: "TB" }, { divider: 1e9, suffix: "GB" }, { divider: 1e6, suffix: "MB" }, { divider: 1e3, suffix: "kB" } ] for (var i = 0; i < ranges.length; i++) { if (n >= ranges[i].divider) { var res = (n / ranges[i].divider).toString() return res.toString().split(".")[0] + ranges[i].suffix; } } return n.toString(); } } /* 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'+'
    '+'×'+''+""+this.textTemplate.title+""+""+"
    "+'
    '+''+this.textTemplate.content+""+"
    "+'"+"
    "+"";return temp},getConfirmTemplate:function(){return'
    '+'
    '+'
    '+'
    '+'×'+''+""+this.textTemplate.title+""+""+"
    "+'
    '+''+this.textTemplate.content+"?"+"
    "+'"+"
    "+"
    "+"
    "},getPromptTemplate:function(){return'
    '+'
    '+'
    '+'
    '+'×'+''+""+this.textTemplate.title+""+""+"
    "+'
    '+''+"
    "+'"+"
    "+"
    "+"
    "},alert:function(opt){this.textTemplate.title=opt.title||this.textTemplate.title;this.textTemplate.content=opt.content||this.textTemplate.content;this.textTemplate.okBtn=opt.okBtn||this.textTemplate.okBtn;this.textTemplate.okBtnColor=opt.okBtnColor||this.textTemplate.okBtnColor;this.textTemplate.contentColor=opt.contentColor||this.textTemplate.contentColor;var box=document.createElement("div"),_this=this;box.className=this.containerClass;box.innerHTML=this.getAlertTemplate();this.box=box;document.body.appendChild(this.box);var btn=document.getElementsByClassName("btn-footer-ok");btn[btn.length-1].focus();btn[btn.length-1].onclick=function(){if(opt.onConfirm){opt.onConfirm()}_this.removeBox()}},confirm:function(opt){this.textTemplate.title=opt.title||this.textTemplate.promptTitle;this.textTemplate.promptPlaceholder=opt.promptPlaceholder||this.textTemplate.promptPlaceholder;this.textTemplate.okBtn=opt.okBtn||this.textTemplate.promptOkBtn;this.textTemplate.okBtnColor=opt.okBtnColor||this.textTemplate.okBtnColor;this.textTemplate.cancelBtn=opt.cancelBtn||this.textTemplate.cancelBtn;this.textTemplate.cancelBtnColor=opt.cancelBtnColor||this.textTemplate.cancelBtnColor;this.textTemplate.content=opt.content||this.textTemplate.content;var box=document.createElement("div"),_this=this;this.box=box;box.className=this.containerClass;box.innerHTML=this.getConfirmTemplate();document.body.appendChild(box);var okBtn=document.getElementsByClassName("btn-footer-ok");okBtn[okBtn.length-1].focus();okBtn[okBtn.length-1].onclick=function(){if(opt.onConfirm){opt.onConfirm()}_this.removeBox()};var cancelBtn=document.getElementsByClassName("btn-footer-cancel");cancelBtn[cancelBtn.length-1].onclick=function(){if(opt.onCancel){opt.onCancel()}_this.removeBox()}},prompt:function(opt){this.textTemplate.title=opt.title||this.textTemplate.title;this.textTemplate.content=opt.content||this.textTemplate.content;this.textTemplate.contentColor=opt.contentColor||this.textTemplate.contentColor;this.textTemplate.okBtn=opt.okBtn||this.textTemplate.okBtn;this.textTemplate.okBtnColor=opt.okBtnColor||this.textTemplate.okBtnColor;this.textTemplate.cancelBtn=opt.cancelBtn||this.textTemplate.cancelBtn;this.textTemplate.cancelBtnColor=opt.cancelBtnColor||this.textTemplate.cancelBtnColor;var box=document.createElement("div"),_this=this;box.className=this.containerClass;box.innerHTML=this.getPromptTemplate();this.box=box;document.body.appendChild(box);var promptInput=document.getElementsByClassName("postbird-prompt-input"); promptInput=promptInput[promptInput.length-1];promptInput.focus();var okBtn=document.getElementsByClassName("btn-footer-ok");var inputData=promptInput.value;okBtn[okBtn.length-1].focus();okBtn[okBtn.length-1].onclick=function(){if(opt.onConfirm){opt.onConfirm(promptInput.value)}_this.removeBox()};var cancelBtn=document.getElementsByClassName("btn-footer-cancel");cancelBtn[cancelBtn.length-1].onclick=function(){if(opt.onCancel){opt.onCancel(promptInput.value)}_this.removeBox()}},colse:function(){this.removeBox()},removeBox:function(){var box=document.getElementsByClassName(this.containerClass);document.body.removeChild(box[box.length-1])}}; /* Get Bilibili Real Live URL (https) By: 小淳 */ function getRealLive_Bilibili(room_id, qn, cdn, reallive_callback) { // 第一个参数传入string,表示房间号(注意是真实房间号) // 第二个参数传入string(1,2,3,4,5),表示清晰度 流畅_80(1) 高清_150(2) 超清_250(3) 蓝光_400p(4) 原画_10000p(5) // 第三个参数传入string(1,2,3,4),表示线路 1:主线路 2:备用线路1 3:备用线路2 4:备用线路3 此参数只对HTTPS有效 // 第四个参数传入回调函数,最好是箭头函数,用于处理返回的地址,例: (url) => {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 = "20000"; break; default: qn_data = "80"; break; } GM_xmlhttpRequest({ method: "GET", url: `https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=${room_id}&platform=web&qn=${qn_data}&protocol=0,1&format=0,1,2&codec=0,1`, responseType: "json", onload: function (response) { let ret = response.response; let rurl = ""; for (let i = 0; i < ret.data.playurl_info.playurl.stream.length; i++) { const item = ret.data.playurl_info.playurl.stream[i]; if (String(item.protocol_name).includes("hls") && item.format.length > 0) { let url_info = item.format[0].codec[0].url_info[0]; let base_url = item.format[0].codec[0].base_url; rurl = `${url_info.host}${base_url}${url_info.extra}`; } } let streamList = ret.data.durl; if (streamList) { rurl = streamList.length > 0 ? streamList[0].url : ""; } reallive_callback(rurl); } }); } /* Get Bilibili Real Room ID By: 小淳 */ function getRealRid_Bilibili(url, realrid_callback) { let arr = url.split("/"); let rid = arr[arr.length - 1]; GM_xmlhttpRequest({ method: "GET", url: "https://api.live.bilibili.com/room/v1/Room/room_init?id=" + rid, responseType: "json", onload: function(response) { let ret = response.response; realrid_callback(ret.data.room_id); } }); } /* Get Douyu Real Live URL (http/https) By: 小淳 */ function getRealLive_Douyu(room_id, is_video, is_https, qn, reallive_callback) { // 第一个参数传入string,表示房间号(注意是真实房间号) // 第二个参数传入bool,表示是视频还是音频 // 第三个参数传入bool,表示是否返回https地址。注意https地址只能使用一次,使用过以后需要再次获取;http地址无限制 // 第四个参数传入string(1,2,3,4),表示清晰度 流畅_550p(rate:1) 高清_1200p(rate:2) 超清_2000p(rate:3) 蓝光4M_4000p(rate:0) 填写1015则返回默认清晰度 // 第五个参数传入回调函数,最好是箭头函数,用于处理返回的地址,例: (url) => {console.log(url)} let tt0 = Math.round(new Date().getTime()/1000).toString(); if (is_video) { // 由于pc获取的流没办法通过在后缀增加&only-audio=1来实现音频流,所以分开来实现 GM_xmlhttpRequest({ method: "GET", url: 'https://www.douyu.com/' + room_id, responseType: "text", onload: function(response) { let a = response.response.match(/(vdwdae325w_64we[\s\S]*?function ub98484234[\s\S]*?)function/i); let ub9_ex = String(a[1]).replace("ub98484234", "ub98484234_ex_pc"); eval1(ub9_ex, "exScript2"); // RealLive_get_sign_url(room_id, tt0, is_https, qn, reallive_callback, is_video); RealLive_get_sign_url_pc(room_id, tt0, true, qn, reallive_callback, is_video); } }); } else { 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 ub9_ex = String(a[0]).replace("ub98484234", "ub98484234_ex"); eval1(ub9_ex, "exScript1"); // RealLive_get_sign_url(room_id, tt0, is_https, qn, reallive_callback, is_video); RealLive_get_sign_url(room_id, tt0, true, qn, reallive_callback, is_video); } }); } } function RealLive_get_sign_url(r, tt, is_https, qn, reallive_callback, is_video) { let param1 = ub98484234_ex(r, getDyDid(), tt); let postData; if (qn == "1015") { postData = param1 + "&ver=219032101&rid=" + r + "&rate=1"; } else { postData = param1 + "&ver=219032101&rid=" + r + "&rate=" + qn; } document.getElementById("exScript1").remove(); GM_xmlhttpRequest({ method: "POST", url: "https://m.douyu.com/api/room/ratestream", data: postData, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, 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 = /^[0-9a-zA-Z]*/; let tmpArr = String(ret.data.url).split("/"); result = String(tmpArr[tmpArr.length - 1]).match(p)[0]; } } 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 = "" break; } let realLive = ""; if (result == "0") { realLive = "None"; } else { if (is_https == true) { realLive = String(ret.data.url).replace("m3u8", "flv"); realLive = realLive.replace("http:", "https:"); } else { if (qn == "1015" || cl == "") { // qn写1015则不返回清晰度,即默认 // realLive = "http://tx2play1.douyucdn.cn/live/" + result + ".xs"; // realLive = "http://dyscdnali1.douyucdn.cn/live/" + result + ".flv?uuid="; realLive = "https://openflv-huos.douyucdn2.cn/dyliveflv1/" + result + ".flv?uuid="; } else { realLive = "https://openflv-huos.douyucdn2.cn/dyliveflv1/" + result + "_" + cl + ".flv?uuid="; // realLive = "http://tx2play1.douyucdn.cn/live/" + result + "_" + cl + ".xs"; } } realLive = is_video ? realLive : realLive + "&only-audio=1"; } reallive_callback(realLive); } }); } function RealLive_get_sign_url_pc(r, tt, is_https, qn, reallive_callback) { let param1 = ub98484234_ex_pc(r, getDyDid(), tt); let postData; if (qn == "1015") { postData = param1 + "&ver=219032101&cdn=hs-h5&rid=" + r + "&rate=0"; } else { postData = param1 + "&ver=219032101&cdn=hs-h5&rid=" + r + "&rate=" + qn; } document.getElementById("exScript2").remove(); GM_xmlhttpRequest({ method: "POST", url: "https://www.douyu.com/lapi/live/getH5Play/" + r, data: postData, responseType: "json", headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, onload: function(response) { let ret = response.response; let realLive = ""; if (ret.error === 0) { realLive = `${ret.data.rtmp_url}/${ret.data.rtmp_live}` } reallive_callback(realLive); } }); } function eval1(str, iid) { let 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(rid, qn, 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; } GM_xmlhttpRequest({ method: 'GET', url: "https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid=" + rid, responseType: 'json', onload: ret=>{ let msg = ""; let liveUrl = ""; let multiLine = ret.response.data.stream.flv.multiLine; if (multiLine.length && multiLine.length > 0) { liveUrl = multiLine[0].url.replace("http", "https"); } if (liveUrl == null || liveUrl == "") { msg = "房间暂未开播"; } reallive_callback(liveUrl, msg); } }) } function stt_unescape(v) { if (!v) return; return v.toString().replace(/@A/g, '@').replace(/@S/g, '/') } function stt_deserialize(raw) { if(!raw) return; if (raw.includes('//')) { return raw.split('//').filter(e => e !== '').map(item => stt_deserialize(item)) } if (raw.includes('@=')) { return raw.split('/').filter(e => e !== '').reduce((o, s) => { const [k, v] = s.split('@=') o[k] = stt_deserialize(stt_unescape(v)) return o }, {}) } else if (raw.includes('@A=')) { return stt_deserialize(stt_unescape(raw)) } else { return raw.toString() } } // let a = new STT(); // a.deserialize(`type@=rquizisn/rid@=475252/qst@=1/qril@=qid@AA=4441661@ASqbid@AA=7341fe0a159617089038802172028@ASqt@AA=我的死亡数能否小于等于5@ASfon@AA=能@ASson@AA=不能@ASfbuid@AA=9985474@ASsbuid@AA=182243496@ASfbmc@AA=2360@ASsbmc@AA=4545@ASfolpc@AA=10@ASsolpc@AA=220@ASfobc@AA=440126@ASsobc@AA=39210@ASfbid@AA=109846265@ASsbid@AA=109846431@ASqs@AA=1@ASet@AA=-1@ASwo@AA=0@ASscs@AA=0@ASsuid@AA=25332273@ASsname@AA=孙悟空丨兰林汉@ASaktp@AA=10@ASft@AA=0@ASflagc@AA=0@AS@Sqid@AA=4441660@ASqbid@AA=7341fe0a159617089038802172028@ASqt@AA=比赛结果@ASfon@AA=赢@ASson@AA=输@ASfbuid@AA=0@ASsbuid@AA=136676242@ASfbmc@AA=0@ASsbmc@AA=35978@ASfolpc@AA=0@ASsolpc@AA=990@ASfobc@AA=1809968@ASsobc@AA=64078@ASfbid@AA=0@ASsbid@AA=109846387@ASqs@AA=1@ASet@AA=-1@ASwo@AA=0@ASscs@AA=0@ASsuid@AA=25332273@ASsname@AA=孙悟空丨兰林汉@ASaktp@AA=10@ASft@AA=0@ASflagc@AA=0@AS@Sqid@AA=4441659@ASqbid@AA=7341fe0a159617089038802172028@ASqt@AA=我的伤害能否全场第一@ASfon@AA=能@ASson@AA=不能@ASfbuid@AA=186024887@ASsbuid@AA=175701690@ASfbmc@AA=382@ASsbmc@AA=86040@ASfolpc@AA=510@ASsolpc@AA=10@ASfobc@AA=90719@ASsobc@AA=224159@ASfbid@AA=109846402@ASsbid@AA=109846396@ASqs@AA=1@ASet@AA=-1@ASwo@AA=0@ASscs@AA=0@ASsuid@AA=25332273@ASsname@AA=孙悟空丨兰林汉@ASaktp@AA=10@ASft@AA=0@ASflagc@AA=0@AS@S/`) // function parseMsg(t) { // if (t.includes("//")) { // return t.split("//").map(item => {return parseMsg(item)}).filter(e => { return e !== "" }); // } // if (t.includes("@=")) { // let arr = t.split("/"); // return arr.reduce((prev, cur) => { // if (cur !== "") { // let obj = cur.split("@="); // prev[obj[0]] = parseMsg(obj[1].replace(/@A/g, '@').replace(/@S/g, '/')); // } // return prev; // }, {}) // } else if (t.includes("@A=")) { // return parseMsg(t.replace(/@A/g, '@').replace(/@S/g, '/')); // } else { // return t; // } // } /* Style Hook 用于替换页面的原样式 By 小淳 */ function StyleHook_set(styleName, styleText) { // styleName:样式id名,建议以Ex_Style_大驼峰的形式命名 if (document.getElementById(styleName) == null) { let styleElement = document.createElement("style"); styleElement.id = styleName; styleElement.innerHTML = styleText; document.body.append(styleElement); } } function StyleHook_remove(styleName) { let e = document.getElementById(styleName); if (e !== null) { document.getElementById(styleName).remove(); } } function StyleHook_setIframe(dom, styleName, styleText) { // styleName:样式id名,建议以Ex_Style_大驼峰的形式命名 // document.getElementsByClassName("BottomGroup")[0].getElementsByTagName("iframe")[0].contentWindow.document if (dom.getElementById(styleName) == null) { let styleElement = dom.createElement("style"); styleElement.id = styleName; styleElement.innerHTML = styleText; dom.body.append(styleElement); } } function StyleHook_removeIframe(dom, styleName) { let e = dom.getElementById(styleName); if (e !== null) { dom.getElementById(styleName).remove(); } } /* DouyuEx WebSocket By: 小淳 此处为一些公共函数 */ function WebSocket_Packet(str) { const MSG_TYPE = 689; let bytesArr = stringToByte(str); let buffer = new Uint8Array(bytesArr.length + 4 + 4 + 2 + 1 + 1 + 1); let p_content = new Uint8Array(bytesArr.length); // 消息内容 for (let i = 0; i < p_content.length; i++) { p_content[i] = bytesArr[i]; } let p_length = new Uint32Array([bytesArr.length + 4 + 2 + 1 + 1 + 1]); // 消息长度 let p_type = new Uint32Array([MSG_TYPE]); // 消息类型 buffer.set(new Uint8Array(p_length.buffer), 0); buffer.set(new Uint8Array(p_length.buffer), 4); buffer.set(new Uint8Array(p_type.buffer), 8); buffer.set(p_content, 12); return buffer; } function stringToByte(str) { let bytes = new Array(); let len, c; len = str.length; for(let i = 0; i < len; i++) { c = String(str).charCodeAt(i); if(c >= 0x010000 && c <= 0x10FFFF) { bytes.push(((c >> 18) & 0x07) | 0xF0); bytes.push(((c >> 12) & 0x3F) | 0x80); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if(c >= 0x000800 && c <= 0x00FFFF) { bytes.push(((c >> 12) & 0x0F) | 0xE0); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if(c >= 0x000080 && c <= 0x0007FF) { bytes.push(((c >> 6) & 0x1F) | 0xC0); bytes.push((c & 0x3F) | 0x80); } else { bytes.push(c & 0xFF); } } return bytes; } function byteToString(arr) { if(typeof arr === 'string') { return arr; } let str = '', _arr = arr; for(let i = 0; i < _arr.length; i++) { let one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if(v && one.length == 8) { let bytesLength = v[0].length; let store = _arr[i].toString(2).slice(7 - bytesLength); for(let st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str; } function hex2bin(e) { if ("string" === typeof e && e.length % 8 === 0) { for (let r = [], t = e.length, o = 0; o < t;) r.push(e.substr(o, 2)), o += 2; for (let n = [], i = r.length, s = 0; s < i;) n.push(parseInt(r.slice(s, s + 4).reverse().join(""), 16)), s += 4; return n } return null } function hex(e) { if (Array.isArray(e)) { let r = "0123456789abcdef".split(""); return e.map(function (e) { for (let t = "", o = 0; o < 4; o++) t += r[e >> 8 * o + 4 & 15] + r[e >> 8 * o & 15]; return t }).join("") } return "" } /* DouyuEx WebSocket UnLogin By: 小淳 */ class Ex_WebSocket_UnLogin { // 调用方法: // 连接:let a = new Ex_WebSocket_UnLogin("房间号", 消息回调函数); // 关闭连接: a.WebSocket_Close(); a = null; 记得null掉变量再重新连接 // 消息回调函数建议用箭头函数,示例:(msg) => {// TODO} constructor(rid, callback) { if ("WebSocket" in window) { this.timer = 0; this.roomid = rid; this.ws = new WebSocket("wss://danmuproxy.douyu.com:850" + String(getRandom(2,5))); // 负载均衡 8502~8504都可以用 this.ws.onopen = () => { this.ws.send(WebSocket_Packet("type@=loginreq/roomid@=" + rid)); this.ws.send(WebSocket_Packet("type@=joingroup/rid@=" + rid + "/gid@=-9999/")); this.timer = setInterval(() => { this.ws.send(WebSocket_Packet("type@=mrkl/")); }, 40000) // console.log("WebSocket已连接"); }; this.ws.onmessage = (e) => { let reader = new FileReader(); reader.onload = () => { let arr = String(reader.result).split("\0"); // 分包 reader = null; for (let i = 0; i < arr.length; i++) { if (arr[i].length > 12) { // 过滤第一条和心跳包 callback(arr[i]); } } }; reader.readAsText(e.data); }; this.ws.onclose = () => { showMessage("服务器连接丢失,请尝试刷新页面", "error"); console.log("服务器连接丢失"); }; } } close() { clearInterval(this.timer); this.ws.close(); } } function initRouter(href) { // 用于优先载入夜间模式 // if (String(href).indexOf("www.douyu.com") && String(href).indexOf("getFansBadgeList") == -1) { // initPkg_Night_Set_Fast(); // } // 路由转发 if (String(href).indexOf("passport.douyu.com") !== -1 && String(href).indexOf("exid=chun") !== -1) { // 账号 initRouter_Passport(); } else if (String(href).indexOf("msg.douyu.com") !== -1) { // 车队 if (href.indexOf("?exClean") !== -1) { initRouter_CleanMsg(); } else { initRouter_Motorcade(); } } else if (String(href).indexOf("yuba.douyu.com") !== -1) { // 鱼吧 if (String(href).indexOf("?exClean") !== -1) { initRouter_CleanYuba(); } else { initRouter_Yuba(); } } else if (String(href).indexOf("v.douyu.com") !== -1) { // 视频 if (String(href).indexOf("?exClean") !== -1) { initRouter_CleanVideo(); } else if (String(href).indexOf("show/") !== -1) { initRouter_Video(); } } else if (String(href).indexOf("cz.douyu.com") !== -1) { // 充值 if (String(href).indexOf("?exClean") !== -1) { initRouter_CleanCz(); } } else if (String(href).indexOf("getFansBadgeList") !== -1) { // 粉丝牌 initRouter_FansBadgeList(); } else { if (String(href).indexOf("exid=chun") !== -1) { // 主站 initRouter_DouyuRoom_Popup(); } else { if (String(href).indexOf("template/") !== -1 || String(href).indexOf("h5/") !== -1) { return; } initRouter_DouyuRoom_Main(); } } } function initRouter_Motorcade() { // 车队 if (getQueryString("exid") == "chun") { signMotorcade_Sign(); } } function initRouter_DouyuRoom_Popup() { // 画中画 removeAD(); 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); } function initRouter_DouyuRoom_Main() { // 主要 document.domain = "douyu.com"; init(); let intID = setInterval(() => { let dom1 = document.getElementsByClassName("BackpackButton")[0]; let dom2 = document.getElementsByClassName("Barrage-main")[0]; if (!dom1 || !dom2) { return; } setTimeout(() => { initStyles(); initPkg(); initPkgSpecial(); initTimer(); }, 1500) clearInterval(intID); }, 1000); } function initPkgSpecial() { // if (rid == "5189167") { // initPkg_Point(); // } } // function initRouter_Novel() { // startWatchNovel(); // } function initRouter_Yuba() { document.domain = "douyu.com"; } function initRouter_Passport() { let cmd = getStrMiddle(window.location.href, "cmd=", "&"); let uid = getStrMiddle(window.location.href, "uid=", "&"); let domain = getStrMiddle(window.location.href, "domain=", "&"); if (cmd !== "clean") { addAccountPassport(uid); } switch (cmd) { case "clean": // 清空cookie,用于重新登录 cleanCookie(() => { window.parent.postMessage("cleanOver", decodeURIComponent(domain)); }); break; case "switch": // 切换用户 switchAccountPassport(uid, () => { window.parent.postMessage("switchOver", decodeURIComponent(domain)); }); break; case "delete": // 删除用户 deleteAccountPassport(uid, () => { window.parent.postMessage("deleteOver", decodeURIComponent(domain)); }); break; default: break; } return; } function initRouter_CleanMsg() { let domain = getStrMiddle(window.location.href, "domain=", "&"); cleanCookie(() => { window.parent.postMessage("msgCleanOver", decodeURIComponent(domain)); }); } function initRouter_CleanYuba() { let domain = getStrMiddle(window.location.href, "domain=", "&"); cleanCookie(() => { window.parent.postMessage("yubaCleanOver", decodeURIComponent(domain)); }); } function initRouter_CleanVideo() { let domain = getStrMiddle(window.location.href, "domain=", "&"); cleanCookie(() => { window.parent.postMessage("videoCleanOver", decodeURIComponent(domain)); }); } function initRouter_CleanCz() { let domain = getStrMiddle(window.location.href, "domain=", "&"); cleanCookie(() => { window.parent.postMessage("czCleanOver", decodeURIComponent(domain)); }); } function initRouter_Video() { if (unsafeWindow.$DATA && "ROOM" in unsafeWindow.$DATA) { // 在视频观看页面 initStyles(); initPkg_VideoTime(); initPkg_VideoTools_Camera_Video(); initPkg_DyVideoDownload(); initPkg_DyVideoBarrageLine(); } } function initRouter_FansBadgeList() { initPkg_FansBadgeList(); } (async function() { initRouter(window.location.href); })();