Code Monkey home page Code Monkey logo

botlooter's Introduction

Описание

Софт позволяет передать предметы от нескольких Steam аккаунтов на один. Кратко - Лутать ботов.

Функционал

  • Лутание любых инвентарей, например стим, кс, дота, тф2 и т.д.
  • Многопоточное или однопоточного лутание.
  • Использование прокси.

Конфиг

BotLooter.Config.json

{
 "LootThreadCount": 1,
 "ProxiesFilePath": "proxies.txt",

 "AskForApproval": true,
 "ExitOnFinish": false,

 "LootTradeOfferUrl": "",

 "AccountsFilePath": "",
 "IgnoreAccountsFilePath": "",
 "SecretsDirectoryPath": "",
 "SteamSessionsDirectoryPath": "",

 "SuccessfulLootsExportFilePath": "",

 "DelayBetweenAccountsSeconds": 30,
 "DelayInventoryEmptySeconds": 10,

 "Inventories": ["440/2", "753/6", "730/2"],

 "MaxItemsPerTrade": 5000,
 "MaxItemsPerAllTrades": 100000,

 "IgnoreMarketable": false,
 "IgnoreNotMarketable": false,

 "LootOnlyItemsWithNames": ["Mann Co. Supply Crate Key"],
 "IgnoreItemsWithNames": ["The Frying Pan"],

 "LootOnlyItemsWithAppIds": [351940],
 "IgnoreItemsWithAppIds": [12345],

 "LootOnlyItemsWithTags": ["Trading Card", "Booster Pack"],
 "IgnoreItemsWithTags": ["Profile Background"]
}

"LootTradeOfferUrl"

Cсылка на трейд оффер, на который будут отправляться предметы.
Для работы необходимо скопировать полную актуальную ссылку. Пример.

  • "https://steamcommunity.com/tradeoffer/new/?partner=9639579492&token=2ix22Ruv2"

"SecretsDirectoryPath"

Путь к папке с МаФайлами.


"AccountsFilePath"

Путь к файлу с аккаунтами формата login:password


"SteamSessionsDirectoryPath"

Путь к папке с файлами .steamsession.
Так же можно часть аккаунтов загружать из МаФайлов, а часть из .steamsession файлов.
Создать такие файлы можно с помощью https://github.com/Sadzurami/steam-sessions-creator


"IgnoreAccountsFilePath"

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

  • При значении "" файл не используется
  • Если указать одинаковое значение для этого параметра и "SuccessfulLootsExportFilePath" - это поможет избежать повторного лутания одних и тех же аккаунтов.

"ProxiesFilePath"

Путь к файлу с прокси. Пример.


"SuccessfulLootsExportFilePath"

Путь к файлу, в который будут записываться логины ботов, которые были успешно залутаны.

  • При значении "" файл не используется

"DelayBetweenAccountsSeconds"

Задержка при успешном и ошибочном лутаниях.
Указывается в секундах.


"DelayInventoryEmptySeconds"

Задержка при пустом инвентаре.
Указывается в секундах.


"AskForApproval"

  • true - Будет требоваться подтверждение нажатием любой клавиши.
  • false - 5 секундное ожидание без подтверждения начала работы.

"ExitOnFinish"

  • true - Программа сама закроется через 5 секунд после завершения работы.
  • false - Программа будет ждать нажатия ctrl + c для закрытия.

"LootThreadCount"

Максимальное количество потоков для лутания.
Не может быть больше количества прокси.
Без прокси может быть только 1


"Inventories"

Список инвентарей для лутания. Можно указывать один или несколько.
Формат "appId/contextId"

Некоторые известные инвентари:

  • "730/2" - CS:GO
  • "753/6" - Steam Community
  • "440/2" - TF2

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

"Inventories": [
  "730/2",
  "753/6",
  "440/2"
]

"MaxItemsPerTrade"

Максимальное количество предметов, которые нужно передать за один раз.


"MaxItemsPerAllTrades"

Максимальное количество предметов, которые нужно передать за все время работы приложения. По достижению этого значения приложение завершит работу.

Если вы работаете в несколько потоков, рекомендуется указывать значение немного меньше, чем предметов вам необходимо, так как нету гарантии, что все потоки завершат работу одновременно и предметы будут подсчитаны верно.


"IgnoreNotMarketable"

  • true - Предметы, которые невозможно продать будут игнорироваться.
  • false - Значение по умолчанию.

"IgnoreMarketable"

  • true - Предметы, которые возможно продать будут игнорироваться.
  • false - Значение по умолчанию.

"LootOnlyItemsWithNames"

Список предметов, которые будут лутаться, отфильтрованные по имени. Если список пустой, то будут лутаться все предметы.

Пример, который будет лутать только TF2 ключи и билеты.

"LootOnlyItemsWithNames": [
    "Mann Co. Supply Crate Key",
    "Tour of Duty Ticket",
]

"IgnoreItemsWithNames"

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

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

"IgnoreItemsWithNames": [
    "The Frying Pan"
]

"LootOnlyItemsWithAppIds"

Применяется только к инвентарям Steam Community (753/6)

Список предметов, которые будут лутаться, отфильтрованные по appId.

Пример, который будет лутать только предметы из игры The Descendant.

"LootOnlyItemsWithAppIds": [
    351940
]

"IgnoreItemsWithAppIds"

Применяется только к инвентарям Steam Community (753/6)

Список предметов, которые будут игнорироваться, отфильтрованные по appId.

Пример, который будет игнорировать предметы из игры The Descendant.

"IgnoreItemsWithAppIds": [
    351940
]

"LootOnlyItemsWithTags"

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

Пример, который будет лутать только карточки, бустеры и гемы.

"LootOnlyItemsWithTags": [
    "Trading Card",
    "Booster Pack",
    "Gems"
]

"IgnoreItemsWithTags"

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

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

"IgnoreItemsWithTags": [
    "Profile Background"
]

Коммандная строка

--config-file-path (-c)

Указывает путь к конфигу, если требуется использовать не стандартный путь.

Пример:

  • BotLooter.exe -c "C:/Users/BestUser/Desktop/BotLooter.Config.json"
  • BotLooter.exe --config-file-path "C:/Users/BestUser/Desktop/BotLooter.Config.json"

Замечания

Особенности работы, подсказки и ответы на некоторые вопросы.

Пути

Пути в конфиге можно указать как локальные, так и полные.
В случае написания с бекслешем необходимо заменять \ на \\ примеры:

  • "C:\\Users\\BestUser\\Desktop\\SSF\\secrets"
  • ".\\secrets"
  • "secrets"
  • "accounts.txt"
  • "./accounts.txt"

Названия предметов для фильтров

Название предметов необходимо указывать на английском языке. Если предмет был переименован, нужно указывать его основное название.

Теги

Название тегов необходимо указывать на английском языке. Найти теги можно нажав на предмет в инвентаре, они будут в самом низу.

Примеры

Скриншот работы софта

botlooter's People

Contributors

lyrapuff avatar sadzurami avatar zebatuq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

botlooter's Issues

Баг: При использовании .steamweb файлов невозможно отправить обмен

telegram-cloud-photo-size-2-5298832081314501708-x

Происходит это часто, но не в 100% случаев.

.steamweb файлы хранят куки, конкретно - SteamLoginSecure.
Куки представляют из себя структуру steamid64 + || + access_token.
Срок жизни access_token составляет 24 часа и 5 минут.

По истечению срока жизни, при запросе к любой странице стима - происходит redirect 302 на страницу https://login.steampowered.com/jwt/refresh, где происходит получение нового access_token с помощью refresh_token.

Иными словами, использование .steamweb файлов позже 24 часов после создания - не имеет смысла, и вероятно, ошибка на скрине связана с этим.

Если не использовать опцию SavedSessionsDirectoryPath - проблема исчезает.

Лутание по качеству предмета

Предлагаю сделать лутание предметов по качетсву, так как для тех кто фармит в кске, не охота лутать ширп вместе с кесами на один акк. Лучше будет лутать кейсы и скины выше армейского

Улучшения: изменить загрузку инвентаря

Steamkit2/ASF использует новый API для загрузки инвентарей, который в разы быстрее и не имеет лимитов.
Загружать можно до 100к предметов за один запрос.

Почему бы не использовать его?

https://api.steampowered.com/IEconService/GetInventoryItemsWithDescriptions/v1/?steamid=765611980xxxxxxx&appid=730&contextid=2&count=50000&get_descriptions=true&access_token=xxxxx

access_token - можно получить сделав GET https://store.steampowered.com/pointssummary/ajaxgetasyncconfig

response:

{
	"response": {
		"assets": [],
		"descriptions": [],
		"more_items": true,
		"last_assetid": "",
		"total_inventory_count": 12345
	}
}

more_items - если предметов в инвентаре больше, чем вернул запрос
last_assetid - если предметов больше, последний assetid, с которого нужно начинать следующий запрос (параметр start_assetid)

Улучшения: подсчет кол-ва отправленных предеметов.

Добавить подсчет отправленных предметов после завершения работы.
Также если это возможно, добавить параметр который перестанет лутать предметы на аккаунт, если указать определенную ценность инвентаря при которой: Бот либо останавливается, либо продолжает лутать на следующий по списку аккаунт.

"MaxValueOfInventory": 500 "Сумма в долларах, если возможно то в других валютах"

Баг: Каждый новый поток делает запрос смещения времени

image

В теории не должно быть более 1 запроса за всё время работы приложения.
Если есть возможность передавать данные в потоки, то было бы лучше вынести определение смещения времени в глобальный поток, перед созданием остальных.

Улучшения: добавить возможность лутать определенные предметы, а не весь инвентарь целиком

Фильтровать интересующие нас предметы можно по classid, который присутствует при запросе к инвентарю steam

GET https://steamcommunity.com/inventory/xxxxxx/inventory_id/context_id?l=english&count=2000

response:

{
	"assets": [
		{
			"classid": "12345"
		}
	],
	"descriptions": [
		{
			"market_name": "Some name"
		}
	]
}

В дополнении и для удобства пользователя, можно осуществлять фильтрацию с помощью регулярного выражения на имени предмета

В настройках вынести этот пункт в качестве массива, например:

{
"IncludeItemIds": ["123", "12345"],
"IncludeItems": ["frying pan"]
}

Помимо прочего можно сделать подобные настройки для игнорирования определенных предметов (Exclude Items), таким образом лутая всё, кроме отмеченных в настройках.

Улучшения: добавить опцию IgnoreMarketable

Опция, схожая по принципу работы с IgnoreNotMarketable, только работающая по обратному принципу.
Полезна в случаях, когда необходимо очистить инвентари от мусора.

Улучшения: добавить возможность загрузки инвентаря целиком

Сейчас загружаются только первые 100 предметов.

https://github.com/Sadzurami/BotLooter/blob/4032b574f355f5dd1da63be4e6322e3ec6120bc8/BotLooter/Steam/SteamWeb.cs#L21-L28

Steam позволяет загружать по ссылке максимум 2000 предметов за раз.
Если количество предметов больше 2000, необходимо делать паузу 5с перед следующим запросом предметов

Улучшения: выбирать трансфер для получения куки случайным образом из доступных

Текущая реализация работает хорошо, но все трансфер запросы (/settoken) идут к store.steampowered.com.

Было бы лучше выбирать transfer случайным образом из всех доступных (их 5), для балансировки нагрузки между доменами.

Было бы ещё лучше - пытаться делать запрос к другому transfer (тоже случайному, а не по порядку), если текущий запрос окончился неудачей.

Единственный нюанс, я бы наверное ограничился 3мя трансферами из 5, исключая steam.tv и checkout.steampowered.com (они, как и все остальные трансферы, дают необходимые куки, это лишь личное предпочтение)

image

Улучшения: передавть предметы определеенного типа

Добавить преедачу предметов определенного типа в зависимости от игры. Например в ксго: Граффити, винтовки, инструменты и т.д.
Также вместо типа, можно сделать качество предмета, например: Базовый, ширптореб, армейское, тайное и т.д.

Улучшения: не лутать ботов повторно

Пожалуй одна из самых важных вещей в процессе лутания до сих пор не реализована.
Пока что у нас нет механизма для игнорирования аккаунтов, которые ранее были залутаны.

Полезно это будет всем, т.к. трейды стима не идеальны, часто бывают ошибки из-за которых мы вынуждены лутать повторно.

Для реализации этой задачи предлагаю универсальную идею:

Использовать файл игнорирования.

"IgnoreAccountsFilePath": "ignore-list.txt"

В этом файле будут находится юзернеймы, которые необходимо игнорировать в процессе импорта ботов.
В процессе лутания мы должны будем периодически сбрасывать в этот файл юзернеймы ботов, которые закончили своё лутание успешно.

Улучшения: возможность выбирать LootTradeOfferUrl из списка

Текущая реализация сосредоточена на лутании множества ботов на один единственный аккаунт.
В некоторых случаях было бы удобно лутать предметы ни на один аккаунт, а на список аккаунтов.

Например:

"LootTradeOfferUrls": [
  "link1",
  "link2",
  "link3",
]

В процессе лутания выбирать аккаунт по принципу round-robin, т.е. лутать на каждый аккаунт последовательно.

Исходя из предложения выше, было бы здорово реализовать ограничитель количества предметов на один аккаунт.

Например, лутать на каждый аккаунт 500 предметов, по достижению лимита - игнорировать этот аккаунт:

"MaxItemsForTradeUrl": 500

Улучшения: добавить авторизацию с помощью WebRefreshToken

Подобный подход поможет уменьшить количество запросов к steam и ускорить процесс авторизации.
Помимо прочего, steam будет думать, что мы авторизуемся с одного и того же браузера, что немного выигрывает в его доверии (сейчас steam считает, что мы каждый раз авторизуемся с разных устройств).

steam-sessions-creator умеет создавать WebRefreshToken, благодаря которому можно получать куки в любой момент, без ограничений и без рейтлимитов.

Для получения свежих куки необходимо сделать:

POST multipart https://login.steampowered.com/jwt/finalizelogin
headers:

{
	"accept": "application/json, text/plain, */*",
	"sec-fetch-site": "cross-site",
	"sec-fetch-mode": "cors",
	"sec-fetch-dest": "empty"
}

body:

{
	"nonce": "refresh_token",
	"sessionid": "случайная строка, 24 символа, hex алфавит",
	"redir": "https://steamcommunity.com/login/home/?goto="
}

response:

{
	"transfer_info": [
		{
			"url": "https://steamcommunity.com/login/settoken",
			"params": {
				"nonce": "xxxxx",
				"auth": "xxxxxx"
			}
		}
	],

	"error": "ошибка, если есть"
}

POST multipart https://steamcommunity.com/login/settoken
headers:

{
	"accept": "application/json, text/plain, */*",
	"sec-fetch-site": "cross-site",
	"sec-fetch-mode": "cors",
	"sec-fetch-dest": "empty"
}

body:

{
	"steamID": "steamid64",
	"auth": "transfer_info..params.auth из ответа на предыдущий запрос",
	"nonce": "transfer_info..params.nonce из ответа на предыдущий запрос"
}

В ответе на запрос будут куки, если не было ошибок.

Примечание - необходимо использовать именно WebRefreshToken, иначе токен будет аннулирован.

Улучшения: добавить повторные попытки отправить tradeoffer при ошибке 500

private async Task<(ulong? TradeOfferId, string Message)> SendTradeOffer(TradeOfferUrl tradeOfferUrl, JsonTradeOffer tradeOffer)

В функции SendTradeOffer было бы не плохо добавить повторные попытки отправить tradeoffer, если стим возвращает серверную ошибку 500.

Происходит это часто.

15:36:34 inf : ** | ****** | Не смог спарсить айди обмена - InternalServerError {"strError":"There was an error sending your trade offer. We were unable to contact the game's item server. The game's item server may be down or Steam may be experiencing temporary connectivity issues. Please try again later."}

Предлагаю делать паузу 10с, и суммарно до 3х попыток отправить оффер.

Bug

Снимок экрана 2024-04-18 в 00 24 26

как это фиксить?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.