astars.club Auto Helper

хелпер который помогает определить популярность карты на сайте astars.club

当前为 2025-01-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name astars.club Auto Helper
  3. // @namespace astars.club
  4. // @version 1.0
  5. // @description хелпер который помогает определить популярность карты на сайте astars.club
  6. // @author astars lover
  7. // @match https://astars.club/cards/pack/
  8. // @license MIT
  9. // @grant none
  10.  
  11.  
  12. // ==/UserScript==
  13.  
  14. // Функция для проверки наличия дива и добавления кнопки
  15. function checkAndAddButton() {
  16. const lootboxTitleDiv = document.querySelector('.lootbox__title');
  17.  
  18. if (lootboxTitleDiv && !document.querySelector('#fetchLinksButton')) {
  19. const button = document.createElement('button');
  20. button.id = 'fetchLinksButton';
  21. button.innerText = 'Обновить количество ссылок';
  22. button.style.marginTop = '10px';
  23. button.addEventListener('click', fetchAndAddIcons);
  24. lootboxTitleDiv.appendChild(button);
  25. }
  26. }
  27.  
  28. // Функция для получения данных и добавления иконок
  29. // Функция для проверки наличия дива и добавления кнопки
  30. function checkAndAddButton() {
  31. const lootboxTitleDiv = document.querySelector('.lootbox__title');
  32.  
  33. if (lootboxTitleDiv && !document.querySelector('#fetchLinksButton')) {
  34. const button = document.createElement('button');
  35. button.id = 'fetchLinksButton';
  36. button.innerText = 'Обновить количество ссылок';
  37. button.style.marginTop = '10px';
  38. button.addEventListener('click', fetchAndAddIcons);
  39. lootboxTitleDiv.appendChild(button);
  40. }
  41. }
  42.  
  43. // Функция для получения данных и добавления иконок
  44. async function fetchAndAddIcons() {
  45. const cards = document.querySelectorAll('.trade__main-item');
  46.  
  47. for (const card of cards) {
  48. const cardId = card.getAttribute('data-id');
  49. if (!cardId) continue;
  50.  
  51. try {
  52. // Получение количества "Желающих"
  53. const needResponse = await fetch(`https://astars.club/cards/${cardId}/users/need/`);
  54. let needCount = 0;
  55. if (needResponse.ok) {
  56. const needHtml = await needResponse.text();
  57. const needDoc = new DOMParser().parseFromString(needHtml, 'text/html');
  58. needCount = needDoc.querySelectorAll('.profile__friends-item').length;
  59.  
  60. // Проверяем наличие пагинации и умножаем количество ссылок
  61. const pagination = needDoc.querySelector('.pagination__pages');
  62. if (pagination) {
  63. const lastPageLink = pagination.querySelector('a:last-of-type');
  64. const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
  65. if (totalPages > 1) {
  66. needCount = needCount + ((totalPages - 1) * 35);
  67. }
  68. }
  69. }
  70.  
  71. // Получение количества "Готовых поменять"
  72. const tradeResponse = await fetch(`https://astars.club/cards/${cardId}/users/trade/`);
  73. let tradeCount = 0;
  74. if (tradeResponse.ok) {
  75. const tradeHtml = await tradeResponse.text();
  76. const tradeDoc = new DOMParser().parseFromString(tradeHtml, 'text/html');
  77. tradeCount = tradeDoc.querySelectorAll('.profile__friends-item').length;
  78.  
  79. // Проверяем наличие пагинации и умножаем количество ссылок
  80. const pagination = tradeDoc.querySelector('.pagination__pages');
  81. if (pagination) {
  82. const lastPageLink = pagination.querySelector('a:last-of-type');
  83. const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
  84. if (totalPages > 1) {
  85. tradeCount = tradeCount + ((totalPages - 1) * 35);
  86. }
  87. }
  88. }
  89.  
  90. // Получение популярности и ранга
  91. const popularityResponse = await fetch(`https://astars.club/cards/${cardId}/users/`);
  92. let popularityCount = 0;
  93. let rankText = '';
  94. if (popularityResponse.ok) {
  95. const popularityHtml = await popularityResponse.text();
  96. const popularityDoc = new DOMParser().parseFromString(popularityHtml, 'text/html');
  97. popularityCount = popularityDoc.querySelectorAll('.card-show__owner').length;
  98.  
  99. // Проверяем наличие пагинации и умножаем количество владельцев
  100. const pagination = popularityDoc.querySelector('.pagination__pages');
  101. if (pagination) {
  102. const lastPageLink = pagination.querySelector('a:last-of-type');
  103.  
  104. const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
  105. if (totalPages > 1) {
  106. popularityCount = popularityCount + ((totalPages - 1) * 35);
  107. }
  108. }
  109.  
  110. // Получение ранга
  111. const rankElement = popularityDoc.querySelector('.anime-cards__rank');
  112. if (rankElement) {
  113. rankText = rankElement.textContent.trim();
  114. }
  115. }
  116.  
  117. // Удаляем предыдущую иконку, если она есть
  118. let existingIcon = card.querySelector('.link-icon');
  119. if (existingIcon) {
  120. existingIcon.remove();
  121. }
  122.  
  123. // Добавляем иконку с количеством ссылок и "Готовы поменять"
  124. const icon = document.createElement('div');
  125. icon.className = 'link-icon';
  126. icon.style.position = 'absolute';
  127. icon.style.top = '5px';
  128. icon.style.right = '5px';
  129. icon.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
  130. icon.style.color = 'white';
  131. icon.style.padding = '5px';
  132. icon.style.borderRadius = '5px';
  133. icon.style.fontSize = '12px';
  134. icon.innerHTML = `Ранг: ${rankText}<br>Уже имеют: ${popularityCount}<br>Хотят получить: ${needCount}<br>Готовы поменять: ${tradeCount}`;
  135.  
  136. card.style.position = 'relative'; // Для позиционирования иконки
  137. card.appendChild(icon);
  138. } catch (error) {
  139. console.error(`Ошибка обработки карточки ${cardId}:`, error);
  140. }
  141. }
  142. }
  143.  
  144. (function() {
  145. 'use strict';
  146.  
  147. // Проверяем наличие дива каждые 5 секунд
  148. setInterval(checkAndAddButton, 5000);
  149. })();