吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5313|回复: 42
上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
anwen 发表于 2025-12-16 18:15 回帖奖励
本帖最后由 anwen 于 2025-12-16 18:15 编辑

原因

事情是这样的...抖音网页直播进入直播间后 送礼信息、福袋口令、礼物特效 都很影响观看直播效果,然后大佬出手搞定了它

废话不多说了 直接上代码 也有 @Zker(The-rapist) 大佬协助

效果预览图

进入直播间后会自动点击,然后关闭悬浮窗... 快去试试吧.

代码

// ==UserScript==
// @name         抖音直播自动设置
// @namespace    https://live.douyin.com/660292215268
// @version      1.0
// @description  自动关闭送礼信息、福袋口令和礼物特效
// @author       By Zker(The-rapist)、anwen
// @match        *://*.douyin.com/*
// @icon         https://lf3-static.bytednsdoc.com/obj/eden-cn/666eh7nuhfvhpebd/douyin_web/douyin_web/pwa_v3/512_512.png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

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

    // 等待页面完全加载
    function waitForPageLoad() {
        return new Promise((resolve) => {
            if (document.readyState === 'complete') {
                resolve();
            } else {
                window.addEventListener('load', resolve);
            }
        });
    }

    // 等待元素出现
    function waitForElement(selector, timeout = 120000) {
        return new Promise((resolve, reject) => {
            console.log(`[等待元素] 查找: ${selector}`);

            const element = document.querySelector(selector);
            if (element) {
                console.log(`[等待元素] 立即找到: ${selector}`);
                resolve(element);
                return;
            }

            const observer = new MutationObserver((mutations, obs) => {
                const element = document.querySelector(selector);
                if (element) {
                    console.log(`[等待元素] 观察到: ${selector}`);
                    obs.disconnect();
                    resolve(element);
                }
            });

            observer.observe(document.body, {
                childList: true,
                subtree: true
            });

            setTimeout(() => {
                observer.disconnect();
                reject(new Error(`等待元素超时: ${selector}`));
            }, timeout);
        });
    }

    // 模拟 React 悬浮事件
    function hoverReactElement(element) {
        console.log('[悬浮元素]', element);

        // 触发 React 能够监听的悬浮相关事件
        const hoverEvents = [
            'mouseenter',  // 鼠标进入元素
            'mouseover',   // 鼠标移动到元素上(冒泡)
            'mousemove'    // 鼠标在元素上移动
        ];

        hoverEvents.forEach(eventType => {
            const event = new MouseEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                clientX: 0,
                clientY: 0,
                buttons: 0  // 没有按钮按下
            });
            element.dispatchEvent(event);
        });

        // 也触发 pointer 悬浮事件
        const pointerHoverEvents = ['pointerenter', 'pointerover', 'pointermove'];
        pointerHoverEvents.forEach(eventType => {
            const event = new PointerEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                isPrimary: true,
                clientX: 0,
                clientY: 0,
                buttons: 0  // 没有按钮按下
            });
            element.dispatchEvent(event);
        });
    }

    // 移除悬浮状态
    function unhoverReactElement(element) {
        console.log('[移除悬浮]', element);

        // 触发鼠标离开事件
        const leaveEvents = [
            'mouseleave',  // 鼠标离开元素
            'mouseout'     // 鼠标移出元素(冒泡)
        ];

        leaveEvents.forEach(eventType => {
            const event = new MouseEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                clientX: 0,
                clientY: 0,
                buttons: 0
            });
            element.dispatchEvent(event);
        });

        // 也触发 pointer 离开事件
        const pointerLeaveEvents = ['pointerleave', 'pointerout'];
        pointerLeaveEvents.forEach(eventType => {
            const event = new PointerEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                isPrimary: true,
                clientX: 0,
                clientY: 0,
                buttons: 0
            });
            element.dispatchEvent(event);
        });
    }

    // 模拟 React 点击事件
    function clickReactElement(element) {
        console.log('[点击元素]', element);

        // 触发多种事件以确保 React 能够捕获
        const events = ['mousedown', 'mouseup', 'click'];

        events.forEach(eventType => {
            const event = new MouseEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                buttons: 1
            });
            element.dispatchEvent(event);
        });

        // 也尝试触发 pointer 事件
        const pointerEvents = ['pointerdown', 'pointerup'];
        pointerEvents.forEach(eventType => {
            const event = new PointerEvent(eventType, {
                view: window,
                bubbles: true,
                cancelable: true,
                isPrimary: true
            });
            element.dispatchEvent(event);
        });
    }

    // 等待一段时间
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 查找并关闭开关
    async function toggleOffSwitches() {
        try {
            console.log('[关闭开关] 开始查找送礼信息和福袋口令的开关');

            // 等待设置面板出现
            await sleep(10);

            // 查找所有包含开关的容器
            const allContainers = document.querySelectorAll('.R8qN4fs1');

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

            // 遍历所有容器,查找包含"送礼信息"和"福袋口令"的容器
            for (const container of allContainers) {
                const textContent = container.textContent || '';

                // 如果容器包含"送礼信息"或"福袋口令"文字
                if (textContent.includes('送礼信息') || textContent.includes('福袋口令')) {
                    console.log('[关闭开关] 找到包含送礼信息/福袋口令的容器');

                    // 查找该容器内的所有行
                    const rows = container.querySelectorAll('.tvFMszYY');

                    for (const row of rows) {
                        const rowText = row.textContent || '';

                        // 只处理"送礼信息"和"福袋口令"这两行
                        if (rowText.includes('送礼信息') || rowText.includes('福袋口令')) {
                            console.log(`[关闭开关] 处理: ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);

                            // 查找该行内的开关
                            const switchElement = row.querySelector('.dNuSIvAp.SpsbqNUm.cA0AmKoK');

                            if (switchElement) {
                                // 检查开关是否已经关闭(通过检查是否有 cA0AmKoK 类)
                                // cA0AmKoK 表示开关是开启的状态
                                const isOn = switchElement.classList.contains('cA0AmKoK');

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

                                // 如果开关是开启状态,点击关闭
                                if (isOn) {
                                    console.log(`[关闭开关] 点击关闭 ${rowText.includes('送礼信息') ? '送礼信息' : '福袋口令'}`);
                                    clickReactElement(switchElement);
                                    await sleep(10);
                                }
                            } else {
                                console.error('[关闭开关] 未找到开关元素');
                            }
                        }
                    }
                }
            }

            console.log('[关闭开关] 送礼信息和福袋口令处理完成');
            return true;
        } catch (error) {
            console.error('[关闭开关] 操作失败:', error);
            return false;
        }
    }

    // 主执行流程
    async function main() {
        try {
            console.log('[主流程] 等待页面加载完成...');
            await waitForPageLoad();
            console.log('[主流程] 页面已加载');

            // 等待额外的时间确保所有元素都渲染完成
            await sleep(10);

            // 步骤1: 悬浮弹幕设置图标
            console.log('[步骤1] 查找弹幕设置图标...');
            const danmakuIcon = await waitForElement('div[data-e2e="danmaku-setting-icon"]');

            if (danmakuIcon) {
                console.log('[步骤1] 找到弹幕设置图标,准备悬浮');
                hoverReactElement(danmakuIcon);
                console.log('[步骤1] 已悬浮弹幕设置图标');
            } else {
                console.error('[步骤1] 未找到弹幕设置图标');
                return;
            }

            // 等待设置面板打开
            await sleep(10);

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

            // 等待一下
            await sleep(10);

            // 步骤3: 悬浮礼物设置图标
            console.log('[步骤3] 查找礼物设置图标...');
            const giftIcon = await waitForElement('div[data-e2e="gift-setting"]');

            if (giftIcon) {
                console.log('[步骤3] 找到礼物设置图标,准备悬浮');
                hoverReactElement(giftIcon);
                console.log('[步骤3] 已悬浮礼物设置图标');
            } else {
                console.error('[步骤3] 未找到礼物设置图标');
                return;
            }

            // 等待礼物设置面板打开
            await sleep(10);

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

            // 等待礼物设置面板完全加载
            await sleep(10);

            // 直接通过 data-e2e 属性查找屏蔽礼物特效开关
            const effectSwitch = await waitForElement('div[data-e2e="effect-switch"]');

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

                // 查找开关元素
                const switchElement = effectSwitch.querySelector('.dNuSIvAp.EkEDO2Hs');

                if (switchElement) {
                    // 检查开关是否已经开启(根据你提供的HTML,关闭状态是 EkEDO2Hs,开启状态应该有额外的类)
                    // 我们需要检查是否有 cA0AmKoK 类或其他表示开启的类
                    const isOn = switchElement.classList.contains('cA0AmKoK') ||
                                 switchElement.querySelector('.Cri3cNdU.gDrxzyfK') !== null;

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

                    // 如果开关是关闭状态,点击开启
                    if (!isOn) {
                        console.log('[步骤4] 点击开启 屏蔽礼物特效');
                        clickReactElement(switchElement);
                        await sleep(10);
                    } else {
                        console.log('[步骤4] 屏蔽礼物特效 已经是开启状态,无需操作');
                    }
                } else {
                    console.error('[步骤4] 未找到屏蔽礼物特效开关元素');
                }
            } else {
                console.error('[步骤4] 未找到屏蔽礼物特效开关容器');
            }

            // 步骤5: 移除所有悬浮状态
            console.log('[步骤5] 开始移除悬浮状态...');
            await sleep(10);

            // 移除礼物设置图标的悬浮状态
            if (giftIcon) {
                console.log('[步骤5] 移除礼物设置图标悬浮状态');
                unhoverReactElement(giftIcon);
            }

            await sleep(10);

            // 移除弹幕设置图标的悬浮状态
            if (danmakuIcon) {
                console.log('[步骤5] 移除弹幕设置图标悬浮状态');
                unhoverReactElement(danmakuIcon);
            }

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

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

    // 启动脚本
    console.log('[抖音直播自动设置] 准备执行主流程...');
    main();
})();

结语&添加

也欢迎大佬优化的更好一些 嘿嘿~ 有需要的自取吧添加方式也简单,新建然后复制代码进去 Ctrl+S 保存就好

其他

这个礼物栏屏蔽建议也一起安装...防止兜里有抖币的不小心刷出去...

【油猴脚本】屏蔽抖音网页端下方礼物栏
https://www.52pojie.cn/thread-1991094-1-1.html
(出处: 吾爱破解论坛)

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
莫奇 + 1 + 1 谢谢@Thanks!
pptx + 1 谢谢@Thanks!
hrh123 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
兰谷不可登雅堂 发表于 2026-6-1 21:07
屏蔽底部礼物栏的脚本是正常的。但是这个关闭送礼信息、福袋口令、礼物特效的脚本虽然脚本被执行了但是并没有效果,是因为抖音更新导致功能失效了吗?另外是否可以设定屏蔽某个价值以下的礼物弹幕,网页版主要是想边录屏边看文字公屏和高价值礼物
推荐
 楼主| anwen 发表于 2025-12-16 20:12 |楼主
wisdomxj 发表于 2025-12-16 20:01
点开多个网页直播间,可以,会暂停之前点开的直播间,有办法不让他暂停吗?还有,网页端发评论好像发不出, ...

这个没办法抖音只能打开一个直播间 你进B直播间你上一个A直播间就会停止

你说的评论是作品评论还是直播弹幕? 弹幕别人看不到是正常的 抖音弹幕是实行分流的 并未进行全部推送显示
3#
kangroo99 发表于 2025-12-16 18:46
4#
啊志online 发表于 2025-12-16 18:57
感谢分享,屏蔽礼物的就一直在用,没用之前手残送出去好几个,心疼
5#
adb123a 发表于 2025-12-16 19:08
谢谢楼主,学习了
6#
nukhuang 发表于 2025-12-16 19:48
太好了是油猴脚本,我们有救了
7#
hmh815 发表于 2025-12-16 19:51
这个在ios上可以直接用吗?
8#
qcx991 发表于 2025-12-16 19:52
这脚本有什么用,能赚钱吗
9#
AppleJACK 发表于 2025-12-16 19:57
页面清爽多了谢谢楼主分享
10#
wisdomxj 发表于 2025-12-16 20:01
点开多个网页直播间,可以,会暂停之前点开的直播间,有办法不让他暂停吗?还有,网页端发评论好像发不出,发出去其他人是看不见的,挺奇怪的,手机端没问题
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-9-5 01:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表