Advertisement
videogamesm12

RBXScraper

Dec 2nd, 2022
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.29 KB | None | 0 0
  1. from dataclasses import dataclass
  2. import pathlib
  3. import requests
  4. import re
  5. import os
  6. import aria2p
  7. import threading
  8.  
  9. pattern = re.compile("^New (WindowsPlayer|Studio|Studio64|Client|MFCStudio) (version-[A-z0-9]{16}) at ([0-9]{1,2}\/[0-9]{2}\/[0-9]{4} [0-9]{1,2}:[0-9]{2}:[0-9]{2} (AM|PM))(, file ver(s)?ion: [0-9], [0-9]{1,}, 0, [0-9]{1,})?(, git hash: ([A-z0-9]{1,} ))?...(Done!)?")
  10. filePattern = re.compile("^([A-z0-9-]{1,}\.[A-z0-9]{1,})")
  11. #--
  12. domain = "http://setup.roblox.com/"
  13. session = requests.Session()
  14. #--
  15. history = session.get(f"{domain}DeployHistory.txt").text
  16. versions = []
  17. manifests = {}
  18. aria2 = aria2p.API(
  19.     aria2p.Client(
  20.         host = "http://localhost",
  21.         port = 6800
  22.     )
  23. )
  24. done = False
  25.  
  26. @dataclass
  27. class Version:
  28.     fullstring: str
  29.     type: str
  30.     id: str
  31.     deployDate: str
  32.  
  33. class ThreadForShit(threading.Thread):
  34.     def run(self):
  35.         while not done or len(list(manifests)) > 0:
  36.             for key in list(manifests):
  37.                 manifest = manifests[key]
  38.                 print(f"Sending manifests for version {key} to queue")
  39.                 aria2.add(f"{domain}{key}-rbxPkgManifest.txt", options = {"out": f"{key}/{key}-rbxPkgManifest.txt"})
  40.                 aria2.add(f"{domain}{key}-rbxManifest.txt", options = {"out": f"{key}/{key}-rbxManifest.txt"})
  41.                 for line in manifest.split('\n'):
  42.                     match = filePattern.search(line)                   
  43.                     if match:
  44.                         print(f"Sending entry for version {key}, file {match.group(1)} to queue")
  45.                         aria2.add(f"{domain}{key}-{match.group(1)}", options = {"out": f"{key}/{key}-{match.group(1)}"})
  46.                
  47.                 del manifests[key]
  48.  
  49. # Parse DeployHistory
  50. for line in history.split('\n'):
  51.     match = pattern.search(line)
  52.    
  53.     if match:
  54.         version = Version(line, match.group(1), match.group(2), match.group(3))
  55.         versions.append(version)
  56.         print(version.fullstring)
  57.  
  58. manifestGrabber = ThreadForShit()
  59. manifestGrabber.start()
  60.  
  61. # Grab metadata for the version
  62. for version in versions:
  63.     try:
  64.         meta = session.get(f"{domain}{version.id}-rbxPkgManifest.txt").text
  65.        
  66.         if "AccessDenied" in meta:
  67.             continue
  68.         else:
  69.             print(f"Successfully grabbed meta for {version.id}, deployed at {version.deployDate}")
  70.             manifests[version.id] = meta
  71.     except KeyboardInterrupt as interrupt:
  72.         done = True
  73.         break;
  74.     except requests.exceptions.HTTPError as error:
  75.         continue
  76.  
  77. done = True
  78. print("Done scraping!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement