Wiiplay123

Roblox Character Grabber

Mar 28th, 2017
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.22 KB | None | 0 0
  1. import urllib2, json, datetime, os, zlib, urllib, socket, hashlib, time
  2. from HTMLParser import HTMLParser
  3. basepath = "E:\\3D Models\\Roblox Avatars\\"
  4. thumbres = [("512", "9975a2d4dc1ecf81f7e49916099c8c55"), ("420", "7e9f63b26670543d8296072a2738a519"), ("352", "e6b3a7112cb9efc436d518f171ac9b8e"),("100","")]
  5. def zipopen(url):
  6.     try:
  7.         response = urllib2.urlopen(url, None, socket._GLOBAL_DEFAULT_TIMEOUT)
  8.     except urllib2.HTTPError:
  9.         return ""
  10.     if response.info().getheader("Content-Encoding") == "gzip":
  11.         return zlib.decompress(response.read(),zlib.MAX_WBITS + 16)
  12.     else:
  13.         return response.read()
  14. def grabFriends(usrname):
  15.     nametoid = json.loads(zipopen("https://api.roblox.com/users/get-by-username?username=" + usrname))
  16.     if "Id" in nametoid:
  17.         print("Found " + usrname + ("'s best friends. ID: %d." % nametoid["Id"]))
  18.         return json.loads(zipopen("https://www.roblox.com/friends/json?userId=%d&pageSize=9000" % nametoid["Id"]))
  19.     else:
  20.         print("Avatar URL not found.")
  21.         return False
  22. def grabThumbnail(usrname, path):
  23.     for i in thumbres:
  24.         thumbhash = i[1]
  25.         thumb = ""
  26.         thumb = zipopen("https://www.roblox.com/Thumbs/Avatar.ashx?x=%s&y=%s&username=%s" % (i[0], i[0], usrname))
  27.         hsh = hashlib.md5()
  28.         hsh.update(thumb)
  29.         thumbhash = hsh.hexdigest()
  30.         if os.path.isfile("%s%s_thumb%s.png" % (path, usrname, i[0])):
  31.             print("%sx%s thumbnail for %s already saved!" % (i[0], i[0], usrname))
  32.             break
  33.         else:
  34.             if thumbhash == i[1]:
  35.                 print(usrname + "'s %sx%s avatar thumbnail is N/A! Trying next..." % (i[0],i[0]))
  36.             else:
  37.                 f = open("%s%s_thumb%s.png" % (path, usrname, i[0]),"wb")
  38.                 f.write(thumb)
  39.                 f.close()
  40.                 break
  41.            
  42. def grabUser(usrname, userid):
  43.     path = basepath + usrname + "\\" + datetime.date.strftime(datetime.date.today(),"%b %d, %Y") + "\\"
  44.     if not os.path.exists(path):
  45.         os.makedirs(path)
  46.     usrid = 0
  47.     if userid and userid > 0:
  48.         usrid = userid
  49.     else:
  50.         nametoid = json.loads(zipopen("https://api.roblox.com/users/get-by-username?username=" + usrname))
  51.         if "Id" in nametoid:
  52.             usrid = nametoid["Id"]
  53.         else:
  54.             print("User does not exist.")
  55.             return False
  56.     if usrid:
  57.         print("Downloading " + usrname + "'s avatar. ID: " + str(usrid) + ".")
  58.         grabThumbnail(usrname,path)
  59.         if os.path.isfile(path + usrname + "_blurb.txt") and os.path.isfile(path + usrname + "_pastnames.txt"):
  60.             print("Blurb and past names for %s already saved!" % usrname)
  61.         else:
  62.             page1 = zipopen("https://www.roblox.com/users/%d/profile/" % usrid)
  63.             if page1 == "":
  64.                 print("%s is banned, unable to retrieve blurb and past names." % usrname)
  65.             else:
  66.                 page1 = page1.decode("utf8")
  67.                 if os.path.isfile(path + usrname + "_blurb.txt"):
  68.                     print("Blurb for %s already saved!" % usrname)
  69.                 else:
  70.                     span = "<span class=\"profile-about-content-text"
  71.                     spanf = page1.find(span)
  72.                     page = page1[spanf + len(span):]
  73.                     if spanf:
  74.                         page = page[page.find(">") + len(">"):]
  75.                         page = page[:page.find("</span>")]
  76.                         f = open(path + usrname + "_blurb.txt","wb")
  77.                         oo = HTMLParser().unescape(page)
  78.                         f.write(oo.encode("utf8"))
  79.                         f.close()
  80.                     else:
  81.                         print("No blurb found for %s!" % usrname)
  82.                 if os.path.isfile(path + usrname + "_pastnames.txt"):
  83.                     print("Past names for %s already saved!" % usrname)
  84.                 else:
  85.                     span2 = "<span class=\"tooltip-pastnames\""
  86.                     span2f = page1.find(span2)
  87.                     if span2f > 0:
  88.                         page1 = page1[span2f + len(span2):]
  89.                         page1 = page1[page1.find("title=\"") + len("title=\""):]
  90.                         page1 = page1[:page1.find("\"")]
  91.                         f = open(path + usrname + "_pastnames.txt","wb")
  92.                         f.write(HTMLParser().unescape(page1))
  93.                         f.close()
  94.                     else:
  95.                         print("No past names found for %s!" % usrname)
  96.                         f = open(path + usrname + "_pastnames.txt","wb")
  97.                         f.write("(No past names found.)")
  98.                         f.close()
  99.         avatar = json.loads(zipopen("https://www.roblox.com/avatar-thumbnail-3d/json?userId=" + str(usrid)))
  100.         if "Url" in avatar:
  101.             while type(avatar["Url"]) == type(None):
  102.                 print("Avatar URL is NoneType!")
  103.                 avatar = json.loads(zipopen("https://www.roblox.com/avatar-thumbnail-3d/json?userId=" + str(usrid)))
  104.             avatar2 = json.loads(zipopen(avatar["Url"]))
  105.             if os.path.isfile(path + usrname + ".obj"):
  106.                 print("OBJ for %s already saved!" % usrname)
  107.             else:
  108.                 stuff = json.loads(zipopen("https://www.roblox.com/thumbnail/resolve-hash/" + avatar2["obj"]))
  109.                 urllib.urlretrieve(stuff["Url"],path + usrname + ".obj")
  110.             if os.path.isfile(path + usrname + "_colors.xml"):
  111.                 print("Body colors for %s already saved!" % usrname)
  112.             else:
  113.                 urllib.urlretrieve("https://www.roblox.com/Asset/BodyColors.ashx?userId=" + str(usrid),path + usrname + "_colors.xml")
  114.             o = 1
  115.             for i in avatar2["textures"]:
  116.                 if os.path.isfile(path + usrname + ("_" + str(o),"")[len(avatar2["textures"]) == 1] + ".png"):
  117.                     print("Texture %d for %s already saved!" % (o,usrname))
  118.                 else:
  119.                     urllib.urlretrieve(json.loads(zipopen("https://www.roblox.com/thumbnail/resolve-hash/" + i))["Url"],path + usrname + ("_" + str(o),"")[len(avatar2["textures"]) == 1] + ".png")
  120.                 o = o + 1
  121.             print("Avatar saved to \"" + path + "\".")
  122.             return True
  123.         else:
  124.             print("Avatar URL not found.")
  125.     elif "errorMessage" in nametoid:
  126.         print(nametoid["errorMessage"])
  127.     else:
  128.         print("Unknown error.")
  129.     return False
  130. def grabFriendsAvatars(friends,usrname):
  131.     print("Downloading " + usrname + "'s friends' avatars. ID: " + str(friends["UserId"]) + ".")
  132.     print(usrname + " has " + str(friends["TotalFriends"]) + " friends.")
  133.     for p in friends["Friends"]:
  134.         grabUser(p["Username"],p["UserId"])
  135. bLoop = True
  136. while bLoop:
  137.     print("Roblox Character Grabber")
  138.     inputname = raw_input("Username: ")
  139.     inputbf = raw_input("Grab friends avatars too? ")
  140.     if grabUser(inputname,0) and ((inputbf.lower() == "y") or (inputbf.lower() == "yes")):
  141.         grabFriendsAvatars(grabFriends(inputname),inputname)
  142.     inputbf = raw_input("Continue? ")
  143.     if ((inputbf.lower() == "y") or (inputbf.lower() == "yes")):
  144.         bLoop = True
  145.     else:
  146.         bLoop = False
  147.         break
Add Comment
Please, Sign In to add comment