IGN Avatar Upload Assistant with API Capture and Modify

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

  1. // ==UserScript==
  2. // @name IGN Avatar Upload Assistant with API Capture and Modify
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.1
  5. // @description Captures, modifies, and resends API requests when the upload button is clicked on IGN
  6. // @author Your Name
  7. // @match https://www.ign.com/account/settings
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Função para exibir um alerta ao clicar no botão de upload
  16. function handleUploadButtonClick() {
  17. 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.');
  18. }
  19.  
  20. // Adiciona o listener ao botão de upload
  21. function addButtonClickListener() {
  22. const uploadButton = document.querySelector('.jsx-503626215.avatar-picker');
  23. if (uploadButton) {
  24. uploadButton.removeEventListener('click', handleUploadButtonClick);
  25. uploadButton.addEventListener('click', handleUploadButtonClick);
  26. }
  27. }
  28.  
  29. // Função para monitorar e capturar requisições de API
  30. function monitorAPIRequests() {
  31. const originalFetch = window.fetch;
  32.  
  33. window.fetch = async function(...args) {
  34. if (args[0].includes('https://mollusk.apis.ign.com/graphql') && args[1] && args[1].body) {
  35. console.log('Intercepted API request:');
  36. console.log('URL:', args[0]);
  37.  
  38. // Log dos cabeçalhos e corpo da requisição
  39. console.log('Original Headers:', args[1].headers);
  40. console.log('Original Body:', args[1].body);
  41.  
  42. try {
  43. // Converte o corpo da requisição para JSON e modifica os valores
  44. let requestBody = JSON.parse(args[1].body);
  45.  
  46. // Solicita ao usuário novos valores para avatarImageUrl e thumbnailUrl
  47. const newUrl = prompt('Digite o novo URL para avatarImageUrl e thumbnailUrl:', '');
  48.  
  49. if (newUrl !== null) {
  50. // Modifica apenas os campos necessários, mantendo o restante intacto
  51. requestBody.variables.userInput.avatarImageUrl = newUrl;
  52. requestBody.variables.userInput.thumbnailUrl = newUrl;
  53.  
  54. // Exibe os novos valores no console
  55. console.log('Modified Body:', requestBody);
  56.  
  57. // Envia a requisição com o corpo modificado
  58. const response = await originalFetch(args[0], {
  59. method: 'POST',
  60. headers: {
  61. ...args[1].headers,
  62. 'Content-Type': 'application/json',
  63. },
  64. body: JSON.stringify(requestBody)
  65. });
  66.  
  67. // Loga a resposta da requisição modificada
  68. const responseBody = await response.json();
  69. console.log('Response:', responseBody);
  70.  
  71. // Retorna a resposta da requisição modificada
  72. return new Response(JSON.stringify(responseBody), {
  73. status: response.status,
  74. statusText: response.statusText,
  75. headers: response.headers
  76. });
  77. } else {
  78. console.error('No URL provided. Request not sent.');
  79. }
  80. } catch (error) {
  81. console.error('Error modifying request:', error);
  82. }
  83. }
  84.  
  85. // Chama o fetch original se a URL não corresponder
  86. return originalFetch.apply(this, args);
  87. };
  88. }
  89.  
  90. // Adiciona o listener ao carregar a página
  91. addButtonClickListener();
  92.  
  93. // Inicia a observação do DOM para o botão de upload
  94. const observer = new MutationObserver(() => addButtonClickListener());
  95. observer.observe(document.body, { childList: true, subtree: true });
  96.  
  97. // Inicia o monitoramento das requisições API
  98. monitorAPIRequests();
  99.  
  100. })();