RateLimit Bypass

Send custom requests when emote buttons are clicked

目前為 2024-04-30 提交的版本,檢視 最新版本

// ==UserScript==
// @name         RateLimit Bypass
// @namespace    RishiSunak
// @version      0.2
// @description  Send custom requests when emote buttons are clicked
// @author       You
// @match        https://kick.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function getCookie(name) {
        const cookies = document.cookie.split('; ');
        for (const cookie of cookies) {
            const [cookieName, cookieValue] = cookie.split('=');
            if (cookieName === name) {
                return cookieValue;
            }
        }
        return null;
    }

      const authToken = getCookie('XSRF-TOKEN');
      const xsrfToken = decodeURIComponent(authToken);

    function sendRequest(chatId, emoteNumber, xsrfToken) {
        const headers = {
            'Accept': 'application/json, text/plain, */*',
            'Authorization': authToken,
            'X-Xsrf-Token': xsrfToken,
            'Origin': 'https://kick.com',
            'Referer': 'https://kick.com/nickwhite',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
            'Content-Type': 'application/json'
        };

        const url = 'https://kick.com/api/v2/messages/send/' + chatId;
        const jsonData = JSON.stringify({
            'content': `[emote:${emoteNumber}:RishiBypass]`,
            'type': 'message'
        });

        fetch(url, {
            method: 'POST',
            headers: headers,
            credentials: 'include',
            body: jsonData
        }).then(response => {
            if (!response.ok) {
                throw new Error('Failed to send request');
            }
            console.log('Request sent successfully');
        }).catch(error => {
            console.error('Error sending request:', error);
        });
    }

    function attachEventListeners(chatId) {
        const emoteItems = document.querySelectorAll('img[src*="/emotes/"]');
        emoteItems.forEach(emote => {
            const clone = emote.cloneNode(true);
            emote.parentNode.replaceChild(clone, emote);
        });

        const newEmoteItems = document.querySelectorAll('img[src*="/emotes/"]');
        newEmoteItems.forEach(emote => {
            emote.addEventListener('click', function(event) {
                event.preventDefault();
                event.stopPropagation();
                console.log('Clicked IMG element:', event.target);
                console.log('SRC:', event.target.src);
                const emoteNumber = event.target.src.match(/\/emotes\/(\d+)\/fullsize/)[1];
                console.log('Emote Number:', emoteNumber);
                sendRequest(chatId, emoteNumber, xsrfToken);
                attachEventListeners(chatId);
            });
        });
    }

    setTimeout(function() {
        fetch('https://kick.com/api/v2/channels/' + window.location.pathname.split('/').pop(), {
            method: 'GET',
            credentials: 'include'
        }).then(response => {
            if (!response.ok) {
                throw new Error('Failed to fetch chat ID');
            }
            return response.json();
        }).then(data => {
            const chatId = data.chatroom && data.chatroom.id ? data.chatroom.id : null;
            if (!chatId) {
                throw new Error('Chat ID not found in response');
            }
            console.log('Chat ID:', chatId);

            attachEventListeners(chatId);
        }).catch(error => {
            console.error('Error:', error);
        });
    }, 3000); 


function hideRateLimitMessage() {
    const toastHolder = document.querySelector('.toast-holder');
    if (toastHolder) {
        toastHolder.style.display = 'none';
    }
}

function attachHideRateLimitListeners() {
    const observerTarget = document.querySelector('body');
    const observer = new MutationObserver(mutationsList => {
        mutationsList.forEach(mutation => {
            if (mutation.addedNodes.length > 0) {
                mutation.addedNodes.forEach(addedNode => {
                    if (addedNode.nodeType === 1) {
                        if (addedNode.classList && addedNode.classList.contains('toast-holder')) {
                            hideRateLimitMessage();
                        }
                    }
                });
            }
        });
    });

    const observerConfig = { childList: true, subtree: true };
    observer.observe(observerTarget, observerConfig);
}


hideRateLimitMessage();
attachHideRateLimitListeners();
})();

QingJ © 2025

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