Files
onlyscavs/import_keys.py
2026-01-25 08:34:42 +00:00

126 lines
2.8 KiB
Python

import requests
import sqlite3
import sys
DB_PATH = "tarkov.db"
API_URL = "https://api.tarkov.dev/graphql"
GRAPHQL_QUERY = """
query {
items(types: [keys]) {
id
name
shortName
weight
wikiLink
gridImageLink
properties {
... on ItemPropertiesKey {
uses
}
}
}
}
"""
def fetch_keys():
response = requests.post(
API_URL,
json={"query": GRAPHQL_QUERY},
timeout=30
)
response.raise_for_status()
data = response.json()
if "errors" in data:
raise RuntimeError(data["errors"])
return data["data"]["items"]
def upsert_keys(conn, keys):
inserted = 0
updated = 0
skipped = 0
cursor = conn.cursor()
for k in keys:
api_id = k.get("id")
name = k.get("name")
short_name = k.get("shortName")
weight = k.get("weight")
wiki_url = k.get("wikiLink")
grid_image_url = k.get("gridImageLink")
uses = None
props = k.get("properties")
if props and "uses" in props:
uses = props["uses"]
if not api_id or not name:
skipped += 1
continue
cursor.execute(
"""
SELECT id FROM keys WHERE api_id = ?
""",
(api_id,)
)
row = cursor.fetchone()
if row:
cursor.execute(
"""
UPDATE keys
SET name = ?, short_name = ?, weight_kg = ?, uses = ?, wiki_url = ?, grid_image_url = ?
WHERE api_id = ?
""",
(name, short_name, weight, uses, wiki_url, grid_image_url, api_id)
)
updated += 1
else:
cursor.execute(
"""
INSERT INTO keys (api_id, name, short_name, weight_kg, uses)
VALUES (?, ?, ?, ?, ?)
""",
(api_id, name, short_name, weight, uses, icon_url, wiki_url)
)
inserted += 1
conn.commit()
return inserted, updated, skipped
def main():
print("Fetching keys from Tarkov.dev...")
try:
keys = fetch_keys()
except Exception as e:
print("ERROR: Failed to fetch keys")
print(e)
sys.exit(1)
print(f"Fetched {len(keys)} keys")
conn = sqlite3.connect(DB_PATH)
conn.execute("PRAGMA foreign_keys = ON")
try:
inserted, updated, skipped = upsert_keys(conn, keys)
except Exception as e:
conn.rollback()
print("ERROR: Database operation failed")
print(e)
sys.exit(1)
finally:
conn.close()
print("Import complete")
print(f"Inserted: {inserted}")
print(f"Updated: {updated}")
print(f"Skipped: {skipped}")
if __name__ == "__main__":
main()