// ==UserScript==
// @name H2P: 斗鱼B站小工具
// @name:en Tools for Douyu/Bilibili written by H2P
// @name:zh H2P: 斗鱼B站小工具
// @namespace http://tampermonkey.net/
// @version 1.7.0
// @icon http://www.douyutv.com/favicon.ico
// @description 斗鱼:抽奖弹幕、关键词回复、抄袭弹幕、循环弹幕 ________ 黑暗模式(夜间模式)、清爽模式 ________ 直播时长、真实人数、批量取关、自动签到、领取鱼塘、默认最低(高)画质、禁止滚动弹幕、自动静音、自动给有牌子的主播赠送一根荧光棒 ________ 开启快捷键。B 站:黑暗模式(夜间模式)。
// @description:en Douyu : lottery draw, keyword reply, copy barrage, loop barrage ________ dark mode (night mode), clear mdoe ________ batch cancellation of barrage, automatically check in, receive fishpond, default min(max) image quality, ban scrolling barrage, automatically mute, automatically present a fluorescent rod to anthor following ________ shortcut. Bilibili : black mode (night mode).
// @description:zh 斗鱼:抽奖弹幕、关键词回复、抄袭弹幕、循环弹幕 ________ 黑暗模式(夜间模式)、清爽模式 ________ 直播时长、真实人数、批量取关、自动签到、领取鱼塘、默认最低(高)画质、禁止滚动弹幕、自动静音、自动给有牌子的主播赠送一根荧光棒 ________ 开启快捷键。B 站:黑暗模式(夜间模式)。
// @author H2P
// @compatible chrome
// @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 https://www.douyu.com/directory/myFollow
// @match *://*.bilibili.com/*
// @note 2019.03.18-V0.2.00 循环弹幕可以设置多条,随机发送;新增弹幕倒计时;界面美化一下?抽奖弹幕新增一种查询类型
// @note 2019.03.18-V0.3.00 界面修改;界面可隐藏;可以设置是否发送默认弹幕
// @note 2019.03.18-V0.3.01 小 BUG 修复
// @note 2019.03.19-V0.4.00 引入 JQuery 改写,还没改完;更新了弹幕抽奖元素获取(因为斗鱼改了);增加设置抽奖弹幕次数;发送弹幕时可以修改循环弹幕
// @note 2019.03.23-V0.4.01 完善了一下代码;完善了界面;修改了字体
// @note 2019.03.23-V0.5.00 添加了斗鱼清爽模式 : 隐藏部分、隐藏全部、删除元素
// @note 2019.03.23-V0.5.01 修缮清爽模式;添加自动领取观看鱼丸(不是鱼秀宝箱)
// @note 2019.03.24-V0.5.02 修缮自动领取观看鱼丸;修缮隐藏全部元素的返回按钮
// @note 2019.03.24-V0.5.03 修改介绍。。。
// @note 2019.03.26-V0.5.04 修缮自动领取观看鱼丸,如果无法领取则清除循环
// @note 2019.03.28-V0.5.05 解决 jQuery $ 冲突;清爽模式处理粉丝节
// @note 2019.03.31-V0.6.00 添加“功能自动化”设置面板
// @note 2019.03.31-V0.6.01 修改介绍
// @note 2019.04.02-V0.6.02 代码重写
// @note 2019.04.04-V0.6.03 添加抄袭弹幕;完善设置信息存储
// @note 2019.05.25-V0.6.04 完善清爽模式退出
// @note 2019.06.11-V0.6.05 更新斗鱼领取宝箱
// @note 2019.07.04-V0.7.00 聚合脚本图标;删去抽奖弹幕
// @note 2019.07.05-V0.7.01 添加抽奖弹幕;发送时间设定改为间隔时间,单位改为毫秒;修改循环弹幕会自动保存
// @note 2019.07.06-V0.7.02 小小修缮
// @note 2019.07.06-V0.7.03 发送弹幕时间在间隔内随机
// @note 2019.07.06-V0.7.04 更新介绍(我觉得我输在介绍不够长、不够骚)
// @note 2019.07.06-V0.7.05 自动领鱼丸更新;抽奖弹幕更新(感谢 beacoolguy 的反馈)
// @note 2019.07.06-V0.7.06 自动点击抽奖弹幕“一键参与”(仅限发弹幕抽奖);清爽模式屏蔽贵族弹幕
// @note 2019.07.09-V0.7.07 抽奖弹幕“一键参与”(仅限条件 : 发弹幕和关注主播);样式修改;新功能(关键词自动回复展望)
// @note 2019.07.09-V0.7.08 清爽模式针对“topic”直播间和大屏幕优化
// @note 2019.07.11-V0.7.09 添加关键词回复(目前只能设置关键词和回复,无法使用)
// @note 2019.07.14-V0.8.00 关键词回复可以使用啦!!!(最多五条关键词)
// @note 2019.07.22-V0.8.01 修复关键词回复
// @note 2019.08.02-V0.8.02 弹幕抽奖增加拥有粉丝牌的抽奖条件
// @note 2019.08.12-V0.8.03 弹幕抽奖完善拥有粉丝牌的抽奖条件;部分清爽模式修改
// @note 2019.08.13-V0.8.04 清爽模式部分隐藏修缮
// @note 2019.08.16-V0.8.05 清爽模式修缮
// @note 2019.08.17-V0.8.06 清爽模式部分隐藏修缮
// @note 2019.08.26-V0.8.07 清爽模式添加宽屏模式;ESC 快捷退出清爽模式
// @note 2019.08.26-V0.8.08 清爽模式位置更换
// @note 2019.09.05-V0.8.09 修缮关键词回复对于有粉丝牌无效的问题
// @note 2019.09.08-V0.9.00 关键词回复可以添加和删除;新一轮抽奖开启后清除上一轮抽奖弹幕内容
// @note 2019.09.10-V0.9.01 解决初始化失败的问题
// @note 2019.09.10-V0.9.02 解决关键词回复自己弹幕的问题
// @note 2019.09.10-V0.9.03 解决初始化失败的问题
// @note 2019.09.12-V0.9.04 在主播公司旁显示直播时长
// @note 2019.09.14-V1.0.00 Vue 重写自动发送弹幕和自动化配置界面;取消默认弹幕,抄袭弹幕增加抄袭间隔;取消显示直播时长
// @note 2019.09.14-V1.0.01 更新介绍
// @note 2019.09.14-V1.0.02 修复弹幕抽奖不工作;添加删除无关元素
// @note 2019.09.14-V1.0.03 修复弹幕抽奖不工作;Vue 重写清爽模式
// @note 2019.09.14-V1.0.04 修复关键词回复无法自动配置的问题;添加保留词 {showT} 用于替换主播直播时长
// @note 2019.09.15-V1.0.05 将主播直播时长保存在本地;修复 {showT} 替换失败问题
// @note 2019.09.15-V1.0.06 修复抽奖弹幕赠送 666 的问题
// @note 2019.09.16-V1.0.07 设置抄袭弹幕和循环弹幕优先级相同
// @note 2019.09.16-V1.0.08 解决 topic 房间 id 获取失败的问题
// @note 2019.09.24-V1.0.09 清除分区冠军赛;自动最低(高)画质
// @note 2019.09.24-V1.1.00 自动参与火力全开;解决自动签到、领取鱼丸一直检测的问题
// @note 2019.09.25-V1.1.01 更新自动领取鱼丸;解决处于发送等待期尝试发送弹幕的问题;领取鱼丸发送弹幕任务无法完成
// @note 2019.09.25-V1.1.02 添加在电脑面前检测
// @note 2019.09.28-V1.1.03 修复删除元素后宽屏导致礼物栏显示空白的问题
// @note 2019.10.06-V1.1.04 清爽模式增加单独处理弹幕栏;清爽信息栏还未实现
// @note 2019.10.07-V1.1.05 优化清爽模式;全屏模式、网页全屏已失效
// @note 2019.10.07-V1.1.06 解决宽屏模式白屏的问题;添加清爽模式功能;全屏模式、网页全屏在 Mac Chrome 会失效
// @note 2019.10.08-V1.1.07 优化清爽模式按键;新增删除元素解决内存溢出
// @note 2019.10.08-V1.1.08 修改介绍
// @note 2019.10.13-V1.1.09 普通直播间关灯模式优化;topic 房间清爽模式播放器和删除元素优化
// @note 2019.10.14-V1.1.10 优化 topic 房间和大屏关灯模式
// @note 2019.10.14-V1.2.01 优化脚本界面;添加脚本清爽,页面加载时即可清爽
// @note 2019.10.14-V1.2.02 修改介绍
// @note 2019.10.15-V1.2.03 修复设置版面清爽模式启动后无限触发的问题;修复脚本清爽无法启动的问题
// @note 2019.10.15-V1.2.04 优化关灯模式;针对有背景直播间优化;静音、关闭弹幕自动化
// @note 2019.10.16-V1.2.05 修改介绍
// @note 2019.10.16-V1.2.06 更新快捷键(Shift + a : 打开发送弹幕界面;Shift + s : 打开清爽模式界面;Shift + d : 打开自动设置界面)
// @note 2019.10.17-V1.2.07 修改按钮配色
// @note 2019.10.19-V1.3.01 弹幕栏清爽后显示直播间热度和直播时长;优化脚本清爽(针对有背景图片的直播间)
// @note 2019.10.19-V1.3.02 脚本清爽普通直播间白屏问题
// @note 2019.10.19-V1.3.03 脚本清爽有背景的普通直播间白屏问题;完善主播直播时间获取;弹幕栏清爽(去除标签)
// @note 2019.10.19-V1.3.04 完善弹幕栏清爽(去除背景颜色)
// @note 2019.10.20-V1.3.05 解决脚本清爽启动消除弹幕栏清爽的 BUG
// @note 2019.10.24-V1.3.06 增加显示真实人数
// @note 2019.10.24-V1.3.07 增加显示真实人数
// @note 2019.10.24-V1.3.08 修复真实人数 BUG
// @note 2019.11.11-V1.3.09 弹幕抽奖更新;真实人数更新
// @note 2019.11.13-V1.3.10 签到后关闭弹出的框;宽屏模式显示竞猜
// @note 2019.11.15-V1.3.11 修复抽奖弹幕会复制“复制”两个字的问题
// @note 2019.11.17-V1.3.12 清爽模式和宽屏模式优化
// @note 2019.11.24-V1.3.13 关灯模式优化
// @note 2019.12.10-V1.4.01 批量取关
// @note 2019.12.29-V1.4.02 清爽模式自定义;快捷键清除弹幕(Shift + c);清爽模式快捷键(Shift + u/i/o/p);礼物栏清爽优化
// @note 2020.04.16-V1.4.03 清爽模式信息栏、弹幕栏、播放器更新(有背景的直播间播放器还未更新)
// @note 2020.04.16-V1.4.04 清爽模式信息栏优化
// @note 2020.04.26-V1.4.05 代码修改
// @note 2020.04.27-V1.4.06 自动给有牌子的主播赠送一根荧光棒
// @note 2020.04.28-V1.4.07 发送弹幕部分使用原生 JS 重写
// @note 2020.04.29-V1.4.08 弹幕栏清爽模式优化
// @note 2020.04.29-V1.4.09 关灯模式改为黑暗模式
// @note 2020.04.29-V1.4.10 黑暗模式需要手动开启
// @note 2020.04.30-V1.5.01 黑暗模式优化,且可以自动开启
// @note 2020.04.30-V1.5.02 网页打开就是黑暗模式,无需加载原来的样式
// @note 2020.04.30-V1.5.03 黑暗模式优化
// @note 2020.04.30-V1.5.04 黑暗模式优化
// @note 2020.04.30-V1.5.05 脚本清爽礼物栏优化
// @note 2020.04.30-V1.5.06 修复关键词回复 BUG
// @note 2020.04.30-V1.5.07 修复抽奖弹幕 BUG
// @note 2020.05.05-V1.5.08 清爽模式优化,页面加载过程中即可隐藏元素
// @note 2020.05.05-V1.5.09 清爽模式优化
// @note 2020.05.07-V1.6.00 代码重写完毕,不依赖于 jQuery 和 Vue
// @note 2020.05.07-V1.6.01 修复抽奖弹幕提取失败的问题
// @note 2020.05.07-V1.6.02 针对 topic 房间优化清爽模式和黑暗模式
// @note 2020.05.07-V1.6.03 黑暗模式按钮修改到右上角,并且关注列表也有黑暗模式
// @note 2020.05.07-V1.6.04 修复自动静音 BUG
// @note 2020.05.07-V1.6.05 领取鱼塘优化
// @note 2020.05.07-V1.6.06 解决关键词回复会回复同一个弹幕的问题
// @note 2020.05.08-V1.7.00 B 站首页和 video 黑暗模式
// @downloadURL none
// ==/UserScript==
(() => {
'use strict';
const $H2P = function (xpath, one = true) {
if (one) { return document.querySelector(xpath); }
else { return Array.from(document.querySelectorAll(xpath)); }
}
const isDouyu = window.location.href.startsWith('https://www.douyu.com/');
const isTopic = window.location.href.startsWith('https://www.douyu.com/topic/');
const isFollowList = window.location.href.startsWith('https://www.douyu.com/directory/myFollow');
const isBilibili = window.location.href.startsWith('https://www.bilibili.com/');
const isBilibiliHome = window.location.href === 'https://www.bilibili.com' || window.location.href.startsWith('https://www.bilibili.com/?');
const isBilibiliVideo = window.location.href.startsWith('https://www.bilibili.com/video/');
localStorage.removeItem('h2p-DYScript-configPre');
localStorage.removeItem('h2p-DYScript-config');
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
//
// 黑暗模式
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
const LSClear = 'h2p-DY-config-clear';
let config_clear_pre = {
isClearNav : false,
isClearInfo : false,
isClearAside: false,
isClearGift : false,
isClearBar : false,
isClearPlay : false,
blackMode : false,
clearMode : false,
delEle : false,
wideMode : false,
fullMode : false,
};
let config_clear = {};
Object.assign(config_clear, config_clear_pre);
let config_clear_tmp = JSON.parse(localStorage.getItem(LSClear)) || {};
Object.assign(config_clear, config_clear_tmp);
for (let key in config_clear) { if (!(key in config_clear_pre)) { delete config_clear[key]; } }
localStorage.removeItem(LSClear);
localStorage.setItem(LSClear, JSON.stringify(config_clear));
if (config_clear.blackMode) { blackMode(); }
const whiteBase64s = {
douyu: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTg4ODU0ODgyOTUxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxMzYiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTEyIDc2OEMzNzAuNzczMzMzIDc2OCAyNTYgNjUzLjIyNjY2NyAyNTYgNTEyIDI1NiAzNzAuNzczMzMzIDM3MC43NzMzMzMgMjU2IDUxMiAyNTYgNjUzLjIyNjY2NyAyNTYgNzY4IDM3MC43NzMzMzMgNzY4IDUxMiA3NjggNjUzLjIyNjY2NyA2NTMuMjI2NjY3IDc2OCA1MTIgNzY4TTg1My4zMzMzMzMgNjUzLjIyNjY2NyA5OTQuNTYgNTEyIDg1My4zMzMzMzMgMzcwLjc3MzMzMyA4NTMuMzMzMzMzIDE3MC42NjY2NjcgNjUzLjIyNjY2NyAxNzAuNjY2NjY3IDUxMiAyOS40NCAzNzAuNzczMzMzIDE3MC42NjY2NjcgMTcwLjY2NjY2NyAxNzAuNjY2NjY3IDE3MC42NjY2NjcgMzcwLjc3MzMzMyAyOS40NCA1MTIgMTcwLjY2NjY2NyA2NTMuMjI2NjY3IDE3MC42NjY2NjcgODUzLjMzMzMzMyAzNzAuNzczMzMzIDg1My4zMzMzMzMgNTEyIDk5NC41NiA2NTMuMjI2NjY3IDg1My4zMzMzMzMgODUzLjMzMzMzMyA4NTMuMzMzMzMzIDg1My4zMzMzMzMgNjUzLjIyNjY2N1oiIHAtaWQ9IjIxMzciIGZpbGw9IiNhN2E3YTciPjwvcGF0aD48L3N2Zz4=',
bilibili: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTg4OTA0NDY4Njk1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxMTkiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNODUzLjMzMzMzMyA2NTMuNDRMOTk0Ljc3MzMzMyA1MTIgODUzLjMzMzMzMyAzNzAuNTZWMTcwLjY2NjY2N2gtMTk5Ljg5MzMzM0w1MTIgMjkuMjI2NjY3IDM3MC41NiAxNzAuNjY2NjY3SDE3MC42NjY2Njd2MTk5Ljg5MzMzM0wyOS4yMjY2NjcgNTEyIDE3MC42NjY2NjcgNjUzLjQ0Vjg1My4zMzMzMzNoMTk5Ljg5MzMzM0w1MTIgOTk0Ljc3MzMzMyA2NTMuNDQgODUzLjMzMzMzM0g4NTMuMzMzMzMzdi0xOTkuODkzMzMzek01MTIgNzY4Yy0xNDEuNDQgMC0yNTYtMTE0LjU2LTI1Ni0yNTZzMTE0LjU2LTI1NiAyNTYtMjU2IDI1NiAxMTQuNTYgMjU2IDI1Ni0xMTQuNTYgMjU2LTI1NiAyNTZ6IiBwLWlkPSIyMTIwIiBmaWxsPSIjZmZmZmZmIj48L3BhdGg+PC9zdmc+',
bilibiliVideo: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTg4OTA0NDY4Njk1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxMTkiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNODUzLjMzMzMzMyA2NTMuNDRMOTk0Ljc3MzMzMyA1MTIgODUzLjMzMzMzMyAzNzAuNTZWMTcwLjY2NjY2N2gtMTk5Ljg5MzMzM0w1MTIgMjkuMjI2NjY3IDM3MC41NiAxNzAuNjY2NjY3SDE3MC42NjY2Njd2MTk5Ljg5MzMzM0wyOS4yMjY2NjcgNTEyIDE3MC42NjY2NjcgNjUzLjQ0Vjg1My4zMzMzMzNoMTk5Ljg5MzMzM0w1MTIgOTk0Ljc3MzMzMyA2NTMuNDQgODUzLjMzMzMzM0g4NTMuMzMzMzMzdi0xOTkuODkzMzMzek01MTIgNzY4Yy0xNDEuNDQgMC0yNTYtMTE0LjU2LTI1Ni0yNTZzMTE0LjU2LTI1NiAyNTYtMjU2IDI1NiAxMTQuNTYgMjU2IDI1Ni0xMTQuNTYgMjU2LTI1NiAyNTZ6IiBwLWlkPSIyMTIwIiBmaWxsPSIjMjEyMTIxIj48L3BhdGg+PC9zdmc+',
};
const blackBase64 = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTg4ODU0MzQ2ODgzIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxMjciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTEyIDc2OHExMDUuOTg0IDAgMTgwLjk5Mi03NS4wMDh0NzUuMDA4LTE4MC45OTItNzUuMDA4LTE4MC45OTItMTgwLjk5Mi03NS4wMDhxLTUyLjAxMDY2NyAwLTEwNS45ODQgMjQuMDIxMzMzIDY2LjAwNTMzMyAyOS45OTQ2NjcgMTA3LjAwOCA5My4wMTMzMzN0NDEuMDAyNjY3IDEzOS4wMDgtNDEuMDAyNjY3IDEzOS4wMDgtMTA3LjAwOCA5My4wMTMzMzNxNTQuMDE2IDI0LjAyMTMzMyAxMDUuOTg0IDI0LjAyMTMzM3pNODU0LjAxNiAzNzAuMDA1MzMzbDEzOS45ODkzMzMgMTQxLjk5NDY2Ny0xMzkuOTg5MzMzIDE0MS45OTQ2NjcgMCAyMDAuMDIxMzMzLTIwMC4wMjEzMzMgMC0xNDEuOTk0NjY3IDEzOS45ODkzMzMtMTQxLjk5NDY2Ny0xMzkuOTg5MzMzLTIwMC4wMjEzMzMgMCAwLTIwMC4wMjEzMzMtMTM5Ljk4OTMzMy0xNDEuOTk0NjY3IDEzOS45ODkzMzMtMTQxLjk5NDY2NyAwLTIwMC4wMjEzMzMgMjAwLjAyMTMzMyAwIDE0MS45OTQ2NjctMTM5Ljk4OTMzMyAxNDEuOTk0NjY3IDEzOS45ODkzMzMgMjAwLjAyMTMzMyAwIDAgMjAwLjAyMTMzM3oiIHAtaWQ9IjIxMjgiIGZpbGw9IiNhN2E3YTciPjwvcGF0aD48L3N2Zz4=';
const whiteBase64 = isDouyu ? whiteBase64s.douyu : (isBilibili ? (isBilibiliHome ? whiteBase64s.bilibili : whiteBase64s.bilibiliVideo) : '');
new Promise((resolve, reject) => {
let eleStyle = document.createElement('style');
eleStyle.innerHTML = `
#h2p-img-blackMode { cursor: pointer; }
`;
if (isDouyu) {}
else if (isBilibili) {
eleStyle.innerHTML += `
ul.nav-link-ul > li:last-child > span { display: none!important; }
`;
}
document.head.appendChild(eleStyle);
let div = document.createElement('div');
if (isDouyu) {
div.style = 'position: relative; float: left; width: 30px; height: 30px; margin: 15px -20px 15px 20px;';
div.innerHTML = `
`;
}
else if (isBilibili) {
div.style = 'display: flex; justify-content: center;';
div.innerHTML = `
`;
}
let setINVL_wait_div_header = setInterval(() => {
if ($H2P('img#h2p-img-blackMode')) {
window.clearInterval(setINVL_wait_div_header);
setINVL_wait_div_header = null;
return;
}
if (isDouyu && $H2P('div.Header-right')) {
window.clearInterval(setINVL_wait_div_header);
setINVL_wait_div_header = null;
$H2P('div.Header-right').appendChild(div);
resolve();
} else if (isBilibili && $H2P('ul.nav-link-ul > li:nth-child(8)')) {
window.clearInterval(setINVL_wait_div_header);
setINVL_wait_div_header = null;
$H2P('ul.nav-link-ul > li:nth-child(8)').appendChild(div);
resolve();
}
}, 500);
})
.then(() => {
let eleBM = $H2P('img#h2p-img-blackMode');
eleBM.addEventListener('click', () => {
config_clear.blackMode = !config_clear.blackMode;
localStorage.setItem(LSClear, JSON.stringify(config_clear));
eleBM.src = config_clear.blackMode ? blackBase64 : whiteBase64;
blackMode();
})
});
function blackMode () {
console.log(`${config_clear.blackMode ? '启动' : '关闭'} : 黑暗模式`);
if (config_clear.blackMode) {
if ($H2P('style#h2p-style-blackMode')) { return; }
let eleStyle = document.createElement('style');
eleStyle.id = 'h2p-style-blackMode';
if (isDouyu) {
eleStyle.innerHTML = `
body, div.Header-wrap, main.layout-Main, div.FishpondTreasure-v4-area { background-color: #2d2e37; }
`;
// header 左边
eleStyle.innerHTML += `
div.Header-wrap { border-bottom-color: #2d2e37; }
#js-header div.HeaderNav a.EntryNav-desc, #js-header ul.Header-menu > li a,
svg.Header-icon use { color: #a7a7a7!important; }
`;
// header 右边
eleStyle.innerHTML += `
#js-header div.Header-right div.Search { background-color: #444455; border: 1px solid #444455; }
#js-header div.Header-right div.Search svg.Header-icon,
#js-header div.Header-right a.public-DropMenu-link { color: #a7a7a7; }
`;
// 主播信息
eleStyle.innerHTML += `
div#js-player-title { background-color: #2d2e37; border-color: #444455; border-bottom-color: #2d2e37; }
div.Title-roomInfo div.Title-row h3.Title-header, div.Title-roomInfo div.Title-row h2.Title-anchorNameH2,
div.Title-roomInfo div.Title-row a.Title-anchorHot div.Title-anchorText, div.Title-roomInfo div.Title-anchorLocation span,
div.Title-roomInfo div.Title-sharkWeight span, div.Title-roomInfo div.Title-row div.Title-blockInline span { color: #a7a7a7; }
`;
// 礼物栏
eleStyle.innerHTML += `
div#js-player-toolbar { background-color: #2d2e37; border-color: #444455; }
div#js-player-toolbar div.PlayerToolbar-ywInfo span,
div#js-player-toolbar div.PlayerToolbar-ycInfo span { color: #a7a7a7; }
div#js-player-toolbar div.PlayerToolbar-Content:nth-child(2) div.PlayerToolbar-ContentCell:nth-child(1) { visibility: hidden; }
`;
// 弹幕栏
eleStyle.innerHTML += `
div#js-player-asideMain { background-color: #2d2e37; border-color: #444455; }
`;
// 弹幕栏 - 公告
eleStyle.innerHTML += `
div.layout-Player-announce { background-color: #2d2e37; border-bottom-color: #444455; }
div.layout-Player-rank ul.ChatTabContainer-titleWraper--tabTitle li { background-color: #2d2e37; border-color: #2d2e37; }
`;
// 弹幕栏 - 周榜
eleStyle.innerHTML += `div.ChatRankWeek-headerContent { background-color: #2d2e37; }`;
// 弹幕栏 - 贵宾
eleStyle.innerHTML += `div.NobleRank, div.NobleRankTips { background-color: #2d2e37; }`;
// 弹幕栏 - 粉丝团
eleStyle.innerHTML += `
div.FansRankInfo, div.ChatTabContainer { background-color: #2d2e37; }
div.FansRankInfo span { color: #a7a7a7; }
`;
// 弹幕栏 - 主体
eleStyle.innerHTML += `
div#js-player-barrage, div.Barrage-main { background-color: #2d2e37; }
span.Barrage-content { color: #a7a7a7; }
div.Barrage { border-color: #444455; }
`;
// 弹幕栏 - 聊天框
eleStyle.innerHTML += `
div.layout-Player-chat { background-color: #2d2e37; }
div.layout-Player-chat textarea.ChatSend-txt { background-color: #2d2e37; color: #a7a7a7!important; }
`;
// 弹幕栏脚本面板
eleStyle.innerHTML += `
div#h2p-div-clear-anchorHot { background-color: #2d2e37; border-bottom: 1px solid #2d2e37}
div#h2p-div-clear-anchorHot div.Title-anchorText,
div#h2p-div-clear-anchorHot div.Title-blockInline:nth-child(2) span.Title-row-icon,
div#h2p-div-clear-anchorHot div.Title-blockInline:nth-child(2) i.Title-row-text { color: #a7a7a7; }
`;
// 互动预言
eleStyle.innerHTML += `
div#guess-main-panel { background: #2d2e37; border-color: #444455; }
div.GuessMainPanelHeader-panelLeft span.GuessMainPanelHeader-slogon { color: #a7a7a7; }
div.GuessGameBox, div.GuessReturnYwFdSlider-numIptWrap { background: #2d2e37; border-color: #444445; }
div.GuessGameBox-header div.boxLeft, div.GuessReturnYwFdSlider-giftName { color: #a7a7a7; }
div.GuessRankPanel-rank { border-color: #444445; }
div.GuessReturnYwFdSlider-numIptWrap, div.GuessRankPanel
input.GuessReturnYwFdSlider-numIpt { background-color: #444455; border-color: #444455; color: #a7a7a7; }
a.GuessGuideList-itemBox { background-color: #444455; }
h2.guessGame--ell { color: #a7a7a7; }
`;
// 友邻
eleStyle.innerHTML += `
div#js-bottom-right { background-color: #2d2e37; }
div.AnchorFriendPane-title { border-bottom-color: #444455!important }
div.AnchorFriendPane-title h3 { color: #a7a7a7!important; }
div.AnchorLike-ItemBox { border-color: #444455; }
div.AnchorFriend-footer { border-top-color: #444455; }
div.AnchorFriend-footer a { background-color: #2d2e37; color: #a7a7a7; }
div.GuessReturnYwFdSlider { background-color: #2d2e37; border-color: #2d2e37;}
`;
if (isFollowList) {
eleStyle.innerHTML += `
div.layout-Module-head.ScrollTabFrame-head { background-color: #2d2e37; color: #a7a7a7; }
div.layout-Cover-card { background-color: #2d2e37; }
`;
}
if (isTopic) {
eleStyle.innerHTML += `
div.wm-general div.wm-general-bgblur, div.wm-general div.wm-general-wrapper { background: #2d2e37!important; }
`;
}
} else if (isBilibili) {
if (isBilibiliHome) {
// 导航栏
eleStyle.innerHTML += `
#internationalHeader, #internationalHeader > div.mini-header { background: #2d2e37; }
`;
// 导航栏左边
eleStyle.innerHTML += `
.nav-link .nav-link-ul .nav-link-item .link { color: #a7a7a7; }
`;
// 导航栏右边
eleStyle.innerHTML += `
.nav-user-center .user-con .item .name { color: #a7a7a7; }
`;
// 导航栏下边
eleStyle.innerHTML += `
.page-tab .con li { border: 1px solid transparent; }
.international-header a { color: #a7a7a7; }
.tab-line-itnl { border-color: #a7a7a7; }
`;
// 主体部分
eleStyle.innerHTML += `
a { color: #a7a7a7; }
div.international-home { background-color: #2d2e37; }
.contact-help { box-shadow: none; }
`;
// 主体部分 - 推广
eleStyle.innerHTML += `
.storey-title .no-link, .storey-title .text-info a,
.video-card-common .ex-title { color: #a7a7a7; }
`;
// 主体部分 - 正在直播
eleStyle.innerHTML += `
.storey-title .name, .storey-title .text-info,
.live-card .up .txt .name, .live-card .up .txt .desc,
.exchange-btn .btn { color: #a7a7a7; }
`;
// 主体部分 - 动画
eleStyle.innerHTML += `
.rank-header .name, .live-tabs .tab-switch,
.rank-header .more { color: #a7a7a7; }
`;
// 主体部分 - 番剧
eleStyle.innerHTML += `
.time-line .tab-switch .tab-switch-item,
.special-recommend header { color: #a7a7a7; }
`;
// 主体部分 - 漫画
eleStyle.innerHTML += `
.time-line .tab-switch .tab-switch-item,
.manga-panel .tab-switch .tab-switch-item, .manga-panel .app-download-link,
.special-recommend header, .manga-rank .tab-switch .tab-switch-item,
.manga-panel .manga-list-box .manga-card .manga-title { color: #a7a7a7; }
`;
}
else if (isBilibiliVideo) {
// 导航栏
eleStyle.innerHTML += `
body { background-color: #2d2e37; }
`;
// 导航栏
eleStyle.innerHTML += `
#internationalHeader > div.mini-header { background-color: #2d2e37; }
.international-header .mini-type .nav-link .nav-link-ul .nav-link-item .link,
.mini-type .nav-user-center .user-con .item .name,
.video-toolbar .ops > span, .video-toolbar .appeal-text,
.international-header .nav-search .nav-search-keyword,
.bilibili-search-history .history-item a { color: #a7a7a7; }
.international-header .mini-type .nav-search #nav_searchform,
.bilibili-search-history { background: #444445; border-color: #444445; color: #a7a7a7; }
`;
// 信息栏
eleStyle.innerHTML += `
.video-info .video-title .tit { color: #a7a7a7; }
`;
// 播放器
eleStyle.innerHTML += `
#bilibiliPlayer { box-shadow: none; }
.bilibili-player-video-sendbar { background-color: #444445; }
.video-desc .info, .bilibili-player-video-info, .bilibili-player * { color: #a7a7a7; }
.video-toolbar, .v-wrap .s_tag { border-bottom-color: #444445; }
.bilibili-player-video-sendbar .bilibili-player-video-inputbar .bilibili-player-video-inputbar-wrap { background-color: #2d2e37; border-color: #2d2e37; }
.s_tag .tag-area > li { background-color: #444445; border-color: #444445; }
.bilibili-player-video-sendbar .bilibili-player-video-inputbar .bilibili-player-video-danmaku-input,
.s_tag .tag-area>li>a { color: #a7a7a7; }
`;
// 相关推荐
eleStyle.innerHTML += `
.bui-collapse .bui-collapse-wrap, .bui-collapse .bui-collapse-header,
.player-auxiliary-area .player-auxiliary-filter { background-color: #444445; }
.up-info .u-info .name .message,
.player-auxiliary-area .player-auxiliary-filter-title,
.bui-collapse .bui-collapse-header .bui-collapse-arrow,
.recommend-list .rec-title, .video-page-card .card-box .info .title { color: #a7a7a7; }
`;
// 评论
eleStyle.innerHTML += `
.bb-comment .comment-send .textarea-container textarea { background-color: #444445!important; border-color: #444445!important; }
.bb-comment { background: #2d2e37!important; }
.comment-m .b-head, .bb-comment .comment-header .tabs-order li,
.paging-box, .paging-box .tcd-number, .bb-comment * { color: #a7a7a7!important; }
.bb-comment .comment-list .list-item .con { border-top-color: #444445!important; }
.bb-comment .comment-send .comment-submit { color: #fff!important; }
`;
}
}
document.body.appendChild(eleStyle);
} else { $H2P('style#h2p-style-blackMode').remove(); }
}
if (isBilibili) { return; }
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
//
// 取消关注
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
if (isFollowList){
let anchorsSelected = [];
new Promise((resolve, reject) => {
let INVL_AddBtnCancelFollow = setInterval(() => {
if ($H2P('div#filter-tab-expandable-wrapper') && !$H2P('a#h2p-a-cancelFollow')) {
window.clearInterval(INVL_AddBtnCancelFollow);
INVL_AddBtnCancelFollow = null;
resolve();
}
}, 500);
})
.then(() => {
let a_cancelFollow = document.createElement('a');
a_cancelFollow.id = 'h2p-a-cancelFollow';
a_cancelFollow.className = 'layout-Module-label';
a_cancelFollow.innerHTML = `
取消关注
`;
$H2P('div#filter-tab-expandable-wrapper').appendChild(a_cancelFollow);
})
.then(() => {
$H2P('a#h2p-a-cancelFollow').addEventListener('click', () => {
let anchorSelected = $H2P('li.layout-Cover-item div.DyLiveCover-selectArea.is-active', false);
anchorSelected.forEach(anchor => {
let anchorHref = anchor.nextSibling.href;
if (!anchorHref || anchorHref.length == 0) {
anchorHref = anchor.parentNode.href;
}
let anchorId = anchorHref.split('/').pop();
anchorsSelected.push(anchorId);
});
console.log(anchorsSelected);
setTO_cancelFollow();
});
})
.catch(error => { console.log(error); })
function setTO_cancelFollow () {
if (anchorsSelected && anchorsSelected.length > 0) {
for (let i = 0; i < anchorsSelected.length; i++) {
let anchorId = anchorsSelected[i];
setTimeout(() => {
cancelFollow(anchorId);
}, (i + 1) * 1000);
}
}
}
function cancelFollow (anchorId) {
fetch(`https://www.douyu.com/room/follow/cancel_confuse/${anchorId}`, {
method: 'POST'
})
.then(res => res.json())
.then(res => {
if (res && 'error' in res && res.error === 0) {
console.log(`成功取消关注主播 : ${anchorId}`);
let parentEle = $H2P(`a[href="/${anchorId}"]`).parentNode;
// 从主播 id 找到主播信息所在 ele 的根节点
while (!parentEle.classList.contains('layout-Cover-item') && parentEle.tagName.toLowerCase() !== 'body') {
parentEle = parentEle.parentNode;
}
if (parentEle.classList.contains('layout-Cover-item') && parentEle.tagName.toLowerCase() !== 'body') {
parentEle.remove();
}
} else {
console.log(`取消关注主播 : ${anchorId} 失败`);
}
});
}
return;
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
//
// 全局变量
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
// 用户拥有牌子的主播信息
let roomOfAnchorFan = undefined;
let userInfo = {
nickName : '', // 昵称
isAnchorFan : false, // 是否拥有主播的粉丝牌
};
let roomInfo = {
id : '',
showT : 0,
online : 0,
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
//
// 主播信息获取
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
const LSInfo = 'h2p-DY-config-info';
let config_info = JSON.parse(localStorage.getItem(LSInfo)) || {
showTs: {},
};
// 获取 roomInfo.id
let regNums = /\d+/;
if (regNums.test($H2P('head > title').textContent)) {
roomInfo.id = regNums.exec($H2P('head > title').textContent)[0];
} else {
roomInfo.id = regNums.exec(window.location.href)[0];
}
// 获取在线人数
let urlId = isTopic ? window.location.href.split('=').pop() : window.location.pathname.split('/').pop();
fetch(`https://bojianger.com/data/api/common/search.do?keyword=${urlId}`)
.then(res => res.json())
.then(res => {
try {
if (res.data) {
if (res.data.online) { roomInfo.online = Number(res.data.online); }
else if (res.data.anchorVo) { roomInfo.online = Number(res.data.anchorVo.audience_count); }
} else {
let res = JSON.parse(JSON.stringify(res));
roomInfo.online = Number(res.split('online":')[1].split(',')[0]);
}
console.log(`Succeed getting online : ${roomInfo.online}.`);
} catch (error) {
console.log(error);
console.log('Fail to get online');
}
});
// 获取直播时间
let showTs = {};
if (Array.isArray(config_info.showTs)) {
config_info.showTs = {};
localStorage.setItem(LSInfo, JSON.stringify(config_info));
} else { showTs = config_info.showTs || {}; }
let [showT, getT] = [0, 0];
if (showTs[roomInfo.id]) {
showT = showTs[roomInfo.id].showT;
getT = showTs[roomInfo.id].getT;
}
// 获取时间 < 6h
if ((((new Date().getTime() / 1000) - getT) / 3600.0) < 6) {
roomInfo.showT = showT;
console.log(`Succeed getting anchor showTime : ${roomInfo.showT}.`);
} else {
fetch('https://www.douyu.com/betard/' + roomInfo.id)
.then(res => res.json())
.then(res => {
try {
if (res) {
if (res.cache_time) {
roomInfo.showT = Number.parseInt(res.cache_time);
} else {
let r = res.split('"cache_time":')[1];
let l = r.substr(0, r.indexOf(','));
roomInfo.showT = Number.parseInt(l);
}
config_info.showTs[roomInfo.id] = {
'showT' : roomInfo.showT,
"getT" : Number.parseInt(new Date().getTime() / 1000)
};
console.log(`Succeed getting anchor showTime : `);
console.log(config_info.showTs[roomInfo.id]);
localStorage.setItem(LSInfo, JSON.stringify(config_info));
} else { console.log('Fail to get anchor showTime.') }
} catch (error) {
console.log(error);
console.log('Fail to get anchor showTime.')
}
});
}
// 根据 cookie 获取用户昵称
let cookies = document.cookie.split(/;\s/g);
for (let i = 0; i < cookies.length; i++) {
let cookie = cookies[i];
let keyVal = cookie.split('=');
if (keyVal && keyVal.length == 2 && keyVal[0] == 'acf_nickname') {
userInfo.nickName = keyVal[1];
break;
}
}
// 自动获取已有徽章的主播
new Promise((resolve, reject) => {
let iframe = document.createElement('iframe');
iframe.id = 'h2p-fansBadgeList';
iframe.style = 'display: none;'
iframe.src = '/member/cp/getFansBadgeList';
document.body.appendChild(iframe);
setTimeout(resolve, 250);
})
.then(() => {
let iframe = $H2P('iframe#h2p-fansBadgeList');
iframe.addEventListener('load', () => {
// 获取有粉丝牌的主播房间号
roomOfAnchorFan = {};
let idoc = iframe.contentWindow.document;
let ele_anchors = Array.from(idoc.querySelectorAll('table.aui_room_table.fans-badge-list > tbody > tr'));
for ( let i = 0; i < ele_anchors.length; i++ ) {
let ele = ele_anchors[i];
let anchorURL = ele.querySelector('td:nth-child(2)').querySelector('a').getAttribute('href');
let anchorName = ele.querySelector('td:nth-child(2)').querySelector('a').textContent;
let anchorRoom = ele.getAttribute('data-fans-room');
let anchorUp = Number(ele.querySelector('td:nth-child(4)').querySelector('span').textContent);
roomOfAnchorFan[anchorRoom] = {anchorName, anchorURL, anchorUp};
}
console.log('有粉丝牌的主播房间号');
console.log(roomOfAnchorFan);
let anchorRoom= window.location.href.split('/').pop();
userInfo.isAnchorFan = anchorRoom in roomOfAnchorFan;
setTimeout(() => { $H2P('iframe#h2p-fansBadgeList').remove(); }, 2000)
});
})
.catch(error => console.log(error));
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
//
// 🐯和面板初始化
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
let viewShow_bar = false;
let viewShow_clear = false;
let viewShow_config = false;
let viewShow_script = false;
new Promise((resolve, reject) => {
// 创建元素样式
let eleStyle = document.createElement('style');
eleStyle.type = 'text/css';
eleStyle.innerHTML = `
#h2p-div-sign {
width : 18px;
height : 18px;
display : inline-block;
vertical-align : middle;
}
#h2p-div-sign span {
font-size : 18px;
cursor : pointer;
}
#div-DYScript input, #div-DYScript button, #div-DYScript select {
outline : none;
line-height : 10px;
}
#div-DYScript {
position : absolute;
bottom : 1px;
min-width : 335px;
max-width : 335px;
border : none;
margin : 0 0 0 -1px;
box-shadow : #c7c7c7 0 -5px 5px 0;
display : flex;
flex-flow : row wrap;
z-index : 999;
}
#div-DYScript .h2p-div-inlinepanel {
min-width : 315px;
max-width : 315px;
padding : 10px;
border-width : 0 0 1px 0;
font-family : WeibeiSC-Bold, STKaiti;
font-size : 16px;
background : #f5f5f5;
}
.h2p-flex-main-center {
height : 22px;
margin : 0 0 14px 0;
display : flex;
flex-flow : row wrap;
justify-content : center;
align-items : center;
}
.h2p-flex-main-start {
height : 22px;
margin : 0 0 15px 0;
display : flex;
flex-flow : row wrap;
justify-content : flex-start;
align-items : center;
}
.h2p-flex-main-end {
height : 22px;
margin : 0 0 15px 0;
display : flex;
flex-flow : row wrap;
justify-content : flex-end;
align-items : center;
}
.h2p-item-100p {
width : 100%;
}
.h2p-item-75p {
width : 75%;
}
.h2p-item-50p {
width : 50%;
}
.h2p-item-33p {
width : 33.33%;
}
.h2p-item-25p {
width : 25%;
}
#div-DYScript .h2p-div-inlinetab {
min-width : 335px;
max-width : 335px;
border-top : 1px solid #DCDCDC;
border-radius : 2px;
font-family : WeibeiSC-Bold, STKaiti;
font-size : 16px;
background : #f5f5f5;
display : flex;
flex-flow : row wrap;
}
#div-DYScript .h2p-div-layer {
position : relative;
width : 100%;
height : 24px;
}
#div-DYScript .h2p-div-layer-half {
position : absolute;
width : 50%;
height : 24px;
}
#div-DYScript .h2p-input-normal {
height : 22px;
padding : 0px 5px;
border : 1px solid #708090;
border-radius : 5px;
font-size : 13px;
}
#div-DYScript .h2p-input-disable {
background : #DCDCDC;
cursor : default;
}
#div-DYScript .h2p-input-able {
background : white;
cursor : text;
}
#div-DYScript .h2p-div-tab {
width : 33.3%;
max-height : 29px;
padding : 2px 0;
text-align : center;
}
#div-DYScript .h2p-div-tab:hover {
cursor : pointer;
background : #DDDDDD;
}
#div-DYScript .h2p-hover-pointer:hover {
cursor : pointer;
background : #DDDDDD;
}
.h2p-bg-close { background : #00ddbb }
.h2p-bg-close:hover{ background : #00ccaa }
.h2p-bg-open { background : #99aaff }
.h2p-bg-open:hover { background : #8899cc }
`;
document.head.appendChild(eleStyle);
// 弹幕框上的 🐯
let div_sign = document.createElement('div');
div_sign.id = 'h2p-div-sign';
div_sign.style = 'margin: -8px 0 0 -3px;';
div_sign.title = '斗鱼脚本';
div_sign.innerHTML = `🐯`;
// 整个面板 ===============================================================
let div_DYScript = document.createElement('div');
div_DYScript.id = 'div-DYScript';
div_DYScript.style = 'display: none;';
// 检查弹幕面板挂载点(斗鱼弹幕显示区域)是否加载完成
// 检查弹幕图标挂载点(斗鱼弹幕输入框)是否加载完成
let check_mountPoint_barPanel = setInterval(() => {
if ($H2P('div.layout-Player-asideMainTop') && $H2P('div.BarrageSuperLink') && $H2P('div.ChatToolBar')) {
window.clearInterval(check_mountPoint_barPanel);
check_mountPoint_barPanel = null;
setTimeout(() => {
$H2P('div.layout-Player-asideMainTop').appendChild(div_DYScript);
$H2P('div.ChatToolBar').appendChild(div_sign);
resolve();
}, 2000);
} else if (!window.location.href.includes('douyu')) {
window.clearInterval(check_mountPoint_barPanel);
check_mountPoint_barPanel = null;
document.body.appendChild(div_DYScript);
document.body.appendChild(div_sign);
resolve();
}
}, 1000);
})
.then(() => {
$H2P('span#h2p-span-DYScript').addEventListener('click', () => {
viewShow_script = !viewShow_script;
$H2P('div#div-DYScript').style.display = viewShow_script ? '' : 'none';
});
})
.then(() => {
let div_DYScriptTab = document.createElement('div');
div_DYScriptTab.id = 'div-DYScriptTab';
div_DYScriptTab.className = 'h2p-div-inlinetab';
div_DYScriptTab.style = 'order: 20;'
div_DYScriptTab.innerHTML = `