initial commit
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# top_spreads.py
|
||||
import requests
|
||||
import csv
|
||||
|
||||
ENDPOINT = "https://api.tarkov.dev/graphql"
|
||||
QUERY = """
|
||||
query ItemsWithPrices {
|
||||
items(lang: en) {
|
||||
id
|
||||
name
|
||||
shortName
|
||||
basePrice
|
||||
lastLowPrice
|
||||
low24hPrice
|
||||
high24hPrice
|
||||
avg24hPrice
|
||||
lastOfferCount
|
||||
buyFor { source currency price priceRUB vendor { name } }
|
||||
sellFor { source currency price priceRUB vendor { name } }
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
def pick_rub(p):
|
||||
pr = p.get("priceRUB")
|
||||
if pr is not None:
|
||||
return pr
|
||||
if p.get("currency") == "RUB":
|
||||
return p.get("price")
|
||||
return None
|
||||
|
||||
def best_trader_buy_rub(item):
|
||||
offers = [pick_rub(o) for o in (item.get("buyFor") or []) if o.get("source") != "Flea Market"]
|
||||
offers = [x for x in offers if isinstance(x, (int, float))]
|
||||
return min(offers) if offers else None
|
||||
|
||||
def best_trader_sell_rub(item):
|
||||
offers = [pick_rub(o) for o in (item.get("sellFor") or []) if o.get("source") != "Flea Market"]
|
||||
offers = [x for x in offers if isinstance(x, (int, float))]
|
||||
return max(offers) if offers else None
|
||||
|
||||
resp = requests.post(ENDPOINT, json={"query": QUERY}, timeout=60)
|
||||
resp.raise_for_status()
|
||||
data = resp.json()["data"]["items"]
|
||||
|
||||
rows = []
|
||||
for it in data:
|
||||
flea_low = it.get("low24hPrice") or it.get("lastLowPrice")
|
||||
flea_high = it.get("high24hPrice") or it.get("avg24hPrice")
|
||||
|
||||
if isinstance(flea_low, (int, float)) and isinstance(flea_high, (int, float)):
|
||||
gap = flea_high - flea_low
|
||||
if gap > 0:
|
||||
rows.append({
|
||||
"id": it["id"],
|
||||
"name": it["name"],
|
||||
"shortName": it["shortName"],
|
||||
"gap": gap,
|
||||
"fleaLow": flea_low,
|
||||
"fleaHigh": flea_high,
|
||||
"avg24h": it.get("avg24hPrice"),
|
||||
"bestTraderBuy": best_trader_buy_rub(it),
|
||||
"bestTraderSell": best_trader_sell_rub(it),
|
||||
"lastOfferCount": it.get("lastOfferCount"),
|
||||
})
|
||||
|
||||
rows.sort(key=lambda r: r["gap"], reverse=True)
|
||||
top = rows[:100]
|
||||
|
||||
# Print a quick top list
|
||||
for i, r in enumerate(top, 1):
|
||||
print(f"{i:>2}. {r['name']:<50} gap ₽{r['gap']:,} (low {r['fleaLow']:,} → high {r['fleaHigh']:,})")
|
||||
|
||||
# Save CSV
|
||||
with open("top100_spread.csv", "w", newline="", encoding="utf-8") as f:
|
||||
w = csv.DictWriter(f, fieldnames=[
|
||||
"id","name","shortName","gap","fleaLow","fleaHigh","avg24h",
|
||||
"bestTraderBuy","bestTraderSell","lastOfferCount"
|
||||
])
|
||||
w.writeheader()
|
||||
w.writerows(top)
|
||||
|
||||
print("\nSaved: top100_spread.csv")
|
||||
Reference in New Issue
Block a user