Twitch Turbo +

Block all Twitch ads, automatically claim bonus points, auto join raids, inject BTTV emotes into Twitch emoji picker, and promote Discord server

目前为 2024-09-17 提交的版本。查看 最新版本

// ==UserScript==
// @name         Twitch Turbo +
// @namespace    https://github.com/Brembo19
// @version      1.4.1
// @description  Block all Twitch ads, automatically claim bonus points, auto join raids, inject BTTV emotes into Twitch emoji picker, and promote Discord server
// @author       Brembo19
// @match        *://*.twitch.tv/*
// @grant        none
// ==/UserScript==

(async function() {
    'use strict';

    const blockAdsInVideo = () => {
        const video = document.querySelector('video');
        if (video && video.src.includes('ad_')) {
            video.src = ''; // Clear ad source
            console.log('Ad blocked in video stream');
        }
    };

    const removeAdBanners = () => {
        const adSelectors = [
            '[aria-label="Advertisement"]',
            '.ad-banner',
            '.ad-slot',
            '.tw-ad-container',
            '[data-ad="true"]',
            'div[class*="ad-"]',
            'div[class*="sponsored"]'
        ];

        adSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(ad => ad.remove());
        });
    };

    const observeDynamicContent = () => {
        const observer = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.type === 'childList') {
                    removeAdBanners();
                }
            });
        });

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

    const autoClaimBonus = () => {
        let claiming = false;

        const observer = new MutationObserver(() => {
            const bonus = document.querySelector('.claimable-bonus__icon');
            if (bonus && !claiming) {
                bonus.click();
                claiming = true;
                console.log('Bonus claimed');
                setTimeout(() => { claiming = false; }, Math.random() * 1000 + 1000);
            }
        });

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

    const autoJoinRaid = () => {
        const observer = new MutationObserver(() => {
            const raidButton = document.querySelector('button[data-test-selector="raid-banner__join-button"]');
            if (raidButton) {
                raidButton.click();
                console.log('Automatically joined the raid');
            }
        });

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

    const injectBTTVEmotesIntoEmojiPicker = async () => {
        try {
            const response = await fetch('https://betterttv.com/emotes/popular');
            const data = await response.json();
            const emotes = data.emotes;

            const observer = new MutationObserver(() => {
                const emojiPicker = document.querySelector('.chat-input__picker');
                if (emojiPicker && !document.querySelector('.bttv-emote')) {
                    emotes.forEach(emote => {
                        const emoteImg = document.createElement('img');
                        emoteImg.src = `https://cdn.betterttv.net/emote/${emote.id}/1x`;
                        emoteImg.alt = emote.code;
                        emoteImg.title = emote.code;
                        emoteImg.classList.add('bttv-emote');
                        emoteImg.style.width = '28px';
                        emoteImg.style.height = '28px';
                        emoteImg.style.margin = '5px';
                        
                        const emojiCategory = emojiPicker.querySelector('[data-test-selector="emote-picker"]');
                        if (emojiCategory) {
                            emojiCategory.appendChild(emoteImg);
                        }
                    });
                    console.log('BTTV emotes added to emoji picker');
                }
            });

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

        } catch (error) {
            console.error('Error fetching BTTV emotes:', error);
        }
    };

    blockAdsInVideo();
    removeAdBanners();
    observeDynamicContent();
    autoClaimBonus();
    autoJoinRaid();
    injectBTTVEmotesIntoEmojiPicker();

    setInterval(blockAdsInVideo, 1000);
    setInterval(removeAdBanners, 2000);

    // Discord invite in the console for users who want to join
    console.log('Join our Discord: https://discord.gg/Cwm8fwknKC');

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址