Initial commit
commit
c3f44c64de
|
@ -0,0 +1,12 @@
|
||||||
|
# EditorConfig is awesome: https://EditorConfig.org
|
||||||
|
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = crlf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
insert_final_newline = true
|
|
@ -0,0 +1 @@
|
||||||
|
__pycache__
|
|
@ -0,0 +1,3 @@
|
||||||
|
# shark radar
|
||||||
|
|
||||||
|
where are the cuddlies at? (UK only :<)
|
|
@ -0,0 +1,90 @@
|
||||||
|
import json
|
||||||
|
import colorama
|
||||||
|
import requests
|
||||||
|
|
||||||
|
with open("stores.json") as f:
|
||||||
|
# Parsed from (search for "allStores=["):
|
||||||
|
# https://www.ikea.com/gb/en/products/javascripts/range-stockcheck.ebfce6584a37458deef3.js
|
||||||
|
stores = json.load(f)
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_stock(availability):
|
||||||
|
store_id = availability["classUnitKey"]["classUnitCode"]
|
||||||
|
store_name = \
|
||||||
|
[store["name"] for store in stores if store["value"] == store_id]
|
||||||
|
if len(store_name) < 1:
|
||||||
|
return None
|
||||||
|
|
||||||
|
store_name = store_name[0]
|
||||||
|
|
||||||
|
availability_info = availability["buyingOption"]["cashCarry"]["availability"]
|
||||||
|
quantity = int(availability_info["quantity"])
|
||||||
|
|
||||||
|
next_restock = None
|
||||||
|
if "restocks" in availability_info:
|
||||||
|
next_restock = availability_info["restocks"][0]
|
||||||
|
|
||||||
|
return {
|
||||||
|
"store": store_name,
|
||||||
|
"quantity": quantity,
|
||||||
|
"next_restock": next_restock,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def pretty_print_stock(stock):
|
||||||
|
store = stock["store"]
|
||||||
|
quantity = stock["quantity"]
|
||||||
|
next_restock = stock["next_restock"]
|
||||||
|
|
||||||
|
s = ""
|
||||||
|
if quantity > 0:
|
||||||
|
s += colorama.Fore.GREEN
|
||||||
|
else:
|
||||||
|
s += colorama.Fore.RED
|
||||||
|
s += store
|
||||||
|
s += colorama.Fore.RESET
|
||||||
|
s += " "
|
||||||
|
s += str(quantity)
|
||||||
|
|
||||||
|
if next_restock is not None:
|
||||||
|
s += colorama.Fore.LIGHTBLACK_EX
|
||||||
|
s += " (restock of "
|
||||||
|
s += colorama.Fore.RESET
|
||||||
|
s += str(next_restock["quantity"])
|
||||||
|
s += colorama.Fore.LIGHTBLACK_EX
|
||||||
|
s += " coming "
|
||||||
|
s += colorama.Fore.RESET
|
||||||
|
s += next_restock["earliestDate"]
|
||||||
|
s += " ~ "
|
||||||
|
s += next_restock["latestDate"]
|
||||||
|
s += colorama.Fore.LIGHTBLACK_EX
|
||||||
|
s += ")"
|
||||||
|
s += colorama.Fore.RESET
|
||||||
|
|
||||||
|
print(s)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
colorama.init()
|
||||||
|
|
||||||
|
print("Fetching BLÅHAJ listings…\n")
|
||||||
|
|
||||||
|
availabilities = requests.get("https://api.ingka.ikea.com/cia/availabilities/ru/gb?itemNos=30373588&expand=StoresList,Restocks,SalesLocations", headers={
|
||||||
|
"Accept": "application/json;version=2",
|
||||||
|
"X-Client-ID": "b6c117e5-ae61-4ef5-b4cc-e0b1e37f0631"
|
||||||
|
})
|
||||||
|
availabilities = availabilities.json()
|
||||||
|
|
||||||
|
sharks = []
|
||||||
|
for availability in availabilities["availabilities"]:
|
||||||
|
stock = calculate_stock(availability)
|
||||||
|
if stock is None:
|
||||||
|
continue
|
||||||
|
sharks.append(stock)
|
||||||
|
sharks.sort(key=lambda s: s["quantity"], reverse=True)
|
||||||
|
|
||||||
|
for stock in sharks:
|
||||||
|
pretty_print_stock(stock)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
|
@ -0,0 +1,161 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"value": "113",
|
||||||
|
"name": "Belfast",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Holywood Exchange, 306 Airport RD W",
|
||||||
|
"cityName": "Belfast"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "264",
|
||||||
|
"name": "Bristol",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Eastgate Road, Eastville",
|
||||||
|
"cityName": "Bristol"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "267",
|
||||||
|
"name": "Cardiff",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Ferry Road, Grangetown",
|
||||||
|
"cityName": "Cardiff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "144",
|
||||||
|
"name": "Croydon",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Access via Hesterman Way",
|
||||||
|
"cityName": "Croydon"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "548",
|
||||||
|
"name": "Exeter",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "1 IKEA WAY, off Newcourt Way",
|
||||||
|
"cityName": "Exeter"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "143",
|
||||||
|
"name": "Gateshead",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Metro Park West",
|
||||||
|
"cityName": "Gateshead, Tyne & Wear"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "567",
|
||||||
|
"name": "Greenwich",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "55-57 Bugsby's Way",
|
||||||
|
"cityName": "London, Greenwich"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "261",
|
||||||
|
"name": "Leeds",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Holden Ing Way",
|
||||||
|
"cityName": "Birstall, Batley"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "186",
|
||||||
|
"name": "Manchester",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "110 Wellington Road",
|
||||||
|
"cityName": "Greater Manchester"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "185",
|
||||||
|
"name": "Milton Keynes",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Goslington, Off Bletcham Way",
|
||||||
|
"cityName": "Milton Keynes"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "263",
|
||||||
|
"name": "Nottingham",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Ikea Way, Giltbrook",
|
||||||
|
"cityName": "Nottingham"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "461",
|
||||||
|
"name": "Reading",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Pincents Kiln Industrial Pk, Theale",
|
||||||
|
"cityName": "Reading"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "519",
|
||||||
|
"name": "Sheffield",
|
||||||
|
"storeAddress": { "address": "Sheffield Road", "cityName": "Tinsley" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "125",
|
||||||
|
"name": "Southampton",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "West Quay Road",
|
||||||
|
"cityName": "Southhampton"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "255",
|
||||||
|
"name": "Tottenham",
|
||||||
|
"storeAddress": { "address": "Glover Drive", "cityName": "Edmonton" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "140",
|
||||||
|
"name": "Warrington",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "910 Europe Boulevard",
|
||||||
|
"cityName": "Warrington"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "266",
|
||||||
|
"name": "Glasgow",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "99 Kings Inch Drive",
|
||||||
|
"cityName": "Glasgow"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "265",
|
||||||
|
"name": "Edinburgh",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Costkea way, Loanhead",
|
||||||
|
"cityName": "Edinburgh, Midlothian"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "262",
|
||||||
|
"name": "Lakeside",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Heron Way, Lakeside",
|
||||||
|
"cityName": "Essex"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "142",
|
||||||
|
"name": "Birmingham",
|
||||||
|
"storeAddress": {
|
||||||
|
"address": "Park Lane, Wednesbury",
|
||||||
|
"cityName": "West Midlands"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "141",
|
||||||
|
"name": "Wembley",
|
||||||
|
"storeAddress": { "address": "2 Drury Way", "cityName": "London" }
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in New Issue