Captures, modifies, and resends API requests when the upload button is clicked on IGN
// ==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();
})();