RateLimit Bypass

Send custom requests when emote buttons are clicked

目前为 2024-05-01 提交的版本。查看 最新版本

// ==UserScript==
// @name         RateLimit Bypass
// @namespace    RishiSunak
// @version      0.3
// @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) {
            if (response.status === 429) {
                console.log('IP Limit Detected - Change IP to send more messages');
                createPopup('IP Limit Detected - Change IP to send more emotes');
            } else {
                throw new Error('Failed to send request');
            }
        }
        console.log('Request sent successfully');
    }).catch(error => {
        console.error('Error sending request:', error);
    });
}

function createPopup(message) {
    const popup = document.createElement('div');
    popup.textContent = message;
    popup.style.position = 'fixed';
    popup.style.top = '50%';
    popup.style.left = '50%';
    popup.style.transform = 'translate(-50%, -50%)';
    popup.style.padding = '20px';
    popup.style.background = 'red';
    popup.style.color = 'white';
    popup.style.fontFamily = 'Arial, sans-serif';
    popup.style.fontSize = '16px';
    popup.style.zIndex = '9999';
    popup.style.borderRadius = '5px';

    document.body.appendChild(popup);

    setTimeout(() => {
        document.body.removeChild(popup);
    }, 5000);
}

    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();
})();