Skip to content

Instantly share code, notes, and snippets.

@DagW
Created March 4, 2021 18:15
Show Gist options
  • Save DagW/a1eeddc1b1efc4fbf493ff9e725aa646 to your computer and use it in GitHub Desktop.
Save DagW/a1eeddc1b1efc4fbf493ff9e725aa646 to your computer and use it in GitHub Desktop.
Bricklinks store optimizer
#!/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