Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import urllib2, json, datetime, os, zlib, urllib, socket, hashlib, time
- from HTMLParser import HTMLParser
- basepath = "E:\\3D Models\\Roblox Avatars\\"
- thumbres = [("512", "9975a2d4dc1ecf81f7e49916099c8c55"), ("420", "7e9f63b26670543d8296072a2738a519"), ("352", "e6b3a7112cb9efc436d518f171ac9b8e"),("100","")]
- def zipopen(url):
- try:
- response = urllib2.urlopen(url, None, socket._GLOBAL_DEFAULT_TIMEOUT)
- except urllib2.HTTPError:
- return ""
- if response.info().getheader("Content-Encoding") == "gzip":
- return zlib.decompress(response.read(),zlib.MAX_WBITS + 16)
- else:
- return response.read()
- def grabFriends(usrname):
- nametoid = json.loads(zipopen("https://api.roblox.com/users/get-by-username?username=" + usrname))
- if "Id" in nametoid:
- print("Found " + usrname + ("'s best friends. ID: %d." % nametoid["Id"]))
- return json.loads(zipopen("https://www.roblox.com/friends/json?userId=%d&pageSize=9000" % nametoid["Id"]))
- else:
- print("Avatar URL not found.")
- return False
- def grabThumbnail(usrname, path):
- for i in thumbres:
- thumbhash = i[1]
- thumb = ""
- thumb = zipopen("https://www.roblox.com/Thumbs/Avatar.ashx?x=%s&y=%s&username=%s" % (i[0], i[0], usrname))
- hsh = hashlib.md5()
- hsh.update(thumb)
- thumbhash = hsh.hexdigest()
- if os.path.isfile("%s%s_thumb%s.png" % (path, usrname, i[0])):
- print("%sx%s thumbnail for %s already saved!" % (i[0], i[0], usrname))
- break
- else:
- if thumbhash == i[1]:
- print(usrname + "'s %sx%s avatar thumbnail is N/A! Trying next..." % (i[0],i[0]))
- else:
- f = open("%s%s_thumb%s.png" % (path, usrname, i[0]),"wb")
- f.write(thumb)
- f.close()
- break
- def grabUser(usrname, userid):
- path = basepath + usrname + "\\" + datetime.date.strftime(datetime.date.today(),"%b %d, %Y") + "\\"
- if not os.path.exists(path):
- os.makedirs(path)
- usrid = 0
- if userid and userid > 0:
- usrid = userid
- else:
- nametoid = json.loads(zipopen("https://api.roblox.com/users/get-by-username?username=" + usrname))
- if "Id" in nametoid:
- usrid = nametoid["Id"]
- else:
- print("User does not exist.")
- return False
- if usrid:
- print("Downloading " + usrname + "'s avatar. ID: " + str(usrid) + ".")
- grabThumbnail(usrname,path)
- if os.path.isfile(path + usrname + "_blurb.txt") and os.path.isfile(path + usrname + "_pastnames.txt"):
- print("Blurb and past names for %s already saved!" % usrname)
- else:
- page1 = zipopen("https://www.roblox.com/users/%d/profile/" % usrid)
- if page1 == "":
- print("%s is banned, unable to retrieve blurb and past names." % usrname)
- else:
- page1 = page1.decode("utf8")
- if os.path.isfile(path + usrname + "_blurb.txt"):
- print("Blurb for %s already saved!" % usrname)
- else:
- span = "<span class=\"profile-about-content-text"
- spanf = page1.find(span)
- page = page1[spanf + len(span):]
- if spanf:
- page = page[page.find(">") + len(">"):]
- page = page[:page.find("</span>")]
- f = open(path + usrname + "_blurb.txt","wb")
- oo = HTMLParser().unescape(page)
- f.write(oo.encode("utf8"))
- f.close()
- else:
- print("No blurb found for %s!" % usrname)
- if os.path.isfile(path + usrname + "_pastnames.txt"):
- print("Past names for %s already saved!" % usrname)
- else:
- span2 = "<span class=\"tooltip-pastnames\""
- span2f = page1.find(span2)
- if span2f > 0:
- page1 = page1[span2f + len(span2):]
- page1 = page1[page1.find("title=\"") + len("title=\""):]
- page1 = page1[:page1.find("\"")]
- f = open(path + usrname + "_pastnames.txt","wb")
- f.write(HTMLParser().unescape(page1))
- f.close()
- else:
- print("No past names found for %s!" % usrname)
- f = open(path + usrname + "_pastnames.txt","wb")
- f.write("(No past names found.)")
- f.close()
- avatar = json.loads(zipopen("https://www.roblox.com/avatar-thumbnail-3d/json?userId=" + str(usrid)))
- if "Url" in avatar:
- while type(avatar["Url"]) == type(None):
- print("Avatar URL is NoneType!")
- avatar = json.loads(zipopen("https://www.roblox.com/avatar-thumbnail-3d/json?userId=" + str(usrid)))
- avatar2 = json.loads(zipopen(avatar["Url"]))
- if os.path.isfile(path + usrname + ".obj"):
- print("OBJ for %s already saved!" % usrname)
- else:
- stuff = json.loads(zipopen("https://www.roblox.com/thumbnail/resolve-hash/" + avatar2["obj"]))
- urllib.urlretrieve(stuff["Url"],path + usrname + ".obj")
- if os.path.isfile(path + usrname + "_colors.xml"):
- print("Body colors for %s already saved!" % usrname)
- else:
- urllib.urlretrieve("https://www.roblox.com/Asset/BodyColors.ashx?userId=" + str(usrid),path + usrname + "_colors.xml")
- o = 1
- for i in avatar2["textures"]:
- if os.path.isfile(path + usrname + ("_" + str(o),"")[len(avatar2["textures"]) == 1] + ".png"):
- print("Texture %d for %s already saved!" % (o,usrname))
- else:
- urllib.urlretrieve(json.loads(zipopen("https://www.roblox.com/thumbnail/resolve-hash/" + i))["Url"],path + usrname + ("_" + str(o),"")[len(avatar2["textures"]) == 1] + ".png")
- o = o + 1
- print("Avatar saved to \"" + path + "\".")
- return True
- else:
- print("Avatar URL not found.")
- elif "errorMessage" in nametoid:
- print(nametoid["errorMessage"])
- else:
- print("Unknown error.")
- return False
- def grabFriendsAvatars(friends,usrname):
- print("Downloading " + usrname + "'s friends' avatars. ID: " + str(friends["UserId"]) + ".")
- print(usrname + " has " + str(friends["TotalFriends"]) + " friends.")
- for p in friends["Friends"]:
- grabUser(p["Username"],p["UserId"])
- bLoop = True
- while bLoop:
- print("Roblox Character Grabber")
- inputname = raw_input("Username: ")
- inputbf = raw_input("Grab friends avatars too? ")
- if grabUser(inputname,0) and ((inputbf.lower() == "y") or (inputbf.lower() == "yes")):
- grabFriendsAvatars(grabFriends(inputname),inputname)
- inputbf = raw_input("Continue? ")
- if ((inputbf.lower() == "y") or (inputbf.lower() == "yes")):
- bLoop = True
- else:
- bLoop = False
- break
Add Comment
Please, Sign In to add comment