Auto Like for Tinder com Fechamento Automático do Modal

Script para clicar automaticamente no botão de "Like", fechar o modal automaticamente, mover o contador e o botão de pausar juntos, e pausar o script.

  1. // ==UserScript==
  2. // @name Auto Like for Tinder com Fechamento Automático do Modal
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.9
  5. // @description Script para clicar automaticamente no botão de "Like", fechar o modal automaticamente, mover o contador e o botão de pausar juntos, e pausar o script.
  6. // @author Srmura
  7. // @match https://tinder.com/app/recs
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. (function () {
  13. 'use strict';
  14.  
  15. // Definição inicial dos seletores
  16. let likeButtonSelector = '#main-content > div.H\\(100\\%\\) > div > div > div > div.Pos\\(r\\).Expand.H\\(--recs-card-height\\)--ml.Maw\\(--recs-card-width\\)--ml.Mt\\(a\\) > div > div > div.Pos\\(a\\).B\\(0\\).Iso\\(i\\).W\\(100\\%\\).Start\\(0\\).End\\(0\\).TranslateY\\(55\\%\\) > div > div:nth-child(4) > button';
  17. let modalCloseButtonSelector = '#t-1142746548 > div > div > button.c1p6lbu0.D\\(b\\).My\\(20px\\).Mx\\(a\\)';
  18.  
  19. // Função para atualizar os seletores
  20. function updateSelectors() {
  21. // Aqui você pode atualizar os seletores manualmente se necessário
  22. console.log('Seletores atualizados:', likeButtonSelector, modalCloseButtonSelector);
  23. }
  24.  
  25. // Configurações do script
  26. const interval = 500; // Intervalo de 500ms entre verificações
  27. const maxMissedAttempts = 5; // Número máximo de tentativas consecutivas sem encontrar o botão antes de recarregar a página
  28. let missedAttempts = 0; // Contador de tentativas consecutivas sem sucesso
  29. let likesCount = parseInt(localStorage.getItem('likesCount')) || 0; // Recupera o número de likes armazenados ou começa de 0
  30. let isPaused = false; // Flag para pausar/continuar o script
  31.  
  32. // Criação do contêiner para o contador e o botão de pausar
  33. const container = document.createElement('div');
  34. container.style.position = 'fixed';
  35. container.style.top = '10px';
  36. container.style.left = '10px';
  37. container.style.zIndex = '1000';
  38. container.style.display = 'flex';
  39. container.style.flexDirection = 'column';
  40. container.style.alignItems = 'center';
  41. document.body.appendChild(container);
  42.  
  43. // Criação de um elemento para mostrar o número de likes na página
  44. const likeCounter = document.createElement('div');
  45. likeCounter.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  46. likeCounter.style.color = 'white';
  47. likeCounter.style.padding = '10px';
  48. likeCounter.style.borderRadius = '5px';
  49. likeCounter.style.marginBottom = '10px';
  50. container.appendChild(likeCounter);
  51.  
  52. // Função para atualizar a contagem de likes na página
  53. function updateLikeCounter() {
  54. likeCounter.textContent = `Likes feitos: ${likesCount}`;
  55. }
  56.  
  57. // Criação do botão de pausar/continuar
  58. const pauseButton = document.createElement('button');
  59. pauseButton.textContent = 'Pausar';
  60. pauseButton.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  61. pauseButton.style.color = 'white';
  62. pauseButton.style.padding = '10px';
  63. pauseButton.style.borderRadius = '5px';
  64. container.appendChild(pauseButton);
  65.  
  66. pauseButton.addEventListener('click', () => {
  67. isPaused = !isPaused; // Alterna entre pausar e continuar
  68. pauseButton.textContent = isPaused ? 'Continuar' : 'Pausar'; // Altera o texto do botão
  69. });
  70.  
  71. // Função para gerar o seletor do botão de "Like"
  72. function getLikeButton() {
  73. return document.querySelector(likeButtonSelector);
  74. }
  75.  
  76. // Função para fechar o modal automaticamente
  77. function closeModal() {
  78. const modalButton = document.querySelector(modalCloseButtonSelector);
  79. if (modalButton) {
  80. modalButton.click();
  81. console.log("Modal fechado automaticamente.");
  82. }
  83. }
  84.  
  85. // Função para executar o "autoLike"
  86. function autoLike() {
  87. if (isPaused) return; // Se o script estiver pausado, não faz nada
  88.  
  89. // Fecha o modal, se ele estiver aberto
  90. closeModal();
  91.  
  92. const likeButton = getLikeButton();
  93.  
  94. if (likeButton) {
  95. console.log("Botão de Like encontrado.");
  96. if (likeButton.offsetParent !== null) {
  97. likeButton.click();
  98. likesCount++;
  99. localStorage.setItem('likesCount', likesCount); // Armazena o número de likes
  100. missedAttempts = 0; // Reseta tentativas consecutivas sem sucesso
  101. updateLikeCounter(); // Atualiza a contagem na página
  102. console.log(`Botão de Like clicado com sucesso! Total de likes: ${likesCount}`);
  103. } else {
  104. console.log('Botão de Like está invisível. Tentando novamente...');
  105. missedAttempts++;
  106. }
  107. } else {
  108. console.log('Botão de Like não encontrado. Tentando novamente...');
  109. missedAttempts++;
  110. }
  111.  
  112. // Verifica se deve recarregar a página
  113. if (missedAttempts >= maxMissedAttempts) {
  114. console.log(`Botão não encontrado após ${missedAttempts} tentativas consecutivas. Recarregando a página...`);
  115. location.reload(); // Recarrega a página
  116. }
  117. }
  118.  
  119. // Inicia o processo com intervalos
  120. setInterval(autoLike, interval);
  121.  
  122. // Atualiza a contagem inicial
  123. updateLikeCounter();
  124.  
  125. // Função para permitir mover o contêiner (contador + botão de pausar) livremente
  126. let offsetX = 0, offsetY = 0;
  127.  
  128. container.addEventListener('mousedown', (e) => {
  129. offsetX = e.clientX - container.getBoundingClientRect().left;
  130. offsetY = e.clientY - container.getBoundingClientRect().top;
  131. document.addEventListener('mousemove', moveContainer);
  132. document.addEventListener('mouseup', () => {
  133. document.removeEventListener('mousemove', moveContainer);
  134. });
  135. });
  136.  
  137. function moveContainer(e) {
  138. container.style.left = `${e.clientX - offsetX}px`;
  139. container.style.top = `${e.clientY - offsetY}px`;
  140. }
  141.  
  142. // Criação do botão para atualizar os seletores manualmente
  143. const updateButton = document.createElement('button');
  144. updateButton.textContent = 'Atualizar Seletores';
  145. updateButton.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  146. updateButton.style.color = 'white';
  147. updateButton.style.padding = '10px';
  148. updateButton.style.borderRadius = '5px';
  149. updateButton.style.marginTop = '10px';
  150. container.appendChild(updateButton);
  151.  
  152. // Adiciona o evento de clique ao botão de atualizar seletores
  153. updateButton.addEventListener('click', () => {
  154. updateSelectors(); // Atualiza os seletores manualmente
  155. alert('Seletores atualizados!');
  156. });
  157. })();