IGN Avatar Upload Assistant with API Capture and Modify

Captures, modifies, and resends API requests when the upload button is clicked on IGN

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         IGN Avatar Upload Assistant with API Capture and Modify
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Captures, modifies, and resends API requests when the upload button is clicked on IGN
// @author       Your Name
// @match        https://www.ign.com/account/settings
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Função para exibir um alerta ao clicar no botão de upload
    function handleUploadButtonClick() {
        alert('Nesta etapa, você precisa enviar qualquer imagem. Isso serve apenas para capturar as informações da API. Tutorial para hospedar seu avatar: https://mamadordeviados.neocities.org/ Copia o link, mas envie o avatar antes de acessar o site. Sou burro se não o script buga kkk se bugar recarrega a página.');
    }

    // Adiciona o listener ao botão de upload
    function addButtonClickListener() {
        const uploadButton = document.querySelector('.jsx-503626215.avatar-picker');
        if (uploadButton) {
            uploadButton.removeEventListener('click', handleUploadButtonClick);
            uploadButton.addEventListener('click', handleUploadButtonClick);
        }
    }

    // Função para monitorar e capturar requisições de API
    function monitorAPIRequests() {
        const originalFetch = window.fetch;

        window.fetch = async function(...args) {
            if (args[0].includes('https://mollusk.apis.ign.com/graphql') && args[1] && args[1].body) {
                console.log('Intercepted API request:');
                console.log('URL:', args[0]);

                // Log dos cabeçalhos e corpo da requisição
                console.log('Original Headers:', args[1].headers);
                console.log('Original Body:', args[1].body);

                try {
                    // Converte o corpo da requisição para JSON e modifica os valores
                    let requestBody = JSON.parse(args[1].body);

                    // Solicita ao usuário novos valores para avatarImageUrl e thumbnailUrl
                    const newUrl = prompt('Digite o novo URL para avatarImageUrl e thumbnailUrl:', '');

                    if (newUrl !== null) {
                        // Modifica apenas os campos necessários, mantendo o restante intacto
                        requestBody.variables.userInput.avatarImageUrl = newUrl;
                        requestBody.variables.userInput.thumbnailUrl = newUrl;

                        // Exibe os novos valores no console
                        console.log('Modified Body:', requestBody);

                        // Envia a requisição com o corpo modificado
                        const response = await originalFetch(args[0], {
                            method: 'POST',
                            headers: {
                                ...args[1].headers,
                                'Content-Type': 'application/json',
                            },
                            body: JSON.stringify(requestBody)
                        });

                        // Loga a resposta da requisição modificada
                        const responseBody = await response.json();
                        console.log('Response:', responseBody);

                        // Retorna a resposta da requisição modificada
                        return new Response(JSON.stringify(responseBody), {
                            status: response.status,
                            statusText: response.statusText,
                            headers: response.headers
                        });
                    } else {
                        console.error('No URL provided. Request not sent.');
                    }
                } catch (error) {
                    console.error('Error modifying request:', error);
                }
            }

            // Chama o fetch original se a URL não corresponder
            return originalFetch.apply(this, args);
        };
    }

    // Adiciona o listener ao carregar a página
    addButtonClickListener();

    // Inicia a observação do DOM para o botão de upload
    const observer = new MutationObserver(() => addButtonClickListener());
    observer.observe(document.body, { childList: true, subtree: true });

    // Inicia o monitoramento das requisições API
    monitorAPIRequests();

})();