Python. Создаем Steam бота.

Предисловие.

В этом уроке вы научитесь работать с библиотекой steampy, на которой можно создать steam бота.

Подготовка

Первым делом, получите steam_api ключ, он нам понадобится для получения информации о трейдах. Получить его можно на сайте steam: https://steamcommunity.com/dev/apikey

Далее, понадобятся shared_secret и identity_secret, дающие полный доступ к вашему аккаунту.

Получить его можно в SDA в папке maFiles, при условии что вы не шифровали этот файл. Или на телефоне под управлением android с рут правами, к которому привязан steam.

Создайте текстовый файл steam_guard.json, и поместите туда следующий текст.

{
    "steamid": "YOUR_STEAM_ID_64",
    "shared_secret": "YOUR_SHARED_SECRET",
    "identity_secret": "YOUR_IDENTITY_SECRET"
}

Steamid берем тут. В поле сайта, введите ссылку на аккаунт.

И установите библиотеку steampy, введя данную комманду в консоли.

pip install steampy

Подтверждаем обмен.

Напишем основу стим бота.

from steampy.client import SteamClient #импортируем библиотеку

steam_client = SteamClient('MY_API_KEY') 
steam_client.login('MY_USERNAME', 'MY_PASSWORD', 'steam_guard.json') #авторизируемся в аккаунте

Данный код отвечает за авторизацию на аккаунте.

Далее, попросите друга или бота кинуть трейд, чтобы на аккаунте висел не принятый обмен.

И пройдите по данной ссылке.

https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=STEAM_API_KEY&get_received_offers=1

STEAM_API_KEY — замените на свой.

Данная ссылка, это api запрос, который выводит информацию о входящих трейдах в json формате, подробнее здесь.

Нас, во всем этом месиве, интересует только tradeofferid. Он понадобится для подтверждения обмена. Теперь, скопируйте следующие строки в свой скрипт.

trade_id = ваш_trade_id
steam_client.accept_trade_offer(trade_id)

trade_id — замените на собственный.

И запустите скрипт.

В итоге, обмен принят без нашего участия, что круто.

Кидаем обмен.

Создайте новый скрипт, и поместите туда следующий код:

from steampy.client import SteamClient, Asset
from steampy.utils import GameOptions, get_key_value_from_url, account_id_to_steam_id

def find_item_in_inventory(item_hash_name, items):
    for item in items.values():
        market_hash_name = item['market_hash_name']
        if market_hash_name != item_hash_name:
            continue
        return {
            'market_hash_name': market_hash_name,
            'id': item['id']
        }

def make_trade_1_item(give_item, get_item, trade_link):
    game = GameOptions.TF2
    my_items = steam_client.get_my_inventory(game)
    my_item_give = find_item_in_inventory(give_item, my_items)
    my_asset = [Asset(my_item_give['id'], game)]

    partner_account_id = get_key_value_from_url(trade_link, 'partner', True)
    partner_steam_id = account_id_to_steam_id(partner_account_id)
    partner_items = steam_client.get_partner_inventory(partner_steam_id, game)
        
    partner_item_give = find_item_in_inventory(get_item, partner_items)
    partner_asset = [Asset(partner_item_give['id'], game)]

    steam_client.make_offer_with_url(my_asset, partner_asset, trade_link)

steam_client = SteamClient('secret')
steam_client.login('secret', 'secret', "steam_guard.json")
trade_link = 'https://randomSteamTradeOfferLink1234_under_prog_ru'
make_trade_1_item('Refined Metal', 'Refined Metal', trade_link)

За отправку трейда отвечает функция make_trade_1_item, разберем её.

game = GameOptions.TF2

В качестве инвентаря выбрали инвентарь TF2

my_items = steam_client.get_my_inventory(game)
my_item_give = find_item_in_inventory(my_items, give_item)

Получаем информацию о предметах инвентаря. И отсеиваем ненужное, с помощью функции find_item_in_inventory. На выходе, получаем словарь такого формата:

{
  'market_hash_name': напзвание_предмета,
  'id': id_предмета
}

Далее, запаковываем предмет в Asset.

my_asset = [Asset(my_item_give['id'], game)]

Asset принимает 2 аргумента:

  • id предмета
  • код игры (для TF2, это 440)

Наши предметы готовы, осталось подготовить предметы партнера. Сперва, получим инвентарь партнера.

partner_account_id = get_key_value_from_url(trade_link, 'partner', True) #получаем id аккаунта из трейд ссылки
partner_steam_id = account_id_to_steam_id(partner_account_id) # id аккаунта преводим в steam_id
partner_items = steam_client.get_partner_inventory(partner_steam_id, game) #получаем инвентарь партнера

Отсеем все ненужное, и закинем в Asset.

partner_item_give = find_item_in_inventory(get_item, partner_items)
partner_asset = [Asset(partner_item_give['id'], game)]

Ассеты собраны, время посылать трейд.

steam_client.make_offer_with_url(my_asset, partner_asset, trade_link)

Заключение.

Данная библиотека, мне очень помогла в написании tf2.tm бота, который я упоминал здесь. Применив знания с данной статьи отсюда и отсюда, вы сможете написать похожего бота.

Итоговый результат.