spidey_v6

Untitled

Apr 18th, 2026
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. (async () => {
  2. const results = {};
  3. const delay = ms => new Promise(r => setTimeout(r, ms));
  4.  
  5. // Wait for element to appear
  6. const waitForElement = (selector, timeout = 8000) => {
  7. return new Promise((resolve, reject) => {
  8. const start = Date.now();
  9. const check = () => {
  10. const el = document.querySelector(selector);
  11. if (el) return resolve(el);
  12. if (Date.now() - start > timeout) return reject(new Error(`Timeout waiting for ${selector}`));
  13. setTimeout(check, 200);
  14. };
  15. check();
  16. });
  17. };
  18.  
  19. // Wait for element to be removed
  20. const waitForElementRemoved = (selector, timeout = 5000) => {
  21. return new Promise((resolve, reject) => {
  22. const start = Date.now();
  23. const check = () => {
  24. const el = document.querySelector(selector);
  25. if (!el) return resolve();
  26. if (Date.now() - start > timeout) return reject(new Error(`Timeout waiting for ${selector} to be removed`));
  27. setTimeout(check, 200);
  28. };
  29. check();
  30. });
  31. };
  32.  
  33. // Get initial list of case slugs and names
  34. const getCaseList = () => {
  35. const links = [...document.querySelectorAll('a.chest-slide[href^="/cases/"]')];
  36. return links.map(link => ({
  37. name: link.querySelector('span.color-text-3')?.textContent?.trim() || 'Unknown',
  38. href: link.href,
  39. slug: link.getAttribute('href')
  40. }));
  41. };
  42.  
  43. const allCases = getCaseList();
  44. console.log(`Found ${allCases.length} cases. Starting scrape...`);
  45.  
  46. for (let i = 0; i < allCases.length; i++) {
  47. const caseInfo = allCases[i];
  48. console.log(`[${i+1}/${allCases.length}] ${caseInfo.name}`);
  49.  
  50. try {
  51. // Re-query the case link to ensure it's fresh
  52. const currentLinks = [...document.querySelectorAll('a.chest-slide[href^="/cases/"]')];
  53. const targetLink = currentLinks.find(link => link.href === caseInfo.href);
  54.  
  55. if (!targetLink) {
  56. throw new Error('Case link not found in DOM (maybe page changed?)');
  57. }
  58.  
  59. // Click the case
  60. targetLink.click();
  61.  
  62. // Wait for loot container
  63. await waitForElement('.ChestGameLoot', 12000);
  64. await delay(1000); // extra render time
  65.  
  66. // Scrape items
  67. const slides = document.querySelectorAll('.ChestGameLoot .loot-slide');
  68. const items = [...slides].map(slide => {
  69. try {
  70. const nameEl = slide.querySelector('.loot-name');
  71. const name = nameEl?.textContent?.trim() || '';
  72. const img = slide.querySelector('.loot-icon img')?.src || '';
  73. const priceEl = slide.querySelector('.TokenText span.size-xs');
  74. const priceText = priceEl?.textContent?.trim() || '';
  75. const price = parseInt(priceText.replace(/,/g, ''), 10) || 0;
  76. const rateContainer = slide.querySelector('.justify-center.margin-top-2');
  77. const rateSpan = rateContainer?.querySelector('span.size-xxxs');
  78. const rateText = rateSpan?.textContent?.trim() || '';
  79. let rate = null;
  80. if (rateText.includes('%')) rate = parseFloat(rateText.replace('%', '')) || null;
  81. return { name, price, priceFormatted: priceText, dropRate: rate, dropRateFormatted: rateText, image: img };
  82. } catch (e) {
  83. return null;
  84. }
  85. }).filter(it => it && it.name);
  86.  
  87. results[caseInfo.name] = {
  88. slug: caseInfo.slug,
  89. url: caseInfo.href,
  90. itemCount: items.length,
  91. items
  92. };
  93. console.log(` ✓ ${items.length} items`);
  94.  
  95. // Go back to listing (works if the modal uses pushState)
  96. history.back();
  97. await waitForElementRemoved('.ChestGameLoot', 5000);
  98. await delay(500); // settle
  99.  
  100. } catch (e) {
  101. console.error(` ✗ Failed:`, e.message);
  102. results[caseInfo.name] = { slug: caseInfo.slug, url: caseInfo.href, error: e.message };
  103.  
  104. // Try to force close modal
  105. try {
  106. const backdrop = document.querySelector('.BaseElement.Backdrop');
  107. if (backdrop) backdrop.click();
  108. document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
  109. } catch (_) {}
  110.  
  111. // If we navigated away, go back
  112. if (window.location.href !== caseInfo.href) {
  113. history.back();
  114. }
  115. await delay(1000);
  116. }
  117.  
  118. // Extra delay between cases
  119. await delay(600 + Math.random() * 400);
  120. }
  121.  
  122. // Download JSON
  123. const blob = new Blob([JSON.stringify(results, null, 2)], { type: 'application/json' });
  124. const url = URL.createObjectURL(blob);
  125. const a = document.createElement('a');
  126. a.href = url;
  127. a.download = `goldpump_loot_${new Date().toISOString().slice(0,10)}.json`;
  128. a.click();
  129. URL.revokeObjectURL(url);
  130.  
  131. const total = Object.values(results).reduce((sum, c) => sum + (c.itemCount || 0), 0);
  132. console.log(`✅ Done! ${Object.keys(results).length} cases, ${total} items.`);
  133. return results;
  134. })();
Advertisement
Add Comment
Please, Sign In to add comment