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

admin
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

原因
事情是这样的...抖音网页直播进入直播间后 送礼信息、福袋口令、礼物特效 都很影响观看直播效果,然后大佬出手搞定了它
废话不多说了 直接上代码 也有 @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.  

  12. (function() {

  13.     'use strict';

  14.  

  15.     console.log('[抖音直播自动设置] 脚本已加载');

  16.  

  17.     // 等待页面完全加载

  18.     function wAItForPageLoad() {

  19.         return new Promise((resolve) => {

  20.             if (document.readyState === 'complete') {

  21.                 resolve();

  22.             } else {

  23.                 window.addEventListener('load', resolve);

  24.             }

  25.         });

  26.     }

  27.  

  28.     // 等待元素出现

  29.     function waitForElement(selector, timeout = 120000) {

  30.         return new Promise((resolve, reject) => {

  31.             console.log(`[等待元素] 查找: ${selector}`);

  32.  

  33.             const element = document.querySelector(selector);

  34.             if (element) {

  35.                 console.log(`[等待元素] 立即找到: ${selector}`);

  36.                 resolve(element);

  37.                 return;

  38.             }

  39.  

  40.             const observer = new MutationObserver((mutations, obs) => {

  41.                 const element = document.querySelector(selector);

  42.                 if (element) {

  43.                     console.log(`[等待元素] 观察到: ${selector}`);

  44.                     obs.disconnect();

  45.                     resolve(element);

  46.                 }

  47.             });

  48.  

  49.             observer.observe(document.body, {

  50.                 childList: true,

  51.                 subtree: true

  52.             });

  53.  

  54.             setTimeout(() => {

  55.                 observer.disconnect();

  56.                 reject(new Error(`等待元素超时: ${selector}`));

  57.             }, timeout);

  58.         });

  59.     }

  60.  

  61.     // 模拟 React 悬浮事件

  62.     function hoverReactElement(element) {

  63.         console.log('[悬浮元素]', element);

  64.  

  65.         // 触发 React 够监听的悬浮相关事件

  66.         const hoverEvents = [

  67.             'mouseenter',  // 鼠标进入元素

  68.             'mouseover',   // 鼠标移动到元素上(冒泡)

  69.             'mousemove'    // 鼠标在元素上移动

  70.         ];

  71.  

  72.         hoverEvents.forEach(eventType => {

  73.             const event = new MouseEvent(eventType, {

  74.                 view: window,

  75.                 bubbles: true,

  76.                 cancelable: true,

  77.                 clientX: 0,

  78.                 clientY: 0,

  79.                 buttons: 0  // 没有按钮按下

  80.             });

  81.             element.dispatchEvent(event);

  82.         });

  83.  

  84.         // 也触发 pointer 悬浮事件

  85.         const pointerHoverEvents = ['pointerenter', 'pointerover', 'pointermove'];

  86.         pointerHoverEvents.forEach(eventType => {

  87.             const event = new PointerEvent(eventType, {

  88.                 view: window,

  89.                 bubbles: true,

  90.                 cancelable: true,

  91.                 isPrimary: true,

  92.                 clientX: 0,

  93.                 clientY: 0,

  94.                 buttons: 0  // 没有按钮按下

  95.             });

  96.             element.dispatchEvent(event);

  97.         });

  98.     }

  99.  

  100.     // 移除悬浮状态

  101.     function unhoverReactElement(element) {

  102.         console.log('[移除悬浮]', element);

  103.  

  104.         // 触发鼠标离开事件

  105.         const leaveEvents = [

  106.             'mouseleave',  // 鼠标离开元素

  107.             'mouseout'     // 鼠标移出元素(冒泡)

  108.         ];

  109.  

  110.         leaveEvents.forEach(eventType => {

  111.             const event = new MouseEvent(eventType, {

  112.                 view: window,

  113.                 bubbles: true,

  114.                 cancelable: true,

  115.                 clientX: 0,

  116.                 clientY: 0,

  117.                 buttons: 0

  118.             });

  119.             element.dispatchEvent(event);

  120.         });

  121.  

  122.         // 也触发 pointer 离开事件

  123.         const pointerLeaveEvents = ['pointerleave', 'pointerout'];

  124.         pointerLeaveEvents.forEach(eventType => {

  125.             const event = new PointerEvent(eventType, {

  126.                 view: window,

  127.                 bubbles: true,

  128.                 cancelable: true,

  129.                 isPrimary: true,

  130.                 clientX: 0,

  131.                 clientY: 0,

  132.                 buttons: 0

  133.             });

  134.             element.dispatchEvent(event);

  135.         });

  136.     }

  137.  

  138.     // 模拟 React 点击事件

  139.     function clickReactElement(element) {

  140.         console.log('[点击元素]', element);

  141.  

  142.         // 触发多种事件以确保 React 能够捕获

  143.         const events = ['mousedown', 'mouseup', 'click'];

  144.  

  145.         events.forEach(eventType => {

  146.             const event = new MouseEvent(eventType, {

  147.                 view: window,

  148.                 bubbles: true,

  149.                 cancelable: true,

  150.                 buttons: 1

  151.             });

  152.             element.dispatchEvent(event);

  153.         });

  154.  

  155.         // 也尝试触发 pointer 事件

  156.         const pointerEvents = ['pointerdown', 'pointerup'];

  157.         pointerEvents.forEach(eventType => {

  158.             const event = new PointerEvent(eventType, {

  159.                 view: window,

  160.                 bubbles: true,

  161.                 cancelable: true,

  162.                 isPrimary: true

  163.             });

  164.             element.dispatchEvent(event);

  165.         });

  166.     }

  167.  

  168.     // 等待一段时间

  169.     function sleep(ms) {

  170.         return new Promise(resolve => setTimeout(resolve, ms));

  171.     }

  172.  

  173.     // 查找并关闭开关

  174.     async function toggleOffSwitches() {

  175.         try {

  176.             console.log('[关闭开关] 开始查找送礼信息和福袋口令的开关');

  177.  

  178.             // 等待设置面板出现

  179.             await sleep(10);

  180.  

  181.             // 查找所有包含开关的容器

  182.             const allContainers = document.querySelectorAll('.R8qN4fs1');

  183.  

  184.             console.log(`[关闭开关] 找到 ${allContainers.length} 个容器`);

  185.  

  186.             // 遍历所有容器,查找包含"送礼信息"和"福袋口令"的容器

  187.             for (const container of allContainers) {

  188.                 const textContent = container.textContent || '';

  189.  

  190.                 // 如果容器包含"送礼信息"或"福袋口令"文字

  191.                 if (textContent.includes('送礼信息') || textContent.includes('福袋口令')) {

  192.                     console.log('[关闭开关] 找到包含送礼信息/福袋口令的容器');

  193.  

  194.                     // 查找该容器内的所有行

  195.                     const rows = container.querySelectorAll('.tvFMszYY');

  196.  

  197.                     for (const row of rows) {

  198.                         const rowText = row.textContent || '';

  199.  

  200.                         // 只处理"送礼信息"和"福袋口令"这两行

  201.                         if (rowText.includes('送礼信息') || rowText.includes('福袋口令')) {

  202.                             console.log(`[关闭开关] 处理: ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);

  203.  

  204.                             // 查找该行内的开关

  205.                             const switchElement = row.querySelector('.dNuSIvAp.SpsbqNUm.cA0AmKoK');

  206.  

  207.                             if (switchElement) {

  208.                                 // 检查开关是否已经关闭(通过检查是否有 cA0AmKoK 类)

  209.                                 // cA0AmKoK 表示开关是开启的状态

  210.                                 const isOn = switchElement.classList.contains('cA0AmKoK');

  211.  

  212.                                 console.log(`[关闭开关] ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'} 状态: ${isOn ? '开启' : '关闭'}`);

  213.  

  214.                                 // 如果开关是开启状态,点击关闭

  215.                                 if (isOn) {

  216.                                     console.log(`[关闭开关] 点击关闭 ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);

  217.                                     clickReactElement(switchElement);

  218.                                     await sleep(10);

  219.                                 }

  220.                             } else {

  221.                                 console.error('[关闭开关] 未找到开关元素');

  222.                             }

  223.                         }

  224.                     }

  225.                 }

  226.             }

  227.  

  228.             console.log('[关闭开关] 送礼信息和福袋口令处理完成');

  229.             return true;

  230.         } catch (error) {

  231.             console.error('[关闭开关] 操作失败:', error);

  232.             return false;

  233.         }

  234.     }

  235.  

  236.     // 主执行流程

  237.     async function main() {

  238.         try {

  239.             console.log('[主流程] 等待页面加载完成...');

  240.             await waitForPageLoad();

  241.             console.log('[主流程] 页面已加载');

  242.  

  243.             // 等待额外的时间确保所有元素都渲染完成

  244.             await sleep(10);

  245.  

  246.             // 步骤1: 悬浮弹幕设置图标

  247.             console.log('[步骤1] 查找弹幕设置图标...');

  248.             const danmakuIcon = await waitForElement('div[data-e2e="danmaku-setting-icon"]');

  249.  

  250.             if (danmakuIcon) {

  251.                 console.log('[步骤1] 找到弹幕设置图标,准备悬浮');

  252.                 hoverReactElement(danmakuIcon);

  253.                 console.log('[步骤1] 已悬浮弹幕设置图标');

  254.             } else {

  255.                 console.error('[步骤1] 未找到弹幕设置图标');

  256.                 return;

  257.             }

  258.  

  259.             // 等待设置面板打开

  260.             await sleep(10);

  261.  

  262.             // 步骤2: 关闭送礼信息和福袋口令

  263.             console.log('[步骤2] 开始关闭送礼信息和福袋口令...');

  264.             await toggleOffSwitches();

  265.  

  266.             // 等待一下

  267.             await sleep(10);

  268.  

  269.             // 步骤3: 悬浮礼物设置图标

  270.             console.log('[步骤3] 查找礼物设置图标...');

  271.             const giftIcon = await waitForElement('div[data-e2e="gift-setting"]');

  272.  

  273.             if (giftIcon) {

  274.                 console.log('[步骤3] 找到礼物设置图标,准备悬浮');

  275.                 hoverReactElement(giftIcon);

  276.                 console.log('[步骤3] 已悬浮礼物设置图标');

  277.             } else {

  278.                 console.error('[步骤3] 未找到礼物设置图标');

  279.                 return;

  280.             }

  281.  

  282.             // 等待礼物设置面板打开

  283.             await sleep(10);

  284.  

  285.             // 步骤4: 开启"屏蔽礼物特效"

  286.             console.log('[步骤4] 开始开启屏蔽礼物特效...');

  287.  

  288.             // 等待礼物设置面板完全加载

  289.             await sleep(10);

  290.  

  291.             // 直接通过 data-e2e 属性查找屏蔽礼物特效开关

  292.             const effectSwitch = await waitForElement('div[data-e2e="effect-switch"]');

  293.  

  294.             if (effectSwitch) {

  295.                 console.log('[步骤4] 找到屏蔽礼物特效开关');

  296.  

  297.                 // 查找开关元素

  298.                 const switchElement = effectSwitch.querySelector('.dNuSIvAp.EkEDO2Hs');

  299.  

  300.                 if (switchElement) {

  301.                     // 检查开关是否已经开启(根据你提供的HTML,关闭状态是 EkEDO2Hs,开启状态应该有额外的类)

  302.                     // 我们需要检查是否有 cA0AmKoK 类或其他表示开启的类

  303.                     const isOn = switchElement.classList.contains('cA0AmKoK') ||

  304.                                  switchElement.querySelector('.Cri3cNdU.gDrxzyfK') !== null;

  305.  

  306.                     console.log(`[步骤4] 屏蔽礼物特效 状态: ${isOn ? '开启' : '关闭'}`);

  307.  

  308.                     // 如果开关是关闭状态,点击开启

  309.                     if (!isOn) {

  310.                         console.log('[步骤4] 点击开启 屏蔽礼物特效');

  311.                         clickReactElement(switchElement);

  312.                         await sleep(10);

  313.                     } else {

  314.                         console.log('[步骤4] 屏蔽礼物特效 已经是开启状态,无需操作');

  315.                     }

  316.                 } else {

  317.                     console.error('[步骤4] 未找到屏蔽礼物特效开关元素');

  318.                 }

  319.             } else {

  320.                 console.error('[步骤4] 未找到屏蔽礼物特效开关容器');

  321.             }

  322.  

  323.             // 步骤5: 移除所有悬浮状态

  324.             console.log('[步骤5] 开始移除悬浮状态...');

  325.             await sleep(10);

  326.  

  327.             // 移除礼物设置图标的悬浮状态

  328.             if (giftIcon) {

  329.                 console.log('[步骤5] 移除礼物设置图标悬浮状态');

  330.                 unhoverReactElement(giftIcon);

  331.             }

  332.  

  333.             await sleep(10);

  334.  

  335.             // 移除弹幕设置图标的悬浮状态

  336.             if (danmakuIcon) {

  337.                 console.log('[步骤5] 移除弹幕设置图标悬浮状态');

  338.                 unhoverReactElement(danmakuIcon);

  339.             }

  340.  

  341.             console.log('[主流程] ✅ 所有设置已完成');

  342.  

  343.         } catch (error) {

  344.             console.error('[主流程] 执行出错:', error);

  345.         }

  346.     }

  347.  

  348.     // 启动脚本

  349.     console.log('[抖音直播自动设置] 准备执行主流程...');

  350.     main();

  351. })();
    ==========================结束=========================

1.webp


文章版权声明:除非注明,否则均为AI虎哥的工具库原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,3人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码