Created
March 4, 2021 18:15
-
-
Save DagW/a1eeddc1b1efc4fbf493ff9e725aa646 to your computer and use it in GitHub Desktop.
Bricklinks store optimizer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/python | |
import json | |
import os | |
import requests | |
# For a list of bricks and their colors | |
# Find the fewest sellers that you can get your bricks from | |
# So you dont have to deal with tons of orders from tons of sellers :-) | |
def search(brick): | |
fn = str(brick.id) + ".result" | |
if os.path.isfile(fn): | |
return | |
h = { | |
'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', | |
} | |
u = 'https://www.bricklink.com/v2/catalog/catalogitem.page?P={}#T=S&O={{"ss":"SE","minqty":"{}","rpp":"999","iconly":0,"nmp":1}}'.format( | |
brick.id, brick.num | |
) | |
r = requests.get(url=u, headers=h) | |
print(u) | |
fn2 = str(brick.id) + ".html" | |
with open(fn2, "w") as text_file: | |
text_file.write(r.text) | |
try: | |
itemid = r.text.split("data-itemid=\"")[1].split("\"")[0] | |
except: | |
itemid = r.text.split('catalogInvChangeItem.asp?itemItemID=')[1].split("\"")[0] | |
u = 'https://www.bricklink.com/ajax/clone/catalogifs.ajax' \ | |
'?itemid={}' \ | |
'&ss=SE' \ | |
'&minqty=10' \ | |
'&nmp=1' \ | |
'&rpp=999' \ | |
'&iconly=0' \ | |
'&color={}'.format( | |
itemid, brick.color | |
) | |
r = requests.get(url=u, headers=h) | |
with open(fn, "w") as text_file: | |
text_file.write(r.text) | |
class Brick: | |
def __init__(self, id, num, color): | |
self.id = id | |
self.num = num | |
self.color = color | |
self.stores = [] | |
def getStores(self): | |
return self.stores | |
def addStore(self, param): | |
if not param in self.stores: | |
self.stores.append(param) | |
def setColorName(self, param): | |
self.colorName = param | |
def printer(self): | |
return "{}st id:{} color:{} ({}) stores -> {}".format(self.num, self.id, self.color, self.colorName, | |
self.stores) | |
def main(): | |
bricks = [ | |
Brick(id=54200, num=2, color=1), | |
Brick(id=85984, num=1, color=69), | |
Brick(id=6091, num=4, color=69), | |
Brick(id=3005, num=2, color=69), | |
Brick(id=25269, num=2, color=3), | |
Brick(id=11211, num=1, color=3), | |
Brick(id=4070, num=4, color=3), | |
Brick(id=3022, num=1, color=3), | |
Brick(id=85984, num=1, color=3), | |
# Brick(id=3062, num=1, color=3), | |
Brick(id=3022, num=1, color=3), | |
Brick(id=3004, num=1, color=3), | |
Brick(id=2357, num=2, color=3), | |
Brick(id=3004, num=2, color=3), | |
Brick(id=3069, num=1, color=1), | |
Brick(id=99780, num=1, color=1), | |
Brick(id=3023, num=1, color=1), | |
Brick(id=3022, num=2, color=1), | |
Brick(id=60481, num=4, color=1), | |
Brick(id=3001, num=2, color=1), | |
Brick(id=4274, num=1, color=1), | |
Brick(id=3024, num=1, color=1), | |
Brick(id=3623, num=1, color=1), | |
Brick(id=36840, num=1, color=1), | |
Brick(id=26047, num=1, color=1), | |
Brick(id=2555, num=1, color=1), | |
Brick(id=3023, num=2, color=1), | |
Brick(id=54200, num=2, color=1), | |
Brick(id=36841, num=2, color=1), | |
Brick(id=15068, num=1, color=2), | |
Brick(id=3069, num=1, color=2), | |
Brick(id=3022, num=1, color=2), | |
Brick(id=3023, num=1, color=2), | |
Brick(id=54200, num=2, color=2), | |
Brick(id=36840, num=2, color=103), | |
Brick(id=25269, num=2, color=2), | |
Brick(id=4070, num=4, color=3), | |
Brick(id=3022, num=1, color=3), | |
Brick(id=99206, num=1, color=3), | |
Brick(id=3794, num=1, color=3), | |
Brick(id=3023, num=1, color=3), | |
# Brick(id=3062, num=1, color=3), | |
Brick(id=3022, num=1, color=3), | |
Brick(id=3005, num=2, color=11), | |
Brick(id=3004, num=6, color=11), | |
Brick(id=54200, num=2, color=5), | |
Brick(id=11211, num=1, color=1), | |
Brick(id=3622, num=2, color=11), | |
Brick(id=3005, num=2, color=3), | |
Brick(id=3004, num=2, color=1), | |
Brick(id=3001, num=1, color=11), | |
Brick(id=3005, num=8, color=11), | |
Brick(id=3040, num=2, color=11), | |
] | |
# Collecing info for all bricks | |
for brick in bricks: | |
search(brick) | |
for brick in bricks: | |
fn = str(brick.id) + ".result" | |
with open(fn) as f: | |
read_data = f.read() | |
j = json.loads(read_data) | |
for seller in j["list"]: | |
brick.addStore(seller["strStorename"]) | |
brick.setColorName(seller["strColor"]) | |
while len(bricks) > 0: | |
by_seller = {} | |
for brick in bricks: | |
for seller in brick.getStores(): | |
arr = by_seller.get(seller, []) | |
arr.append(brick) | |
by_seller[seller] = arr | |
s = {k: v for k, v in sorted(by_seller.items(), key=lambda item: -len(item[1]))} | |
for k, v in s.items(): | |
print("From", k, "buy", [x.id for x in v]) | |
for brick in v: | |
bricks.remove(brick) | |
break | |
break | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment