Эта библиотека представляет Python обёртку для REST и WEB API Steam-Trader.
Она совместима с версиями Python 3.12+ и поддерживает работу как с синхронным, так и с асинхронным (asyncio) кодом.
В дополнение к реализации чистого API данная библиотека имеет ряд объектов высокого уровня и логирование, дабы сделать разработку клиентов и скриптов простой и понятной. Документация была написана исходя из API документации сайта.
Токен можно получить на сайте перейдя на вкладку API. В коде указывается один раз при создании клиента.
Чтобы получить ID сессии, нужно зарегистрироваться на сайте, зайти в панель разработчика браузера, перейти к файлам куки и скопировать значение ключа sid. Учтите, что это значение сбрасывается когда вы выходите из своего аккаунта.
Вы можете установить или обновить Steam-Trader API с помощью команды:
pip install steam-trader
Или можете построить билд на основе репозитория:
git clone https://github.com/Lemon4ksan/SteamTrader-Wrapper
cd SteamTrader-Wrapper
python setup.py install
Приступив к работе, первым делом необходимо создать экземпляр клиента.
from steam_trader.api import Client
client = Client('Ваш токен')
# или
from steam_trader.api import ClientAsync
client = ClientAsync('Ваш токен')
Для использования логирования, добавьте эти строчки в свой код. Будет приходить полученный результат всех методов, а если указать уровень logging.DEBUG, то будут приходить входы и выходы из функций.
import logging
logging.basicConfig(level=logging.INFO)
Все результаты запросов на сервер представлены в виде датаклассов, вы можете легко получить их данные используя аттрибуты.
operations_history = client.get_operations_history()
for operation in operations_history.data:
print(operation.type, operation.date)
Тайп хинты также указаны, это поможет вашему IDE определять неправильные операции с данными.
Библиотека предусматривает множество возможных ошибок, чтобы вы могли контролировать поведение программы при их возникновении. Присутствуют константы для игр, которые поддерживает сайт.
from steam_trader.exceptions import Unauthorized, UnknownItem, WrongTradeLink
from steam_trader.constants import TEAM_FORTRESS2_APPID, TF2_CRAFTABLE, DOTA2_RARITY_COMMON
Пример скрипта для продажи всего Очищенного металла в инвентаре TF2 с помощью синхронного клиента.
from steam_trader.api import Client
from steam_trader.constants import TEAM_FORTRESS2_APPID
client = Client('Ваш токен')
inventory = client.get_inventory(TEAM_FORTRESS2_APPID)
new_price = client.get_min_prices(1226).market_price - 0.01
for item in inventory.items:
if item.gid == 1226:
client.sell(item.itemid, item.assetid, price=new_price)
С помощью get_inventory мы получаем все предметы из инвенторя TF2, которые не находятся в продаже, проходим по каждому, находим Очищенный металл и выставляем его по цене на копейку меньше рыночной, чтобы быть впереди. Узнать минимальную стоимость предмета можно через get_min_prices.
Пример покупки всех предметов по GID ниже заданной стоимости.
from steam_trader.api import Client
from steam_trader.exceptions import NotEnoughMoney
client = Client('Ваш токен')
max_price = 9.00
gid = 3242
sell_offers = client.get_order_book(gid, mode='sell')
for offer in sell_offers.sell:
if offer[0] < max_price:
for _ in range(offer[1]):
try:
client.buy(gid, 1, offer[0])
except NotEnoughMoney:
exit('Не хватает денег :(')
С помощью get_order_book мы получаем все предложения о продаже, проходимся по каждому, если цена предложения меньше нашей максимальной, то мы покупаем все предложения по данной цене. Также мы используем исключение, если нам не хватит денег на покупку в любой момент.
Использование асинхронного клиента для получения запросов информации большого числа предметов.
import asyncio
from steam_trader.api import ClientAsync
client = ClientAsync('Ваш токен')
gids = [1226, 1402, 3439, 1976, 1984, 1990, 1227, 1205, 1523, 2484, 1524, 1503, 1506, 1220, 1515, 3530, 1745, 1202]
async def main():
async with client:
tasks = [client.get_item_info(gid) for gid in gids]
responses = await asyncio.gather(*tasks)
for response in responses:
print(response)
asyncio.run(main())
Благодаря асинхронности, мы отправили все запросы на сервер одновременно и получили результат намного быстрее, чем с синхронным клиентом. Мы не ждём ответа при каждом запросе, а переключаемся на другой. Если вам это не понятно, изучите модуль asyncio.
REST API сайта даёт не полный доступ к его данным. Для некоторых задач необходим WEB функционал. Например, для получения описаний индивидуальных предметов.
from steam_trader.web import WebClient
with WebClient('Ваш токен') as client:
item_info = client.get_item_info(1523)
for offer in item_info.sell_offers:
print(item_info.descriptions[offer.itemid])
Полную документацию можно найти здесь: https://lemon4ksan.github.io/steam-trader/
Внесение своего вклада максимально приветствуется!
Вы можете помочь, сообщив о баге или предложив новый функционал.
Данная библиотека будет переодически обновляться и дополняться.
См. Оригинал на английском LICENSE
Разрешается повторное распространение и использование как в виде исходного кода, так и в двоичной форме, с изменениями или без, при соблюдении следующих условий:
- При повторном распространении исходного кода должно оставаться указанное выше уведомление об авторском праве, этот список условий и последующий отказ от гарантий.
- При повторном распространении двоичного кода должна сохраняться указанная выше информация об авторском праве, этот список условий и последующий отказ от гарантий в документации и/или в других материалах, поставляемых при распространении.
- Ни имя автора, ни имена участников не могут быть использованы в качестве поддержки или продвижения продуктов, основанных на этом ПО без предварительного письменного разрешения.
ЭТА ПРОГРАММА ПРЕДОСТАВЛЕНА ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИМИ СТОРОНАМИ «КАК ОНА ЕСТЬ» БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. НИ В КОЕМ СЛУЧАЕ НИ ОДИН ВЛАДЕЛЕЦ АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК БЫЛО СКАЗАНО ВЫШЕ, НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ ИЛИ ПОСЛЕДОВАВШИЕ УБЫТКИ, ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПРИНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ВЛАДЕЛЕЦ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.