NBTHUB Bypass Luarmor Api

Automatically clicks the next button on the specified page after 3 seconds.

目前为 2024-12-10 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name NBTHUB Bypass Luarmor Api
  3. // @namespace OmegaLolBypasser
  4. // @namespace https://ads.luarmor.net/
  5. // @version 1.2
  6. // @description Automatically clicks the next button on the specified page after 3 seconds.
  7. // @author Your Name
  8. // @match *://loot-link.com/s?*
  9. // @match *://loot-links.com/s?*
  10. // @match *://lootlink.org/s?*
  11. // @match *://lootlinks.co/s?*
  12. // @match *://lootdest.info/s?*
  13. // @match *://lootdest.org/s?*
  14. // @match *://lootdest.com/s?*
  15. // @match *://links-loot.com/s?*
  16. // @match *://linksloot.net/s?*
  17. // @match https://ads.luarmor.net/get_key?for=Native_Main-FvLcrZfqqbWo
  18. // @match https://ads.luarmor.net/get_key?for=-FvLcrZfqqbWo
  19. // @match https://ads.luarmor.net/
  20. // @icon https://www.google.com/s2/favicons?domain=luarmor.net
  21. // @grant none
  22. // ==/UserScript==
  23.  
  24. (function() {
  25. 'use strict';
  26.  
  27. const hostname = window.location.hostname;
  28.  
  29. if (hostname === 'ads.luarmor.net') {
  30. function waitForElement(selector, callback, interval = 100, timeout = 5000) {
  31. const startTime = Date.now();
  32. const timer = setInterval(() => {
  33. const element = document.querySelector(selector);
  34. if (element) {
  35. clearInterval(timer);
  36. callback(element);
  37. } else if (Date.now() - startTime > timeout) {
  38. clearInterval(timer);
  39. console.error(`Element with selector "${selector}" not found within timeout.`);
  40. }
  41. }, interval);
  42. }
  43.  
  44. waitForElement('#nextbtn', (button) => {
  45. console.log('Next button found. Waiting for 3 seconds...');
  46. setTimeout(() => {
  47. console.log('Clicking the button now.');
  48. button.click();
  49. }, 5000);
  50. });
  51.  
  52. }
  53. else if (['loot-link.com', 'loot-links.com', 'lootlink.org', 'lootlinks.co',
  54. 'lootdest.info', 'lootdest.org', 'lootdest.com',
  55. 'links-loot.com', 'linksloot.net'].includes(hostname)) {
  56. function decodeURI(encodedString, prefixLength = 5) {
  57. let decodedString = '';
  58. const base64Decoded = atob(encodedString);
  59. const prefix = base64Decoded.substring(0, prefixLength);
  60. const encodedPortion = base64Decoded.substring(prefixLength);
  61.  
  62. for (let i = 0; i < encodedPortion.length; i++) {
  63. const encodedChar = encodedPortion.charCodeAt(i);
  64. const prefixChar = prefix.charCodeAt(i % prefix.length);
  65. const decodedChar = encodedChar ^ prefixChar;
  66. decodedString += String.fromCharCode(decodedChar);
  67. }
  68.  
  69. return decodedString;
  70. }
  71.  
  72. (function() {
  73. 'use strict';
  74.  
  75. const waitForElementAndModifyParent = () => {
  76. const modifyParentElement = (targetElement) => {
  77. const parentElement = targetElement.parentElement;
  78.  
  79. if (parentElement) {
  80. const images = document.querySelectorAll('img');
  81. let countdownSeconds = 60;
  82.  
  83. for (let img of images) {
  84. if (img.src.includes('eye.png')) {
  85. countdownSeconds = 13;
  86. break;
  87. } else if (img.src.includes('bell.png')) {
  88. countdownSeconds = 30;
  89. break;
  90. } else if (img.src.includes('apps.png') || img.src.includes('fire.png')) {
  91. countdownSeconds = 60;
  92. break;
  93. } else if (img.src.includes('gamers.png')) {
  94. countdownSeconds = 90;
  95. break;
  96. }
  97. }
  98.  
  99. parentElement.innerHTML = '';
  100.  
  101. const popupHTML = `
  102. <div id="tm-overlay" style="position:fixed; top:0; left:0; width:100%; height:100%; z-index:999999; display:flex; justify-content:center; align-items:center; overflow:hidden;">
  103. <video autoplay loop muted style="position:absolute; object-fit:cover; width:100%; height:100%;">
  104. <source src="https://nbthub.netlify.app/background.mp4" type="video/mp4">
  105. </video>
  106. <div style="position:relative; z-index:1; text-align:center; color:white;">
  107. <center>
  108. <div id="tm-popup" style="padding:40px; background:rgba(255,255,255,0.8); border-radius:5px; box-shadow:0 2px 10px rgba(0,0,0,0.5);">
  109. <div id="countdown" style="margin-bottom:20px;">
  110. <h4>(รอ 60 วิ)</h4>
  111. </div>
  112. <a href="https://nbthub.netlify.app/" target="_blank" style="text-decoration:none;">
  113. <button id="nbthub-button" style="padding:10px 20px; background:#4CAF50; color:white; border:none; border-radius:5px; cursor:pointer; font-size:16px;">
  114. NBTHUB
  115. </button>
  116. </a>
  117. </div>
  118. </center>
  119. </div>
  120. </div>
  121. `;
  122.  
  123. const startCountdown = (duration) => {
  124. let remaining = duration;
  125. const countdownTimer = setInterval(() => {
  126. remaining--;
  127. document.getElementById('countdown').textContent = `(รอ ${remaining} วิ)`;
  128. if (remaining <= 0) clearInterval(countdownTimer);
  129. }, 1000);
  130. };
  131.  
  132. const spinnerCSS = `
  133. .wheel-and-hamster {
  134. --dur: 1s;
  135. position: relative;
  136. width: 12em;
  137. height: 12em;
  138. margin: auto;
  139. }
  140. .wheel,
  141. .hamster,
  142. .hamster div,
  143. .spoke {
  144. position: absolute;
  145. }
  146. .wheel,
  147. .spoke {
  148. border-radius: 50%;
  149. top: 0;
  150. left: 0;
  151. width: 100%;
  152. height: 100%;
  153. }
  154. .wheel {
  155. background: radial-gradient(100% 100% at center,hsla(0,0%,60%,0) 47.8%,hsl(0,0%,60%) 48%);
  156. z-index: 2;
  157. }
  158. .hamster {
  159. animation: hamster var(--dur) ease-in-out infinite;
  160. top: 50%;
  161. left: calc(50% - 3.5em);
  162. width: 7em;
  163. height: 3.75em;
  164. transform: rotate(4deg) translate(-0.8em,1.85em);
  165. transform-origin: 50% 0;
  166. z-index: 1;
  167. }
  168. .hamster__head {
  169. animation: hamsterHead var(--dur) ease-in-out infinite;
  170. background: hsl(30,90%,55%);
  171. border-radius: 70% 30% 0 100% / 40% 25% 25% 60%;
  172. box-shadow:
  173. 0 -0.25em 0 hsl(30,90%,80%) inset,
  174. 0.75em -1.55em 0 hsl(30,90%,90%) inset;
  175. top: 0;
  176. left: -2em;
  177. width: 2.75em;
  178. height: 2.5em;
  179. transform-origin: 100% 50%;
  180. }
  181. .hamster__ear {
  182. animation: hamsterEar var(--dur) ease-in-out infinite;
  183. background: hsl(0,90%,85%);
  184. border-radius: 50%;
  185. box-shadow: -0.25em 0 hsl(30,90%,55%) inset;
  186. top: -0.25em;
  187. right: -0.25em;
  188. width: 0.75em;
  189. height: 0.75em;
  190. transform-origin: 50% 75%;
  191. }
  192. .hamster__eye {
  193. animation: hamsterEye var(--dur) linear infinite;
  194. background-color: hsl(0,0%,0%);
  195. border-radius: 50%;
  196. top: 0.375em;
  197. left: 1.25em;
  198. width: 0.5em;
  199. height: 0.5em;
  200. }
  201. .hamster__nose {
  202. background: hsl(0,90%,75%);
  203. border-radius: 35% 65% 85% 15% / 70% 50% 50% 30%;
  204. top: 0.75em;
  205. left: 0;
  206. width: 0.2em;
  207. height: 0.25em;
  208. }
  209. .hamster__body {
  210. animation: hamsterBody var(--dur) ease-in-out infinite;
  211. background: hsl(30,90%,90%);
  212. border-radius: 50% 30% 50% 30% / 15% 60% 40% 40%;
  213. box-shadow:
  214. 0.1em 0.75em 0 hsl(30,90%,55%) inset,
  215. 0.15em -0.5em 0 hsl(30,90%,80%) inset;
  216. top: 0.25em;
  217. left: 2em;
  218. width: 4.5em;
  219. height: 3em;
  220. transform-origin: 17% 50%;
  221. transform-style: preserve-3d;
  222. }
  223. .hamster__limb--fr,
  224. .hamster__limb--fl {
  225. clip-path: polygon(0 0,100% 0,70% 80%,60% 100%,0% 100%,40% 80%);
  226. top: 2em;
  227. left: 0.5em;
  228. width: 1em;
  229. height: 1.5em;
  230. transform-origin: 50% 0;
  231. }
  232. .hamster__limb--fr {
  233. animation: hamsterFRLimb var(--dur) linear infinite;
  234. background: linear-gradient(hsl(30,90%,80%) 80%,hsl(0,90%,75%) 80%);
  235. transform: rotate(15deg) translateZ(-1px);
  236. }
  237. .hamster__limb--fl {
  238. animation: hamsterFLLimb var(--dur) linear infinite;
  239. background: linear-gradient(hsl(30,90%,90%) 80%,hsl(0,90%,85%) 80%);
  240. transform: rotate(15deg);
  241. }
  242. .hamster__limb--br,
  243. .hamster__limb--bl {
  244. border-radius: 0.75em 0.75em 0 0;
  245. clip-path: polygon(0 0,100% 0,100% 30%,70% 90%,70% 100%,30% 100%,40% 90%,0% 30%);
  246. top: 1em;
  247. left: 2.8em;
  248. width: 1.5em;
  249. height: 2.5em;
  250. transform-origin: 50% 30%;
  251. }
  252. .hamster__limb--br {
  253. animation: hamsterBRLimb var(--dur) linear infinite;
  254. background: linear-gradient(hsl(30,90%,80%) 90%,hsl(0,90%,75%) 90%);
  255. transform: rotate(-25deg) translateZ(-1px);
  256. }
  257. .hamster__limb--bl {
  258. animation: hamsterBLLimb var(--dur) linear infinite;
  259. background: linear-gradient(hsl(30,90%,90%) 90%,hsl(0,90%,85%) 90%);
  260. transform: rotate(-25deg);
  261. }
  262. .hamster__tail {
  263. animation: hamsterTail var(--dur) linear infinite;
  264. background: hsl(0,90%,85%);
  265. border-radius: 0.25em 50% 50% 0.25em;
  266. box-shadow: 0 -0.2em 0 hsl(0,90%,75%) inset;
  267. top: 1.5em;
  268. right: -0.5em;
  269. width: 1em;
  270. height: 0.5em;
  271. transform: rotate(30deg) translateZ(-1px);
  272. transform-origin: 0.25em 0.25em;
  273. }
  274. .spoke {
  275. animation: spoke var(--dur) linear infinite;
  276. background:
  277. radial-gradient(100% 100% at center,hsl(0,0%,60%) 4.8%,hsla(0,0%,60%,0) 5%),
  278. linear-gradient(hsla(0,0%,55%,0) 46.9%,hsl(0,0%,65%) 47% 52.9%,hsla(0,0%,65%,0) 53%) 50% 50% / 99% 99% no-repeat;
  279. }
  280.  
  281. /* Animations */
  282. @keyframes hamster {
  283. from, to { transform: rotate(4deg) translate(-0.8em,1.85em); }
  284. 50% { transform: rotate(0) translate(-0.8em,1.85em); }
  285. }
  286. @keyframes hamsterHead {
  287. from, 25%, 50%, 75%, to { transform: rotate(0); }
  288. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(8deg); }
  289. }
  290. @keyframes hamsterEye {
  291. from, 90%, to { transform: scaleY(1); }
  292. 95% { transform: scaleY(0); }
  293. }
  294. @keyframes hamsterEar {
  295. from, 25%, 50%, 75%, to { transform: rotate(0); }
  296. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(12deg); }
  297. }
  298. @keyframes hamsterBody {
  299. from, 25%, 50%, 75%, to { transform: rotate(0); }
  300. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-2deg); }
  301. }
  302. @keyframes hamsterFRLimb {
  303. from, 25%, 50%, 75%, to { transform: rotate(50deg) translateZ(-1px); }
  304. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-30deg) translateZ(-1px); }
  305. }
  306. @keyframes hamsterFLLimb {
  307. from, 25%, 50%, 75%, to { transform: rotate(-30deg); }
  308. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(50deg); }
  309. }
  310. @keyframes hamsterBRLimb {
  311. from, 25%, 50%, 75%, to { transform: rotate(-60deg) translateZ(-1px); }
  312. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(20deg) translateZ(-1px); }
  313. }
  314. @keyframes hamsterBLLimb {
  315. from, 25%, 50%, 75%, to { transform: rotate(20deg); }
  316. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(-60deg); }
  317. }
  318. @keyframes hamsterTail {
  319. from, 25%, 50%, 75%, to { transform: rotate(30deg) translateZ(-1px); }
  320. 12.5%, 37.5%, 62.5%, 87.5% { transform: rotate(10deg) translateZ(-1px); }
  321. }
  322. @keyframes spoke {
  323. from { transform: rotate(0); }
  324. to { transform: rotate(-1turn); }
  325. }
  326. `;
  327.  
  328. parentElement.insertAdjacentHTML('afterbegin', popupHTML);
  329.  
  330. startCountdown(countdownSeconds);
  331.  
  332. const style = document.createElement('style');
  333. style.type = 'text/css';
  334. style.innerHTML = spinnerCSS;
  335. document.getElementsByTagName('head')[0].appendChild(style);
  336. }
  337. };
  338.  
  339. localStorage.clear();for(let i=0;i<100;i++)if(54!==i){var e,$="t_"+i,t={value:1,expiry:new Date().getTime()+6048e5};localStorage.setItem($,JSON.stringify(t))}
  340.  
  341. const observer = new MutationObserver((mutationsList, observer) => {
  342. for (const mutation of mutationsList) {
  343. if (mutation.type === 'childList') {
  344. const foundElement = Array.from(document.querySelectorAll('body *')).find(element => element.textContent.includes("UNLOCK CONTENT"));
  345. if (foundElement) {
  346. modifyParentElement(foundElement);
  347. observer.disconnect();
  348. break;
  349. }
  350. }
  351. }
  352. });
  353.  
  354. observer.observe(document.body, {
  355. childList: true,
  356. subtree: true
  357. });
  358. };
  359.  
  360. if (document.readyState === 'loading') {
  361. document.addEventListener('DOMContentLoaded', waitForElementAndModifyParent);
  362. } else {
  363. waitForElementAndModifyParent();
  364. }
  365. })();
  366.  
  367. (function() {
  368. const originalFetch = window.fetch;
  369. window.fetch = function(url, config) {
  370. if (url.includes(`${INCENTIVE_SYNCER_DOMAIN}/tc`)) {
  371. return originalFetch(url, config).then(response => {
  372. if (!response.ok) return JSON.stringify(response);
  373.  
  374. return response.clone().json().then(data => {
  375. let urid = "";
  376. let task_id = "";
  377. let action_pixel_url = "";
  378.  
  379. data.forEach(item => {
  380. urid = item.urid;
  381. task_id = 54;
  382. action_pixel_url = item.action_pixel_url;
  383. });
  384.  
  385. const ws = new WebSocket(`wss://${urid.substr(-5) % 3}.${INCENTIVE_SERVER_DOMAIN}/c?uid=${urid}&cat=${task_id}&key=${KEY}`);
  386.  
  387. ws.onopen = () => setInterval(() => ws.send('0'), 1000);
  388.  
  389. ws.onmessage = event => {
  390. if (event.data.includes('r:')) {
  391. PUBLISHER_LINK = event.data.replace('r:', '');
  392. }
  393. };
  394.  
  395. navigator.sendBeacon(`https://${urid.substr(-5) % 3}.${INCENTIVE_SERVER_DOMAIN}/st?uid=${urid}&cat=${task_id}`);
  396.  
  397. fetch(action_pixel_url);
  398.  
  399. fetch(`https://${INCENTIVE_SYNCER_DOMAIN}/td?ac=1&urid=${urid}&&cat=${task_id}&tid=${TID}`);
  400.  
  401. ws.onclose = () => window.location.href = decodeURIComponent(decodeURI(PUBLISHER_LINK));
  402.  
  403. return new Response(JSON.stringify(data), {
  404. status: response.status,
  405. statusText: response.statusText,
  406. headers: response.headers
  407. });
  408. });
  409. });
  410. }
  411.  
  412. return originalFetch(url, config);
  413. };
  414. })();
  415. }
  416. })();