Advertisement
Guest User

ROBLOX API

a guest
Dec 28th, 2016
2,214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.29 KB | None | 0 0
  1. import json
  2. import requests
  3. import datetime
  4. import time
  5. import re
  6. from threading import Thread
  7. from bs4 import BeautifulSoup
  8.  
  9. class Gear(object):
  10.     def __init__(self):
  11.         self.MELEE = 0
  12.         self.RANGED = 1
  13.         self.EXPLOSIVE = 2
  14.         self.POWERUP = 3
  15.         self.NAVIGATION = 4
  16.         self.MUSICAL = 5
  17.         self.SOCIAL = 6
  18. class Subcategory(object):
  19.     def __init__(self):
  20.         self.FEATURED = 0
  21.         self.ALL = 1
  22.         self.COLLECTIBLES = 2
  23.         self.CLOTHING = 3
  24.         self.BODYPARTS = 4
  25.         self.GEAR = 5
  26.         self.MODELS = 6
  27.         self.PLUGINS = 7
  28.         self.DECALS = 8
  29.         self.HATS = 9
  30.         self.FACES = 10
  31.         self.PACKAGES = 11
  32.         self.SHIRTS = 12
  33.         self.TSHIRTS = 13
  34.         self.PANTS = 14
  35.         self.HEADS = 15
  36.         self.AUDIO = 16
  37.         self.ROBLOXCREATED = 17
  38.         self.MESHES = 18
  39. class Genre(object):
  40.     def __init__(self):
  41.         self.ALL = 0
  42.         self.TOWNANDCITY = 1
  43.         self.MEDIEVAL = 2
  44.         self.SCIFI = 3
  45.         self.FIGHTING = 4
  46.         self.HORROR = 5
  47.         self.NAVAL = 6
  48.         self.ADVENTURE = 7
  49.         self.SPORTS = 8
  50.         self.COMEDY = 9
  51.         self.WESTERN = 10
  52.         self.MILITARY = 11
  53.         self.SKATING = 12
  54.         self.BUILDING = 13
  55.         self.FPS = 14
  56.         self.RPG = 15
  57. class Category(object):
  58.     def __init__(self):
  59.         self.FEATURED = 0
  60.         self.ALL = 1
  61.         self.COLLECTIBLES = 2
  62.         self.CLOTHING = 3
  63.         self.BODYPARTS = 4
  64.         self.GEAR = 5
  65.         self.MODELS = 6
  66.         self.PLUGINS = 7
  67.         self.DECALS = 8
  68.         self.AUDIO = 9
  69.         self.MESHES = 10
  70. class Currency(object):
  71.     def __init__(self):
  72.         self.ALL = 0
  73.         self.ROBUX = 1
  74.         self.FREE = 2
  75. class Sort(object):
  76.     def __init__(self):
  77.         self.RELEVANCE = 0
  78.         self.MOSTFAVORITED = 1
  79.         self.BESTSELLING = 2
  80.         self.RECENTLYUPDATED = 3
  81.         self.PRICELOWTOHIGH = 4
  82.         self.PRICEHIGHTOLOW = 5
  83. class Time(object):
  84.     def __init__(self):
  85.         self.PASTDAY = 0
  86.         self.PASTWEEK = 1
  87.         self.PASTMONTH = 2
  88.         self.ALLTIME = 3
  89.  
  90. class RobloxApiClient(object):
  91.    
  92.     def __init__(self):
  93.         self.s = requests.session()
  94.         self.token = None
  95.     def friends(self,id1,id2):
  96.         t = self.s.get('https://www.roblox.com/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerId='+id1+'&userId='+id2).text
  97.         t=t.replace('<Value Type="boolean">','')
  98.         t=t.replace('</Value>','')
  99.         if t == 'true':
  100.             return True
  101.         else:
  102.             return False
  103.     def name(self,iyd):
  104.         r = self.s.get('https://api.roblox.com/Users/'+iyd)
  105.         jdict = json.loads(r.text)
  106.         return jdict["Username"]
  107.  
  108.     def assetComments(self,id1):
  109.         r = self.s.get('https://www.roblox.com/API/Comments.ashx?rqtype=getComments&assetID='+id1+'&startIndex=0')
  110.         js = json.loads(r.text)
  111.         return js
  112.            
  113.     def catalogSearch(self,geartype = -1, genre = -1, subcategory = -1, category = -1, currency = -1, sort = -1, freq = -1, keyword = None, creatorID = None, minim = 0, maxim = None, notforsale = True, pagenumber = -1, resultsperpage = -1):
  114.         req = 'http://roblox.com/catalog/json?'
  115.         if geartype != -1:
  116.             req += '&Gears={}'.format(geartype)
  117.         if genre != -1:
  118.             req += '&Genres={}'.format(genre)
  119.         if subcategory != -1:
  120.             req += '&Subcategory={}'.format(subcategory)
  121.         if category != -1:
  122.             req += '&Category={}'.format(category)
  123.         if currency != -1:
  124.             req += '&CurrencyType={}'.format(currency)
  125.         if sort != -1:
  126.             req += '&SortType={}'.format(sort)
  127.         if freq != -1:
  128.             req += '&AggregationFrequency={}'.format(freq)
  129.         if keyword != None:
  130.             req += '&Keyword={}'.format(keyword)
  131.         if creatorID != None:
  132.             req += '&CreatorID={}'.format(creatorID)
  133.         req += '&PxMin={}'.format(minim)
  134.         if maxim != None:
  135.             req += '&PxMax={}'.format(maxim)
  136.         if notforsale:
  137.             req += '&IncludeNotForSale=true'
  138.         else:
  139.             req += '&IncludeNotForSale=false'
  140.         if pagenumber != -1:
  141.             req +=  '&PageNumber={}'.format(pagenumber)
  142.         if resultsperpage != -1:
  143.             req += '&ResultsPerPage={}'.format(resultsperpage)
  144.         r = self.s.get(req)
  145.         return json.loads(r.text)
  146.     def getFriends(self,userid):
  147.         return self.s.get('https://api.roblox.com/users/'+str(userid)+'/friends').json()
  148.  
  149.     def friendCrawl(self,userid, maxfr = 100):
  150.         usercount = 0
  151.         users = []
  152.         friendlist1 = getFriends(userid)      
  153.         for friend in friendlist1:
  154.             if len(users) < maxfr:
  155.                 if self.s.get('https://www.roblox.com/users/'+str(friend['Id'])+'/profile').status_code != 404:
  156.                     users.append({'Id':friend['Id'],'Username':friend['Username']})
  157.                     usercount += 1
  158.                     print("Users: "+ str(usercount))
  159.             else:
  160.                 return users
  161.         for user in users:
  162.             req = self.s.get("https://api.roblox.com/users/"+str(user['Id'])+"/friends")
  163.             if req.status_code != 404:
  164.                 friendlist1 = json.loads(req.text)
  165.             else:
  166.                 pass
  167.             for friend in friendlist1:
  168.                 if len(users) < maxfr:
  169.                     if self.s.get('https://www.roblox.com/users/'+str(friend['Id'])+'/profile').status_code != 404:
  170.                         d = {'Id':friend['Id'],'Username':friend['Username']}
  171.                         if d not in users:
  172.                             users.append(d)
  173.                             usercount += 1
  174.                             print("Users: "+ str(usercount))
  175.                 else:
  176.                     return users
  177.  
  178.     def getCurrentStatus(self):
  179.         return self.s.get('https://www.roblox.com/client-status').text
  180.  
  181.     def getUserPresence(self,userid):
  182.         return self.s.get('https://www.roblox.com/presence/user?userId={}'.format(userid)).json()
  183.    
  184.     def createAccount(self,username,password,birthday,gender = 2): #birthday is a datetime object
  185.         params = {
  186.             "isEligibleForHideAdsAbTest":False,
  187.             "username":username,
  188.             "password":password,
  189.             "birthday": birthday.strftime("%d %b %Y").lstrip("0").replace(" 0", " "),
  190.             "gender": gender, #1 for female, 2 for male
  191.             "context":"RollerCoasterSignupForm"
  192.         }
  193.         print(params)
  194.         r = self.s.post("https://api.roblox.com/signup/v1",data = params)
  195.         return r
  196.  
  197.     def getItemInfo(self,itemid):
  198.         return self.s.get("https://api.roblox.com/marketplace/productinfo?assetId="+str(itemid)).json()
  199.  
  200.     def buyItem(self,itemid):
  201.         info = self.getItemInfo(itemid)
  202.         url="https://web.roblox.com/api/item.ashx?rqtype=purchase&productID={}&expectedCurrency=1&expectedPrice={}&expectedSellerID={}&userAssetID=".format(info["ProductId"], 0 if info["PriceInRobux"] == None else info["PriceInRobux"],info["Creator"]["Id"])
  203.         self.token = self.s.post(url).headers['X-CSRF-TOKEN']
  204.         r = self.s.post(url, headers = {"X-CSRF-TOKEN":self.token})
  205.         return r
  206.  
  207.     def logIn(self,username,password,returnurl = ""):
  208.         r = self.s.post("https://www.roblox.com/newlogin",data={"username":username,"password":password,"submitLogin":"Log In","ReturnUrl":returnurl})
  209.         return r
  210.  
  211.     def giveBadge(self,userid,badgeid,placeid):
  212.         return self.s.post("https://api.roblox.com/assets/award-badge", data = {'userId':userid,'badgeId':badgeid,'placeId':placeid}).json()
  213.    
  214.     def getVersions(self,itemid):
  215.         return self.s.get("https://api.roblox.com/assets/{}/versions".format(itemid)).json()
  216.  
  217.     def getCurrency(self):
  218.         return self.s.get("https://api.roblox.com/currency/balance").json()
  219.  
  220.     def setXsrfToken(self):
  221.         r = self.s.get("https://roblox.com/home")
  222.         tok = r.text[r.text.find("Roblox.XsrfToken.setToken('") + 27::]
  223.         tok = tok[:tok.find("');"):]
  224.         self.token = tok
  225.         return tok
  226.  
  227.     def sendMessage(self,subject,body,recipientid):
  228.         if not self.token:
  229.             self.setXsrfToken()
  230.         r = self.s.post('https://www.roblox.com/messages/send',headers = {'Content-Type':"application/x-www-form-urlencoded; charset=UTF-8","X-CSRF-TOKEN":self.token}, data = {"subject":subject,"body":body,"recipientid":recipientid,"cacheBuster":round(time.time(),3)})
  231.         return r
  232.  
  233.     def forumPost(self,forumid,subject,body,disablereplies = False): #currently nonfunctional
  234.         earl = "https://forum.roblox.com/Forum/AddPost.aspx?ForumID={}".format(forumid)
  235.         view = self.s.get(earl)
  236.         soup = BeautifulSoup(view.text,'html.parser')
  237.         params = {
  238.             "__EVENTTARGET" : '',
  239.             "__EVENTARGUMENT": '',
  240.             '__VIEWSTATE':soup.find(id="__VIEWSTATE")['value'],
  241.             "__VIEWSTATEGENERATOR":soup.find(id="__VIEWSTATEGENERATOR")['value'],
  242.             "__EVENTVALIDATION" : soup.find(id="__EVENTVALIDATION")['value'],
  243.             "ctl00$cphRoblox$Createeditpost1$PostForm$NewPostSubject":subject,
  244.             "ctl00$cphRoblox$Createeditpost1$PostForm$PostBody":body,
  245.             "ctl00$cphRoblox$Createeditpost1$PostForm$PostButton":" Post "
  246.         }
  247.         if disablereplies:
  248.             params["ctl00$cphRoblox$Createeditpost1$PostForm$AllowReplies"] = 'on'
  249.         r = self.s.post(earl, data = params, headers = {"Content-Type":"application/x-www-form-urlencoded"})
  250.         return r
  251.  
  252.     def replyToForumPost(self, postid, text, disablereplies = False):
  253.         earl = "https://forum.roblox.com/Forum/AddPost.aspx?PostID={}".format(postid)
  254.         view = self.s.get(earl)
  255.         soup = BeautifulSoup(view.text,'html.parser')
  256.         params = {
  257.             "__EVENTTARGET" : '',
  258.             "__EVENTARGUMENT": '',
  259.             '__VIEWSTATE':soup.find(id="__VIEWSTATE")['value'],
  260.             "__VIEWSTATEGENERATOR":soup.find(id="__VIEWSTATEGENERATOR")['value'],
  261.             "__EVENTVALIDATION" : soup.find(id="__EVENTVALIDATION")['value'],
  262.             "ctl00$cphRoblox$Createeditpost1$PostForm$PostBody":text,
  263.             "ctl00$cphRoblox$Createeditpost1$PostForm$PostButton":" Post "
  264.         }
  265.         if disablereplies:
  266.             params["ctl00$cphRoblox$Createeditpost1$PostForm$AllowReplies"] = 'on'
  267.         r = self.s.post(earl, data = params, headers = {"Content-Type":"application/x-www-form-urlencoded"})
  268.         return r
  269.  
  270.    
  271.     def getRobloSecurityCookie(self):
  272.         return self.s.cookies.get_dict()['.ROBLOSECURITY']
  273.  
  274.     def commentOnAsset(self,assetid,text):
  275.         if not self.token:
  276.             self.setXsrfToken()
  277.         r = self.s.post("https://www.roblox.com/comments/post",data = {'assetId':assetid,'text':text}, headers = {"X-CSRF-TOKEN":self.token})
  278.         return r
  279.    
  280.     def joinGroup(self,groupid):
  281.         viewpage = self.s.get("https://www.roblox.com/groups/group.aspx?gid={}".format(groupid))
  282.         soup = BeautifulSoup(viewpage.text,'html.parser')
  283.         params = {
  284.         '__EVENTTARGET':"JoinGroupDiv",
  285.         '__EVENTARGUMENT':"Click",
  286.         '__LASTFOCUS':'',
  287.         '__VIEWSTATE':soup.find(name="__VIEWSTATE")['value'],
  288.         '__VIEWSTATEGENERATOR':soup.find(name="__VIEWSTATEGENERATOR")['value'],
  289.         '__EVENTVALIDATION':soup.find(name="__EVENTVALIDATION")['value'],
  290.         'ctl00$cphRoblox$GroupSearchBar$SearchKeyword':"Search all groups",
  291.         'ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlRolesetList':soup.find(id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlRolesetList").find(selected="selected")['value'],
  292.         'ctl00$cphRoblox$rbxGroupRoleSetMembersPane$RolesetCountHidden':soup.find(id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_RolesetCountHidden")['value'],
  293.         'ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$PageTextBox':soup.find(id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_PageTextBox")['value'],
  294.         'ctl00$cphRoblox$rbxGroupRoleSetMembersPane$currentRoleSetID':soup.find(id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_currentRoleSetID")['value']
  295.         }
  296.         r = self.s.post("https://www.roblox.com/groups/group.aspx?gid={}".format(groupid), data = params, headers = {'Content-Type':'application/x-www-form-urlencoded'})
  297.         return r
  298.  
  299.     def reportAbuse(self,userid,category,comment):
  300.         view = self.s.get("https://www.roblox.com/abusereport/UserProfile?id={}".format(userid))
  301.         params = {
  302.         '__RequestVerificationToken':re.search('name="__RequestVerificationToken" type="hidden" value="(.+)"',view.text).group(1),
  303.         'ReportCategory':category,
  304.         'Comment':comment,
  305.         'Id':userid,
  306.         'RedirectUrl':'/Login',
  307.         'PartyGuid':'',
  308.         'ConversationId':''
  309.         }
  310.         r = self.s.post("https://www.roblox.com/abusereport/UserProfile?id={}",data=params)
  311.         return r
  312.  
  313.     def getRAP(self,aid, returnv = None):
  314.         txt = requests.get("https://www.roblox.com/asset/{}/sales-data".format(aid)).json()
  315.         value = txt['data']['AveragePrice']
  316.         if returnv:
  317.             returnv[0] += value
  318.         else:
  319.             return value
  320.    
  321.     def getUserRAP(self,uid):
  322.         hats = self.s.get("https://www.roblox.com/users/inventory/list-json?assetTypeId=8&cursor=&itemsPerPage=999999&pageNumber=1&userId={}".format(uid)).json()
  323.         gear = self.s.get("https://www.roblox.com/users/inventory/list-json?assetTypeId=19&cursor=&itemsPerPage=999999&pageNumber=1&userId={}".format(uid)).json()
  324.         faces = self.s.get("https://www.roblox.com/users/inventory/list-json?assetTypeId=18&cursor=&itemsPerPage=999999&pageNumber=1&userId={}".format(uid)).json()
  325.         hatlist = []
  326.         gearlist = []
  327.         facelist = []
  328.         if hats['IsValid'] == False:
  329.             return None
  330.         for hat in hats['Data']['Items']:
  331.             try:
  332.                 if hat['Product'] and hat['Product']['IsLimited'] or hat['Product']['IsLimitedUnique']:
  333.                     hatlist.append(hat['Item']['AssetId'])
  334.             except TypeError as e:
  335.                 pass
  336.         for hat in gear['Data']['Items']:
  337.             try:
  338.                 if hat['Product'] and hat['Product']['IsLimited'] or hat['Product']['IsLimitedUnique']:
  339.                     gearlist.append(hat['Item']['AssetId'])
  340.             except TypeError as e:
  341.                 pass
  342.         for hat in faces['Data']['Items']:
  343.             try:
  344.                 if hat['Product'] and hat['Product']['IsLimited'] or hat['Product']['IsLimitedUnique']:
  345.                     facelist.append(hat['Item']['AssetId'])
  346.             except TypeError as e:
  347.                 pass
  348.         threadarr = []
  349.         returnval = [0]
  350.         for item in hatlist+gearlist+facelist:
  351.             threadarr.append(Thread(target=self.getRAP,args=(item,returnval)))
  352.         for thread in threadarr:
  353.             thread.start()
  354.         for thread in threadarr:
  355.             thread.join()
  356.         return returnval[0]
  357.  
  358.     def getSellers(self,aid):
  359.         return requests.get("https://www.roblox.com/asset/resellers?productId={}&startIndex=0&maxRows=9999999".format(self.getItemInfo(aid)['ProductId'])).json()
  360.  
  361.     def getSalesData(self,aid):
  362.         return requests.get("https://www.roblox.com/asset/{}/sales-data".format(aid)).json()
  363.  
  364.     def snipeLimited(self,aid,desiredprice):
  365.         self.token = requests.post("https://web.roblox.com/api/item.ashx?rqtype=purchase&productID={}&expectedCurrency=1&expectedPrice={}&expectedSellerID={}&userAssetID={}").headers['X-CSRF-TOKEN']
  366.         sellers = self.getSellers(aid)
  367.         for seller in sellers['data']['Resellers']:
  368.             if seller['Price'] <= desiredprice:
  369.                 return requests.post("https://web.roblox.com/api/item.ashx?rqtype=purchase&productID={}&expectedCurrency=1&expectedPrice={}&expectedSellerID={}&userAssetID={}".format(self.getItemInfo(aid)['ProductId'],seller['Price'],seller['SellerId'],seller['UserAssetId']),headers = {"X-CSRF-TOKEN":self.token})
  370.         return False
  371.  
  372.     def logOut(self):
  373.         if not self.token:
  374.             self.setXsrfToken()
  375.         r = self.s.post("https://api.roblox.com/sign-out/v1",headers={'X-CSRF-TOKEN':self.token})
  376.         return r
  377.  
  378. ## do stuff
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement