Balance Changer

Скрытно меняет баланс на форуме.

  1. // ==UserScript==
  2. // @name Balance Changer
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description Скрытно меняет баланс на форуме.
  6. // @author eretly
  7. // @match https://lzt.market/*
  8. // @match https://lolz.live/*
  9. // @license MIT
  10. // @run-at document-start
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17. const amountToAdd = 24369.32;
  18.  
  19. function formatNumber(num) {
  20. let formattedNum = num.toLocaleString('ru-RU', { minimumFractionDigits: 2 });
  21.  
  22. if (formattedNum.endsWith(',00')) {
  23. formattedNum = formattedNum.slice(0, -3);
  24. }
  25.  
  26. return formattedNum;
  27. }
  28.  
  29. function formatContestPrize(num) {
  30. const integerOnly = parseInt(num.toString().split(/[,.]/)[0]);
  31. return integerOnly.toLocaleString('ru-RU');
  32. }
  33.  
  34. function modifyMarketBalance() {
  35. const availableBalanceSpan = document.querySelector('.marketRefillBalance--Row .explain .MarketAvailableBalance[data-value="0.00"]');
  36.  
  37. if (availableBalanceSpan && !availableBalanceSpan.dataset.modified) {
  38. try {
  39. let currentBalance = parseFloat(availableBalanceSpan.textContent.replace(/[^\d,.-]/g, '').replace(',', '.')) || 0;
  40.  
  41. let newBalance = currentBalance + amountToAdd;
  42.  
  43. let formattedBalance = formatNumber(newBalance);
  44.  
  45. availableBalanceSpan.textContent = formattedBalance + ' ₽';
  46.  
  47. availableBalanceSpan.dataset.modified = "true";
  48.  
  49. } catch (e) {
  50. console.error("Error", e);
  51. }
  52. }
  53. }
  54.  
  55. function modifyBalance(element) {
  56. if (!element || element.dataset.modified) return;
  57.  
  58. try {
  59. let currentBalance = parseFloat(element.textContent.replace(/\s/g, '').replace(',', '.')) || 0;
  60. let newBalance = currentBalance + amountToAdd;
  61. element.textContent = formatNumber(newBalance);
  62. element.dataset.modified = "true";
  63. } catch (e) {
  64. console.error("Error", e);
  65. }
  66. }
  67.  
  68. function modifyMethodBalance(element) {
  69. if (!element || element.dataset.modified) return;
  70.  
  71. try {
  72. const text = element.textContent.trim();
  73. const balanceMatch = text.match(/\(([\d\s,.-]+)\s*₽\)/);
  74.  
  75. if (balanceMatch) {
  76. let currentBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
  77. let newBalance = currentBalance + amountToAdd;
  78. let formattedBalance = formatNumber(newBalance);
  79.  
  80. const newText = text.replace(/\([\d\s,.-]+\s*₽\)/, `(${formattedBalance} ₽)`);
  81. element.textContent = newText;
  82.  
  83. element.dataset.modified = "true";
  84.  
  85. }
  86. } catch (e) {
  87. console.error("Error", e);
  88. }
  89. }
  90.  
  91. function modifyContestBalance() {
  92. const contestBalanceElement = document.querySelector('#ContestPrizType--money .explain');
  93. if (contestBalanceElement && !contestBalanceElement.dataset.modified) {
  94. try {
  95. const text = contestBalanceElement.textContent.trim();
  96. const balanceMatch = text.match(/Доступный баланс\s*([\d\s,.-]+)\s*₽/);
  97.  
  98. if (balanceMatch) {
  99. let currentBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
  100. let newBalance = currentBalance + amountToAdd;
  101. let formattedBalance = formatNumber(newBalance);
  102.  
  103. const newText = text.replace(/Доступный баланс\s*[\d\s,.-]+\s*₽/, `Доступный баланс ${formattedBalance} ₽`);
  104. contestBalanceElement.textContent = newText;
  105.  
  106. contestBalanceElement.dataset.modified = "true";
  107. }
  108. } catch (e) {
  109. console.error("Error", e);
  110. }
  111. }
  112. }
  113.  
  114. function modifyTransferAmount() {
  115. document.querySelectorAll('.bigTextHeading').forEach(element => {
  116. if (!element.dataset.modified && element.textContent.includes("Сумма перевода (Доступно для перевода")) {
  117. try {
  118. let match = element.textContent.match(/Доступно для перевода ([\d\s,.-]+)₽/);
  119. if (match) {
  120. let currentBalance = parseFloat(match[1].replace(/\s/g, '').replace(',', '.')) || 0;
  121. let newBalance = currentBalance + amountToAdd;
  122. let formattedBalance = formatNumber(newBalance);
  123.  
  124. element.innerHTML = `Сумма перевода (Доступно для перевода ${formattedBalance} ₽)`;
  125. element.dataset.modified = "true";
  126. }
  127. } catch (e) {
  128. console.error("Ошибка при изменении суммы перевода:", e);
  129. }
  130. }
  131. });
  132. }
  133.  
  134. function modifyLastTransferAmount() {
  135. const transferSpans = document.querySelectorAll('.Transfer[data-amount]');
  136.  
  137. if (transferSpans.length > 0) {
  138. const lastTransfer = transferSpans[transferSpans.length - 1];
  139.  
  140. if (!lastTransfer.dataset.modified) {
  141. try {
  142. let currentAmount = parseFloat(lastTransfer.dataset.amount.replace(/\s/g, '').replace(',', '.')) || 0;
  143. let newAmount = currentAmount + amountToAdd;
  144. let formattedAmount = formatNumber(newAmount);
  145.  
  146. lastTransfer.dataset.amount = formattedAmount;
  147. lastTransfer.querySelector('span:first-child').textContent = formattedAmount;
  148.  
  149. lastTransfer.dataset.modified = "true";
  150. } catch (e) {
  151. console.error("Ошибка при изменении суммы в <span class='Transfer'>:", e);
  152. }
  153. }
  154. }
  155. }
  156.  
  157. function modifyPayoutBalance() {
  158. if (!window.location.href.includes('https://lzt.market/balance/payout')) return;
  159.  
  160. const payoutBalanceElement = document.querySelector('.explain .MarketAvailableBalance');
  161. if (payoutBalanceElement && !payoutBalanceElement.dataset.modified) {
  162. try {
  163. let currentBalance = parseFloat(payoutBalanceElement.textContent.replace(/[^\d,.-]/g, '').replace(',', '.')) || 0;
  164.  
  165. let newBalance = currentBalance + amountToAdd;
  166.  
  167. let formattedBalance = formatNumber(newBalance);
  168.  
  169. payoutBalanceElement.textContent = formattedBalance + ' ₽';
  170.  
  171. payoutBalanceElement.dataset.modified = "true";
  172.  
  173. } catch (e) {
  174. console.error("Error", e);
  175. }
  176. }
  177. }
  178.  
  179. function updateUI() {
  180. const notEnoughMoneyElement = document.getElementById('NotEnoughMoney');
  181. const totalMoneyPrizeElement = document.getElementById('TotalMoneyPrizeData');
  182. const prizeInputElement = document.getElementById('prize_data_money');
  183. const contestBalanceElement = document.querySelector('#ContestPrizType--money .explain');
  184.  
  185. if (!contestBalanceElement || !prizeInputElement || !totalMoneyPrizeElement || !notEnoughMoneyElement) return;
  186.  
  187. // Получаем измененный баланс
  188. const balanceMatch = contestBalanceElement.textContent.match(/Доступный баланс\s*([\d\s,.-]+)\s*₽/);
  189. if (!balanceMatch) return;
  190.  
  191. const availableBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
  192.  
  193. // Получаем введенную сумму
  194. const prizeAmount = parseFloat(prizeInputElement.value.replace(/\s/g, '').replace(',', '.')) || 0;
  195.  
  196. if (prizeAmount === 0 || prizeInputElement.value.trim() === '') {
  197. // Если сумма равна 0 или поле пустое
  198. notEnoughMoneyElement.style.display = 'none'; // Скрываем красное сообщение
  199. totalMoneyPrizeElement.style.display = 'none'; // Скрываем блок списания
  200. } else if (prizeAmount <= availableBalance) {
  201. // Если сумма меньше или равна балансу
  202. notEnoughMoneyElement.style.display = 'none'; // Скрываем красное сообщение
  203. totalMoneyPrizeElement.style.display = 'block'; // Показываем блок списания
  204.  
  205. // Обновляем сумму списания с удалением десятичной части и с пробелами между тысячами
  206. const valueElement = totalMoneyPrizeElement.querySelector('.Value');
  207. if (valueElement) {
  208. valueElement.textContent = formatContestPrize(prizeAmount);
  209. }
  210. } else {
  211. // Если сумма больше баланса
  212. notEnoughMoneyElement.style.display = 'block'; // Показываем красное сообщение
  213. totalMoneyPrizeElement.style.display = 'none'; // Скрываем блок списания
  214. }
  215. }
  216.  
  217. function setupPrizeInputListener() {
  218. const prizeInputElement = document.getElementById('prize_data_money');
  219. if (prizeInputElement) {
  220. prizeInputElement.addEventListener('input', () => {
  221. setTimeout(updateUI, 100);
  222. });
  223. }
  224. }
  225.  
  226. function applyChanges() {
  227. if (window.location.href.includes('lzt.market')) {
  228. document.querySelectorAll('.balanceValue, .Incomes').forEach(modifyBalance);
  229. modifyMarketBalance();
  230. document.querySelectorAll('.Method.method.full.balance.balance, .Method.method.full.balance.balance.selected').forEach(modifyMethodBalance);
  231. modifyTransferAmount();
  232. modifyLastTransferAmount();
  233. modifyPayoutBalance();
  234. }
  235.  
  236. if (window.location.href.includes('lolz.live')) {
  237. lolzLiveSpecificFix();
  238. modifyContestBalance();
  239. updateUI();
  240. setupPrizeInputListener();
  241. }
  242.  
  243. document.documentElement.style.display = "";
  244. }
  245.  
  246.  
  247. function startObserver() {
  248. if (!document.body) {
  249. setTimeout(startObserver, 100);
  250. return;
  251. }
  252.  
  253. const observer = new MutationObserver((mutationsList) => {
  254. for (const mutation of mutationsList) {
  255. if (mutation.type === 'childList') {
  256. mutation.addedNodes.forEach(node => {
  257. if (node.nodeType === Node.ELEMENT_NODE) {
  258. const methodBalanceElements = node.querySelectorAll ? node.querySelectorAll('.Method.method.full.balance.balance, .Method.method.full.balance.balance.selected') : [];
  259. methodBalanceElements.forEach(modifyMethodBalance);
  260.  
  261. if (node.id === 'ContestPrizType--money' || node.querySelector('#ContestPrizType--money')) {
  262. modifyContestBalance();
  263. updateUI();
  264. setupPrizeInputListener();
  265. }
  266.  
  267. if (window.location.href.includes('https://lzt.market/balance/payout')) {
  268. modifyPayoutBalance();
  269. }
  270.  
  271. modifyTransferAmount();
  272. modifyLastTransferAmount();
  273. }
  274. });
  275. }
  276. }
  277. });
  278.  
  279. observer.observe(document.body, { childList: true, subtree: true });
  280. }
  281.  
  282. startObserver();
  283.  
  284. document.addEventListener('DOMContentLoaded', () => {
  285. setTimeout(applyChanges, 100);
  286. });
  287.  
  288. window.addEventListener('load', () => {
  289. setTimeout(applyChanges, 100);
  290. });
  291.  
  292. function lolzLiveSpecificFix() {
  293. const possibleSelectors = [
  294. '#AccountMenu .balanceValue',
  295. '.balanceRow .balanceValue',
  296. '.Menu.HeaderMenu .balanceValue',
  297. '.balanceValue'
  298. ];
  299.  
  300. for (let selector of possibleSelectors) {
  301. const elements = document.querySelectorAll(selector);
  302. if (elements.length > 0) {
  303. elements.forEach(modifyBalance);
  304. }
  305. }
  306. }
  307.  
  308. document.documentElement.style.display = "none";
  309. setTimeout(() => {
  310. document.documentElement.style.display = "";
  311. }, 1);
  312.  
  313. const observer = new MutationObserver((mutationsList) => {
  314. for (const mutation of mutationsList) {
  315. if (mutation.type === 'childList') {
  316. mutation.addedNodes.forEach(node => {
  317. if (node.nodeType === Node.ELEMENT_NODE) {
  318. applyChanges();
  319. }
  320. });
  321. }
  322. }
  323. });
  324.  
  325. observer.observe(document.body, { childList: true, subtree: true });
  326.  
  327. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址