返回列表 发布新帖

【油猴脚本】抖音网页直播间自动关闭送礼信息、福袋口令、屏蔽礼物特效

544 0
小K网牛逼 发表于 2 小时前 | 查看全部 阅读模式 <

马上注册,结交更多好友,享用更多功能,让你轻松玩转小K网。

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

×
原因
事情是这样的...抖音网页直播进入直播间后 送礼信息、福袋口令、礼物特效 都很影响观看直播效果,然后大佬出手搞定了它
废话不多说了 直接上代码 也有 @Zker(The-rapist) 大佬协助
效果预览图
进入直播间后会自动点击,然后关闭悬浮窗... 快去试试吧.
代码
  1. // ==UserScript==
  2. // @name         抖音直播自动设置
  3. // @namespace    https://live.douyin.com/660292215268
  4. // @version      1.0
  5. // @description  自动关闭送礼信息、福袋口令和礼物特效
  6. // @author       By Zker(The-rapist)、anwen
  7. // @match        *://*.douyin.com/*
  8. // @icon         https://lf3-static.bytednsdoc.com/obj/eden-cn/666eh7nuhfvhpebd/douyin_web/douyin_web/pwa_v3/512_512.png
  9. // @grant        none
  10. // ==/UserScript==
  11. (function() {
  12.     'use strict';
  13.     console.log('[抖音直播自动设置] 脚本已加载');
  14.     // 等待页面完全加载
  15.     function waitForPageLoad() {
  16.         return new Promise((resolve) => {
  17.             if (document.readyState === 'complete') {
  18.                 resolve();
  19.             } else {
  20.                 window.addEventListener('load', resolve);
  21.             }
  22.         });
  23.     }
  24.     // 等待元素出现
  25.     function waitForElement(selector, timeout = 120000) {
  26.         return new Promise((resolve, reject) => {
  27.             console.log(`[等待元素] 查找: ${selector}`);
  28.             const element = document.querySelector(selector);
  29.             if (element) {
  30.                 console.log(`[等待元素] 立即找到: ${selector}`);
  31.                 resolve(element);
  32.                 return;
  33.             }
  34.             const observer = new MutationObserver((mutations, obs) => {
  35.                 const element = document.querySelector(selector);
  36.                 if (element) {
  37.                     console.log(`[等待元素] 观察到: ${selector}`);
  38.                     obs.disconnect();
  39.                     resolve(element);
  40.                 }
  41.             });
  42.             observer.observe(document.body, {
  43.                 childList: true,
  44.                 subtree: true
  45.             });
  46.             setTimeout(() => {
  47.                 observer.disconnect();
  48.                 reject(new Error(`等待元素超时: ${selector}`));
  49.             }, timeout);
  50.         });
  51.     }
  52.     // 模拟 React 悬浮事件
  53.     function hoverReactElement(element) {
  54.         console.log('[悬浮元素]', element);
  55.         // 触发 React 能够监听的悬浮相关事件
  56.         const hoverEvents = [
  57.             'mouseenter',  // 鼠标进入元素
  58.             'mouseover',   // 鼠标移动到元素上(冒泡)
  59.             'mousemove'    // 鼠标在元素上移动
  60.         ];
  61.         hoverEvents.forEach(eventType => {
  62.             const event = new MouseEvent(eventType, {
  63.                 view: window,
  64.                 bubbles: true,
  65.                 cancelable: true,
  66.                 clientX: 0,
  67.                 clientY: 0,
  68.                 buttons: 0  // 没有按钮按下
  69.             });
  70.             element.dispatchEvent(event);
  71.         });
  72.         // 也触发 pointer 悬浮事件
  73.         const pointerHoverEvents = ['pointerenter', 'pointerover', 'pointermove'];
  74.         pointerHoverEvents.forEach(eventType => {
  75.             const event = new PointerEvent(eventType, {
  76.                 view: window,
  77.                 bubbles: true,
  78.                 cancelable: true,
  79.                 isPrimary: true,
  80.                 clientX: 0,
  81.                 clientY: 0,
  82.                 buttons: 0  // 没有按钮按下
  83.             });
  84.             element.dispatchEvent(event);
  85.         });
  86.     }
  87.     // 移除悬浮状态
  88.     function unhoverReactElement(element) {
  89.         console.log('[移除悬浮]', element);
  90.         // 触发鼠标离开事件
  91.         const leaveEvents = [
  92.             'mouseleave',  // 鼠标离开元素
  93.             'mouseout'     // 鼠标移出元素(冒泡)
  94.         ];
  95.         leaveEvents.forEach(eventType => {
  96.             const event = new MouseEvent(eventType, {
  97.                 view: window,
  98.                 bubbles: true,
  99.                 cancelable: true,
  100.                 clientX: 0,
  101.                 clientY: 0,
  102.                 buttons: 0
  103.             });
  104.             element.dispatchEvent(event);
  105.         });
  106.         // 也触发 pointer 离开事件
  107.         const pointerLeaveEvents = ['pointerleave', 'pointerout'];
  108.         pointerLeaveEvents.forEach(eventType => {
  109.             const event = new PointerEvent(eventType, {
  110.                 view: window,
  111.                 bubbles: true,
  112.                 cancelable: true,
  113.                 isPrimary: true,
  114.                 clientX: 0,
  115.                 clientY: 0,
  116.                 buttons: 0
  117.             });
  118.             element.dispatchEvent(event);
  119.         });
  120.     }
  121.     // 模拟 React 点击事件
  122.     function clickReactElement(element) {
  123.         console.log('[点击元素]', element);
  124.         // 触发多种事件以确保 React 能够捕获
  125.         const events = ['mousedown', 'mouseup', 'click'];
  126.         events.forEach(eventType => {
  127.             const event = new MouseEvent(eventType, {
  128.                 view: window,
  129.                 bubbles: true,
  130.                 cancelable: true,
  131.                 buttons: 1
  132.             });
  133.             element.dispatchEvent(event);
  134.         });
  135.         // 也尝试触发 pointer 事件
  136.         const pointerEvents = ['pointerdown', 'pointerup'];
  137.         pointerEvents.forEach(eventType => {
  138.             const event = new PointerEvent(eventType, {
  139.                 view: window,
  140.                 bubbles: true,
  141.                 cancelable: true,
  142.                 isPrimary: true
  143.             });
  144.             element.dispatchEvent(event);
  145.         });
  146.     }
  147.     // 等待一段时间
  148.     function sleep(ms) {
  149.         return new Promise(resolve => setTimeout(resolve, ms));
  150.     }
  151.     // 查找并关闭开关
  152.     async function toggleOffSwitches() {
  153.         try {
  154.             console.log('[关闭开关] 开始查找送礼信息和福袋口令的开关');
  155.             // 等待设置面板出现
  156.             await sleep(10);
  157.             // 查找所有包含开关的容器
  158.             const allContainers = document.querySelectorAll('.R8qN4fs1');
  159.             console.log(`[关闭开关] 找到 ${allContainers.length} 个容器`);
  160.             // 遍历所有容器,查找包含"送礼信息"和"福袋口令"的容器
  161.             for (const container of allContainers) {
  162.                 const textContent = container.textContent || '';
  163.                 // 如果容器包含"送礼信息"或"福袋口令"文字
  164.                 if (textContent.includes('送礼信息') || textContent.includes('福袋口令')) {
  165.                     console.log('[关闭开关] 找到包含送礼信息/福袋口令的容器');
  166.                     // 查找该容器内的所有行
  167.                     const rows = container.querySelectorAll('.tvFMszYY');
  168.                     for (const row of rows) {
  169.                         const rowText = row.textContent || '';
  170.                         // 只处理"送礼信息"和"福袋口令"这两行
  171.                         if (rowText.includes('送礼信息') || rowText.includes('福袋口令')) {
  172.                             console.log(`[关闭开关] 处理: ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);
  173.                             // 查找该行内的开关
  174.                             const switchElement = row.querySelector('.dNuSIvAp.SpsbqNUm.cA0AmKoK');
  175.                             if (switchElement) {
  176.                                 // 检查开关是否已经关闭(通过检查是否有 cA0AmKoK 类)
  177.                                 // cA0AmKoK 表示开关是开启的状态
  178.                                 const isOn = switchElement.classList.contains('cA0AmKoK');
  179.                                 console.log(`[关闭开关] ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'} 状态: ${isOn ? '开启' : '关闭'}`);
  180.                                 // 如果开关是开启状态,点击关闭
  181.                                 if (isOn) {
  182.                                     console.log(`[关闭开关] 点击关闭 ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);
  183.                                     clickReactElement(switchElement);
  184.                                     await sleep(10);
  185.                                 }
  186.                             } else {
  187.                                 console.error('[关闭开关] 未找到开关元素');
  188.                             }
  189.                         }
  190.                     }
  191.                 }
  192.             }
  193.             console.log('[关闭开关] 送礼信息和福袋口令处理完成');
  194.             return true;
  195.         } catch (error) {
  196.             console.error('[关闭开关] 操作失败:', error);
  197.             return false;
  198.         }
  199.     }
  200.     // 主执行流程
  201.     async function main() {
  202.         try {
  203.             console.log('[主流程] 等待页面加载完成...');
  204.             await waitForPageLoad();
  205.             console.log('[主流程] 页面已加载');
  206.             // 等待额外的时间确保所有元素都渲染完成
  207.             await sleep(10);
  208.             // 步骤1: 悬浮弹幕设置图标
  209.             console.log('[步骤1] 查找弹幕设置图标...');
  210.             const danmakuIcon = await waitForElement('div[data-e2e="danmaku-setting-icon"]');
  211.             if (danmakuIcon) {
  212.                 console.log('[步骤1] 找到弹幕设置图标,准备悬浮');
  213.                 hoverReactElement(danmakuIcon);
  214.                 console.log('[步骤1] 已悬浮弹幕设置图标');
  215.             } else {
  216.                 console.error('[步骤1] 未找到弹幕设置图标');
  217.                 return;
  218.             }
  219.             // 等待设置面板打开
  220.             await sleep(10);
  221.             // 步骤2: 关闭送礼信息和福袋口令
  222.             console.log('[步骤2] 开始关闭送礼信息和福袋口令...');
  223.             await toggleOffSwitches();
  224.             // 等待一下
  225.             await sleep(10);
  226.             // 步骤3: 悬浮礼物设置图标
  227.             console.log('[步骤3] 查找礼物设置图标...');
  228.             const giftIcon = await waitForElement('div[data-e2e="gift-setting"]');
  229.             if (giftIcon) {
  230.                 console.log('[步骤3] 找到礼物设置图标,准备悬浮');
  231.                 hoverReactElement(giftIcon);
  232.                 console.log('[步骤3] 已悬浮礼物设置图标');
  233.             } else {
  234.                 console.error('[步骤3] 未找到礼物设置图标');
  235.                 return;
  236.             }
  237.             // 等待礼物设置面板打开
  238.             await sleep(10);
  239.             // 步骤4: 开启"屏蔽礼物特效"
  240.             console.log('[步骤4] 开始开启屏蔽礼物特效...');
  241.             // 等待礼物设置面板完全加载
  242.             await sleep(10);
  243.             // 直接通过 data-e2e 属性查找屏蔽礼物特效开关
  244.             const effectSwitch = await waitForElement('div[data-e2e="effect-switch"]');
  245.             if (effectSwitch) {
  246.                 console.log('[步骤4] 找到屏蔽礼物特效开关');
  247.                 // 查找开关元素
  248.                 const switchElement = effectSwitch.querySelector('.dNuSIvAp.EkEDO2Hs');
  249.                 if (switchElement) {
  250.                     // 检查开关是否已经开启(根据你提供的HTML,关闭状态是 EkEDO2Hs,开启状态应该有额外的类)
  251.                     // 我们需要检查是否有 cA0AmKoK 类或其他表示开启的类
  252.                     const isOn = switchElement.classList.contains('cA0AmKoK') ||
  253.                                  switchElement.querySelector('.Cri3cNdU.gDrxzyfK') !== null;
  254.                     console.log(`[步骤4] 屏蔽礼物特效 状态: ${isOn ? '开启' : '关闭'}`);
  255.                     // 如果开关是关闭状态,点击开启
  256.                     if (!isOn) {
  257.                         console.log('[步骤4] 点击开启 屏蔽礼物特效');
  258.                         clickReactElement(switchElement);
  259.                         await sleep(10);
  260.                     } else {
  261.                         console.log('[步骤4] 屏蔽礼物特效 已经是开启状态,无需操作');
  262.                     }
  263.                 } else {
  264.                     console.error('[步骤4] 未找到屏蔽礼物特效开关元素');
  265.                 }
  266.             } else {
  267.                 console.error('[步骤4] 未找到屏蔽礼物特效开关容器');
  268.             }
  269.             // 步骤5: 移除所有悬浮状态
  270.             console.log('[步骤5] 开始移除悬浮状态...');
  271.             await sleep(10);
  272.             // 移除礼物设置图标的悬浮状态
  273.             if (giftIcon) {
  274.                 console.log('[步骤5] 移除礼物设置图标悬浮状态');
  275.                 unhoverReactElement(giftIcon);
  276.             }
  277.             await sleep(10);
  278.             // 移除弹幕设置图标的悬浮状态
  279.             if (danmakuIcon) {
  280.                 console.log('[步骤5] 移除弹幕设置图标悬浮状态');
  281.                 unhoverReactElement(danmakuIcon);
  282.             }
  283.             console.log('[主流程] ✅ 所有设置已完成');
  284.         } catch (error) {
  285.             console.error('[主流程] 执行出错:', error);
  286.         }
  287.     }
  288.     // 启动脚本
  289.     console.log('[抖音直播自动设置] 准备执行主流程...');
  290.     main();
  291. })();
复制代码
结语&添加
也欢迎大佬优化的更好一些 嘿嘿~ 有需要的自取吧添加方式也简单,新建然后复制代码进去 Ctrl+S 保存就好

油猴脚本】抖音网页直播间自动关闭送礼信息、福袋口令、屏蔽礼物特效

【油猴脚本】抖音网页直播间自动关闭送礼信息、福袋口令、屏蔽礼物特效


回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

您需要 登录 后才可以回复,轻松玩转社区,没有帐号?立即注册
快速回复
关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表