Initial commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
__pycache__/
|
||||||
|
env.py
|
||||||
|
*.json
|
3
env.py.example
Normal file
3
env.py.example
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
api_key = "example" # https://steamcommunity.com/dev/apikey
|
||||||
|
steam_id = "id" # Your 64 bit steam id
|
||||||
|
language = "en" # Localized strings
|
248
main.py
Normal file
248
main.py
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
import requests
|
||||||
|
from env import *
|
||||||
|
|
||||||
|
# https://wiki.alliedmods.net/Team_fortress_2_item_definition_indexes
|
||||||
|
|
||||||
|
def query_schema(start):
|
||||||
|
url = f"http://api.steampowered.com/IEconItems_440/GetSchemaItems/v0001/?key={api_key}&start={start}&language={language}"
|
||||||
|
response = requests.get(url)
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.json()
|
||||||
|
else:
|
||||||
|
raise Exception(f"Error fetching data: {response.status_code}")
|
||||||
|
|
||||||
|
def query_schema_items():
|
||||||
|
start = 0
|
||||||
|
all_items = []
|
||||||
|
while True:
|
||||||
|
data = query_schema(start)
|
||||||
|
if 'result' in data and 'items' in data['result']:
|
||||||
|
items = data['result']['items']
|
||||||
|
if not items:
|
||||||
|
break
|
||||||
|
all_items.extend(items)
|
||||||
|
if 'next' in data['result']:
|
||||||
|
start = data['result']['next']
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
return all_items
|
||||||
|
|
||||||
|
def fetch_my_items():
|
||||||
|
url = f"http://api.steampowered.com/IEconItems_440/GetPlayerItems/v0001/?key={api_key}&SteamID={steam_id}"
|
||||||
|
response = requests.get(url)
|
||||||
|
if response.status_code == 200:
|
||||||
|
return response.json()
|
||||||
|
else:
|
||||||
|
raise Exception(f"Error fetching data: {response.status_code}")
|
||||||
|
|
||||||
|
def save_to_file(data, filename):
|
||||||
|
with open(filename, 'w') as file:
|
||||||
|
file.write(data)
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
# Save the response to this url as a file called "my_items.json"
|
||||||
|
|
||||||
|
# Fetch items if not saved
|
||||||
|
|
||||||
|
if not os.path.exists("my_items.json"):
|
||||||
|
# print("Fetching my items...")
|
||||||
|
my_items = fetch_my_items()
|
||||||
|
save_to_file(json.dumps(my_items, indent=4), "my_items.json")
|
||||||
|
else:
|
||||||
|
# print("My items already fetched.")
|
||||||
|
my_items = json.load(open("my_items.json"))
|
||||||
|
|
||||||
|
if not os.path.exists("schema_items.json"):
|
||||||
|
# print("Fetching schema items...")
|
||||||
|
# Save the schema items to a file called "schema_items.json"
|
||||||
|
schema_items = query_schema_items()
|
||||||
|
# Turn array into json object with "items" as key
|
||||||
|
schema_items_json = {"items": schema_items}
|
||||||
|
save_to_file(json.dumps(schema_items_json, indent=4), "schema_items.json")
|
||||||
|
else:
|
||||||
|
# print("Schema items already fetched.")
|
||||||
|
schema_items_json = json.load(open("schema_items.json"))
|
||||||
|
|
||||||
|
# Now filter both items to find only strange items
|
||||||
|
def is_strange_items(item):
|
||||||
|
return item.get('quality', 0) == 11 # Strange quality
|
||||||
|
|
||||||
|
def is_strange_schema(item):
|
||||||
|
return item.get('capabilities', {}).get('can_strangify', False)
|
||||||
|
|
||||||
|
# Filter to only weapons
|
||||||
|
def is_weapon(item):
|
||||||
|
return item.get('item_slot', '') in ['primary', 'secondary', 'melee', 'pda', 'pda2', 'building']
|
||||||
|
|
||||||
|
# Filter out war paints
|
||||||
|
def is_war_paint(item):
|
||||||
|
attributes = item.get('attributes', [])
|
||||||
|
for attr in attributes:
|
||||||
|
if attr.get('name', '') == 'set_item_texture_wear':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Filter Slot Tokens
|
||||||
|
def is_slot_token(item):
|
||||||
|
return "Slot Token" in item.get('name', '')
|
||||||
|
|
||||||
|
# Filter Default items
|
||||||
|
def is_default(item):
|
||||||
|
return item.get('defindex') <= 30 or item.get('defindex') == 735 # Default items are not strange
|
||||||
|
|
||||||
|
# Filter Botkiller items
|
||||||
|
def is_botkiller(item):
|
||||||
|
return "Botkiller" in item.get('name', '')
|
||||||
|
|
||||||
|
# Filter festive items
|
||||||
|
def is_festive(item):
|
||||||
|
return "Festive" in item.get('name', '')
|
||||||
|
|
||||||
|
# Filter inelligible promo items
|
||||||
|
def is_promo(item):
|
||||||
|
name = item.get('name', '')
|
||||||
|
items = [
|
||||||
|
"Promo", # Generic promo items
|
||||||
|
"TTG", # Poker Night items (Telltale Games)
|
||||||
|
"Quackenbirdt",
|
||||||
|
"Black Rose",
|
||||||
|
"Three-Rune Blade",
|
||||||
|
"Fishcake",
|
||||||
|
"Iron Curtain",
|
||||||
|
"Sharpened Volcano Fragment",
|
||||||
|
"Sun-on-a-Stick",
|
||||||
|
"Nostromo Napalmer",
|
||||||
|
"Sharp Dresser",
|
||||||
|
"Maul",
|
||||||
|
"Fortified Compound",
|
||||||
|
"Robo-Sandvich",
|
||||||
|
"Freedom Staff",
|
||||||
|
"Ham Shank",
|
||||||
|
"Prinny Machete",
|
||||||
|
"Short Circuit",
|
||||||
|
"Ap-Sap",
|
||||||
|
]
|
||||||
|
for item in items:
|
||||||
|
if item in name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_community(item):
|
||||||
|
name = item.get('name', '')
|
||||||
|
items = [
|
||||||
|
"Gunboats",
|
||||||
|
"Darwin's Danger Shield",
|
||||||
|
"Ali Baba's Wee Booties",
|
||||||
|
"Bootlegger",
|
||||||
|
"Jumper", # Both jumper items
|
||||||
|
"Horseless Headless Horseman's Headtaker",
|
||||||
|
"Nessie's Nine Iron",
|
||||||
|
"Scottish Handshake",
|
||||||
|
"Cozy Camper",
|
||||||
|
"Wanga Prick",
|
||||||
|
"Postal Pummeler",
|
||||||
|
"Unarmed Combat",
|
||||||
|
"Conscientious Objector",
|
||||||
|
"Bat Outta Hell",
|
||||||
|
"Buffalo Steak Sandvich",
|
||||||
|
"Eureka Effect",
|
||||||
|
"Vita-Saw",
|
||||||
|
"Tide Turner", # Why not valve?
|
||||||
|
"Dragon's Fury", # Why not valve?
|
||||||
|
"Thermal Thruster", # Why not valve?
|
||||||
|
"Gas Passer", # Why not valve?
|
||||||
|
"Hot Hand", # Why not valve?
|
||||||
|
"Second Banana", # Why not valve?
|
||||||
|
]
|
||||||
|
for item in items:
|
||||||
|
if item in name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_bread_item(item):
|
||||||
|
name = item.get('name', '')
|
||||||
|
items = [
|
||||||
|
"Bread Bite",
|
||||||
|
"Self-Aware Beauty Mark",
|
||||||
|
"Mutated Milk",
|
||||||
|
"Snack Attack",
|
||||||
|
]
|
||||||
|
for item in items:
|
||||||
|
if item in name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_reskin(item):
|
||||||
|
name = item.get('name', '')
|
||||||
|
items = [
|
||||||
|
"Shooting Star",
|
||||||
|
"C.A.P.P.E.R",
|
||||||
|
"Batsaber",
|
||||||
|
"Giger Counter",
|
||||||
|
]
|
||||||
|
for item in items:
|
||||||
|
if item in name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def final_filter(item):
|
||||||
|
name = item.get('name', '')
|
||||||
|
items = [
|
||||||
|
"Memory Maker", # Unobtainable item (as of now)
|
||||||
|
"Saxxy", # Unobtainable item (as of now)
|
||||||
|
"Deflector", # MVM specific item
|
||||||
|
"Gloves of Running Urgently MvM", # MVM specific item
|
||||||
|
"Golden Wrench", # Extremely rare item, not obtainable
|
||||||
|
"Gold Frying Pan", # Extremely rare item, not obtainable
|
||||||
|
"Necro Smasher", # Unobtainable item (as of now, strangifier is extremely rare)
|
||||||
|
]
|
||||||
|
for item in items:
|
||||||
|
if item in name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
my_items = my_items.get('result', {}).get('items', [])
|
||||||
|
schema_items = schema_items_json.get('items', [])
|
||||||
|
|
||||||
|
strange_items = filter(is_strange_items, my_items)
|
||||||
|
strange_schema_items = filter(is_strange_schema, schema_items)
|
||||||
|
# Filter to only weapons, for brevity
|
||||||
|
strange_schema_items = filter(is_weapon, strange_schema_items)
|
||||||
|
# Filter out war paints
|
||||||
|
strange_schema_items = filter(lambda item: not is_war_paint(item), strange_schema_items)
|
||||||
|
# Filter out slot tokens
|
||||||
|
strange_schema_items = filter(lambda item: not is_slot_token(item), strange_schema_items)
|
||||||
|
# Filter out default items
|
||||||
|
strange_schema_items = filter(lambda item: not is_default(item), strange_schema_items)
|
||||||
|
# Filter out ineligible promo items
|
||||||
|
strange_schema_items = filter(lambda item: not is_promo(item), strange_schema_items)
|
||||||
|
# Filter out ineligible community items
|
||||||
|
strange_schema_items = filter(lambda item: not is_community(item), strange_schema_items)
|
||||||
|
# Filter out botkiller items (are strange, but undesirable)
|
||||||
|
strange_schema_items = filter(lambda item: not is_botkiller(item), strange_schema_items)
|
||||||
|
# Filter out festive items (are strange, but undesirable)
|
||||||
|
strange_schema_items = filter(lambda item: not is_festive(item), strange_schema_items)
|
||||||
|
# Filter out bread items (are strange, but undesirable)
|
||||||
|
#strange_schema_items = filter(lambda item: not is_bread_item(item), strange_schema_items)
|
||||||
|
# Filter out reskins (are strange, but generally expensive)
|
||||||
|
#strange_schema_items = filter(lambda item: not is_reskin(item), strange_schema_items)
|
||||||
|
# Filter out general ineligible items
|
||||||
|
strange_schema_items = filter(lambda item: not final_filter(item), strange_schema_items)
|
||||||
|
|
||||||
|
|
||||||
|
# Now remove items from schema that have the same defidex as items in my_items
|
||||||
|
for item in strange_items:
|
||||||
|
defindex = item.get('defindex')
|
||||||
|
strange_schema_items = [s_item for s_item in strange_schema_items if s_item.get('defindex') != defindex]
|
||||||
|
|
||||||
|
# Now print what's remaining, like defindex: name
|
||||||
|
for item in strange_schema_items:
|
||||||
|
defindex = item.get('defindex')
|
||||||
|
name = item.get('name', 'Unknown Item')
|
||||||
|
common_name = item.get('item_name', name) # Fallback to 'name' if 'item_name' is not present
|
||||||
|
#print(f"Defindex: {defindex}, Name: {name}")
|
||||||
|
print(f"{common_name} ({name}) [{defindex}]")
|
||||||
|
|
Reference in New Issue
Block a user