Bumble Unblur with Names

Unblur Bumble beeline profiles and show names

  1. // ==UserScript==
  2. // @name Bumble Unblur with Names
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description Unblur Bumble beeline profiles and show names
  6. // @match https://bumble.com/*
  7. // @grant none
  8. // @license MIT
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. function getAuthToken() {
  15. // Buscar el token de autenticación en el localStorage
  16. const bumbleData = localStorage.getItem("bumble-app");
  17. if (bumbleData) {
  18. try {
  19. const parsed = JSON.parse(bumbleData);
  20. return parsed?.session?.access_token || null;
  21. } catch (e) {
  22. console.error("Error parsing Bumble data:", e);
  23. return null;
  24. }
  25. }
  26. return null;
  27. }
  28.  
  29. async function unblur() {
  30. const authToken = getAuthToken();
  31. if (!authToken) {
  32. console.error("Bumble Unblur: Auth token not found.");
  33. return;
  34. }
  35.  
  36. try {
  37. // Hacer la petición a la API de Bumble para obtener los perfiles
  38. const response = await fetch("https://bumble.com/mwebapi.phtml?SERVER_GET_ENCOUNTERS", {
  39. method: "POST",
  40. headers: {
  41. "Authorization": `Bearer ${authToken}`,
  42. "Content-Type": "application/json",
  43. "X-Client-Version": "4.13.0",
  44. },
  45. body: JSON.stringify({
  46. "$gpb": "badoo.bma.BadooMessage",
  47. "body": [{
  48. "message_type": 245,
  49. "server_get_encounters": {
  50. "number": 10,
  51. "context": 1,
  52. "user_field_filter": {
  53. "projection": [210, 370, 200, 230, 490, 540, 530, 560, 291, 732, 890]
  54. }
  55. }
  56. }],
  57. "message_id": 1,
  58. "version": 1,
  59. "is_background": false
  60. })
  61. });
  62.  
  63. if (!response.ok) {
  64. console.error(`Bumble Unblur: Fetch error - ${response.statusText}`);
  65. return;
  66. }
  67.  
  68. const data = await response.json();
  69. const profiles = data?.body?.[0]?.encounters?.results || [];
  70.  
  71. // Seleccionar los elementos del beeline en el DOM
  72. const beelineCards = document.querySelectorAll('.encounters-user-card');
  73.  
  74. profiles.forEach((profile, index) => {
  75. const card = beelineCards[index];
  76. if (card && profile.user) {
  77. // Desblurear la imagen
  78. const photos = card.querySelectorAll('.encounters-album-image');
  79. photos.forEach(photo => {
  80. photo.style.filter = 'none';
  81. });
  82.  
  83. // Añadir el nombre y la edad
  84. const nameDiv = document.createElement('div');
  85. nameDiv.textContent = `${profile.user.name}, ${profile.user.age}`;
  86. nameDiv.style.position = 'absolute';
  87. nameDiv.style.bottom = '10px';
  88. nameDiv.style.left = '10px';
  89. nameDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  90. nameDiv.style.color = 'white';
  91. nameDiv.style.padding = '5px 10px';
  92. nameDiv.style.borderRadius = '5px';
  93. nameDiv.style.fontSize = '14px';
  94. nameDiv.style.fontWeight = 'bold';
  95. nameDiv.style.zIndex = '1000';
  96.  
  97. // Remover cualquier nombre existente antes de añadir el nuevo
  98. const existingName = card.querySelector('.bumble-name-overlay');
  99. if (existingName) {
  100. existingName.remove();
  101. }
  102.  
  103. nameDiv.classList.add('bumble-name-overlay');
  104. card.appendChild(nameDiv);
  105. }
  106. });
  107.  
  108. console.log("Bumble Unblur: Images unblurred and names added successfully.");
  109. } catch (error) {
  110. console.error("Bumble Unblur: Error during unblur process.", error);
  111. }
  112. }
  113.  
  114. // Ejecutar cuando la página se carga
  115. window.addEventListener('load', () => {
  116. setTimeout(unblur, 3000);
  117. });
  118.  
  119. // Observer para manejar cambios dinámicos en la página
  120. const observer = new MutationObserver((mutations) => {
  121. for (const mutation of mutations) {
  122. if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
  123. unblur();
  124. }
  125. }
  126. });
  127.  
  128. const targetNode = document.body;
  129. const config = { childList: true, subtree: true };
  130. observer.observe(targetNode, config);
  131.  
  132. // Crear botón para activar manualmente
  133. const unblurButton = document.createElement('button');
  134. unblurButton.textContent = 'Desbloquear Perfiles';
  135. unblurButton.style.position = 'fixed';
  136. unblurButton.style.top = '10px';
  137. unblurButton.style.left = '50%';
  138. unblurButton.style.transform = 'translateX(-50%)';
  139. unblurButton.style.zIndex = '9999';
  140. unblurButton.style.backgroundColor = '#FDB333'; // Color amarillo de Bumble
  141. unblurButton.style.color = '#000000';
  142. unblurButton.style.border = 'none';
  143. unblurButton.style.borderRadius = '20px';
  144. unblurButton.style.padding = '10px 20px';
  145. unblurButton.style.fontSize = '16px';
  146. unblurButton.style.cursor = 'pointer';
  147. unblurButton.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.2)';
  148. unblurButton.style.transition = 'background-color 0.3s ease, transform 0.3s ease';
  149.  
  150. unblurButton.addEventListener('mouseover', function() {
  151. unblurButton.style.backgroundColor = '#FFE033';
  152. unblurButton.style.transform = 'translateX(-50%) scale(1.05)';
  153. });
  154.  
  155. unblurButton.addEventListener('mouseout', function() {
  156. unblurButton.style.backgroundColor = '#FDB333';
  157. unblurButton.style.transform = 'translateX(-50%) scale(1)';
  158. });
  159.  
  160. unblurButton.addEventListener('click', () => {
  161. unblur();
  162. unblurButton.textContent = '¡Desbloqueado!';
  163. setTimeout(() => {
  164. unblurButton.textContent = 'Desbloquear Perfiles';
  165. }, 2000);
  166. });
  167.  
  168. document.body.appendChild(unblurButton);
  169. })();