优化直播间体验:删除指定div,屏蔽礼物特效(兼容三种结构),切换最高画质
// ==UserScript==
// @name Douyin live stream optimization(优化网页)
// @namespace http://tampermonkey.net/
// @version 2.0
// @description 优化直播间体验:删除指定div,屏蔽礼物特效(兼容三种结构),切换最高画质
// @match https://*.douyin.com/*
// @run-at document-idle
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// 模拟点击函数,兼容 React/Vue
function simulateClick(el) {
if(!el) return;
el.scrollIntoView({behavior: 'smooth', block: 'center'});
['mousedown', 'mouseup', 'click'].forEach(type => {
const event = new MouseEvent(type, {view: window, bubbles: true, cancelable: true, composed: true});
el.dispatchEvent(event);
});
console.log('模拟点击元素:', el);
}
// 删除指定元素并按B键(延迟5秒)
function removeElementsAndPressB() {
let removed = false;
// 删除 class 元素
document.querySelectorAll('div.aqK_4_5U.R7IW3rpb').forEach(el => {
console.log('删除 class 元素:', el);
el.remove();
removed = true;
});
// 删除 BottomLayout
const bottomLayout = document.getElementById('BottomLayout');
if(bottomLayout){
console.log('删除 BottomLayout 元素:', bottomLayout);
bottomLayout.remove();
removed = true;
}
// 删除额外 class 元素
const extraEl = document.querySelector('div._D4WLewc.GDP2iTsQ');
if(extraEl){
console.log('删除额外元素:', extraEl);
extraEl.remove();
removed = true;
}
// 删除后延迟5秒按B键
if(removed){
setTimeout(() => {
console.log('触发键盘B');
const event = new KeyboardEvent('keydown', {key: 'b', code: 'KeyB', keyCode: 66, which: 66, bubbles: true, cancelable: true});
document.dispatchEvent(event);
}, 5000);
}
}
// 循环检测并屏蔽礼物特效(兼容三种结构)
function monitorGiftEffect() {
setInterval(() => {
const elements = Array.from(document.querySelectorAll(
'div.WoNKVQmY.Z20k_Nsy, div.OwaHUR7p.M3rvLCL0, div.PyUjXuWV.hRnC6O2k'
)).filter(div => div.textContent.includes('礼物特效'));
elements.forEach(el => {
const stateText = el.textContent.trim();
console.log('当前礼物特效状态:', stateText);
const switchBtn = el.parentElement?.querySelector('div[data-e2e="effect-switch"]');
if(switchBtn && stateText === '屏蔽礼物特效'){
simulateClick(switchBtn);
console.log('自动点击屏蔽礼物特效');
}
});
}, 1000);
}
// 循环切换到最高画质
function switchToHighestQualityLoop() {
const currentEl = document.querySelector('div[data-e2e="quality"]');
const selector = document.querySelector('div[data-e2e="quality-selector"]');
if(!currentEl || !selector) {
setTimeout(switchToHighestQualityLoop, 500);
return;
}
const currentQuality = currentEl.textContent.trim();
const priority = ['原画','超清','高清','标清','自动(标清)'];
const highest = priority[0];
if(currentQuality === highest){
console.log('已切换到最高画质:', currentQuality);
return;
}
const options = Array.from(selector.querySelectorAll('div.D7UhJyco'));
const target = options.find(el => el.textContent.trim() === highest);
if(target){
const clickable = target.closest('div.PAeJVT8Y');
if(clickable){
simulateClick(clickable);
console.log('正在切换到最高画质:', highest);
}
}
setTimeout(switchToHighestQualityLoop, 500);
}
// 主函数,每 3 秒轮询
function main() {
// 检测是否在直播间
const liveFlag = document.querySelector('div.CkKPEcld, div.ej6cQnWN');
if(!liveFlag){
//console.log('未检测到直播间标志元素,脚本跳过执行');
return; // 不在直播间,跳过
}
removeElementsAndPressB();
monitorGiftEffect();
switchToHighestQualityLoop();
}
// SPA URL 支持
let lastUrl = location.href;
setInterval(() => {
if(location.href !== lastUrl){
console.log('检测到 URL 改变:', location.href);
lastUrl = location.href;
main();
}
}, 500);
// 每 3 秒轮询 main
setInterval(main, 3000);
// MutationObserver 监听动态生成元素
const observer = new MutationObserver(() => {
removeElementsAndPressB();
});
observer.observe(document.body, {childList: true, subtree: true});
})();