Initial commit
This commit is contained in:
commit
0a2c48424e
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
config.json
|
||||
.venv
|
||||
venv
|
||||
.idea
|
||||
11
app.py
Normal file
11
app.py
Normal file
@ -0,0 +1,11 @@
|
||||
import json
|
||||
|
||||
from methods.economy_v1 import EconomyV1
|
||||
|
||||
|
||||
def run():
|
||||
with open("config.json") as f:
|
||||
config = json.load(f)
|
||||
|
||||
EconomyV1(roblosecurity=config["user"]["roblosecurity"],
|
||||
asset_id=config["item"]["asset_id"]).buy()
|
||||
8
config_example.json
Normal file
8
config_example.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"user": {
|
||||
"roblosecurity": ""
|
||||
},
|
||||
"item": {
|
||||
"asset_id": 114702108643191
|
||||
}
|
||||
}
|
||||
43
methods/base.py
Normal file
43
methods/base.py
Normal file
@ -0,0 +1,43 @@
|
||||
import logging
|
||||
import time
|
||||
import traceback
|
||||
|
||||
import requests
|
||||
from fake_useragent import UserAgent
|
||||
|
||||
|
||||
|
||||
class Purchaser:
|
||||
base_headers = {
|
||||
"User-Agent": UserAgent().chrome
|
||||
}
|
||||
|
||||
def __init__(self, roblosecurity):
|
||||
self.roblosecurity = roblosecurity
|
||||
self.base_cookies = {".ROBLOSECURITY": self.roblosecurity}
|
||||
self.logger = logging.getLogger(__name__)
|
||||
|
||||
def request(self, url, method=requests.get, attempts=10, timeout=20, *args, **kwargs):
|
||||
if "headers" not in kwargs:
|
||||
kwargs["headers"] = {}
|
||||
if "cookies" not in kwargs:
|
||||
kwargs["cookies"] = {}
|
||||
kwargs["headers"] = {**self.base_headers, **kwargs["headers"]}
|
||||
kwargs["cookies"] = {**self.base_cookies, **kwargs["cookies"]}
|
||||
|
||||
for attempt in range(attempts):
|
||||
try:
|
||||
r = method(url=url, timeout=timeout, *args, **kwargs)
|
||||
if 500 > r.status_code > 600:
|
||||
print(f"Statuscode {r.status_code} for {url}...")
|
||||
time.sleep(5)
|
||||
continue
|
||||
return r
|
||||
except requests.RequestException:
|
||||
traceback.print_exc()
|
||||
time.sleep(5)
|
||||
|
||||
|
||||
def get_asset_metadata(self, asset_id):
|
||||
return self.request(url=f"https://catalog.roblox.com/v1/catalog/items/{asset_id}/details",
|
||||
params={"itemType": "asset"}).json()
|
||||
47
methods/economy_v1.py
Normal file
47
methods/economy_v1.py
Normal file
@ -0,0 +1,47 @@
|
||||
import json
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from methods.base import Purchaser
|
||||
|
||||
|
||||
class EconomyV1(Purchaser):
|
||||
|
||||
def __init__(self,
|
||||
asset_id: int,
|
||||
*args,
|
||||
**kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.asset_id = asset_id
|
||||
|
||||
def buy(self):
|
||||
meta = self.get_asset_metadata(asset_id=self.asset_id)
|
||||
item_type = meta["itemType"]
|
||||
product_id = meta["productId"]
|
||||
collectible_id = meta["collectibleItemId"]
|
||||
|
||||
# TODO check if we need special handling for groups
|
||||
creator_target_id = meta["creatorTargetId"] # UserID / ?
|
||||
|
||||
url = f"https://www.roblox.com/{'bundles' if item_type == 'Bundle' else 'catalog'}/{self.asset_id}"
|
||||
r = self.request(url=url)
|
||||
|
||||
soup = BeautifulSoup(r.text, "html.parser")
|
||||
csrf_token = soup.find("meta", {"name": "csrf-token"})["data-token"]
|
||||
|
||||
r = self.request(url=f"https://economy.roblox.com/v1/purchases/products/{product_id}",
|
||||
method=requests.post,
|
||||
cookies=r.cookies,
|
||||
headers={
|
||||
"x-csrf-token": csrf_token,
|
||||
"Content-Type": "application/json; charset=utf-8",
|
||||
},
|
||||
json={
|
||||
"expectedCurrency": 1,
|
||||
"expectedPrice": 0,
|
||||
"expectedSellerId": creator_target_id
|
||||
})
|
||||
|
||||
data = r.json()
|
||||
print(data, r.headers)
|
||||
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
requests
|
||||
bs4
|
||||
fake-useragent
|
||||
Loading…
Reference in New Issue
Block a user