Skip to content

Commit

Permalink
v0.9 - Release
Browse files Browse the repository at this point in the history
  • Loading branch information
mihalt committed Aug 27, 2017
0 parents commit 6f29581
Show file tree
Hide file tree
Showing 11 changed files with 478 additions and 0 deletions.
Empty file.
89 changes: 89 additions & 0 deletions for_less_than_5_bots(icons)/accept_offers_for_one_bot_template.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-

import json
import time
from os.path import join

from click import prompt
from steampy.client import SteamClient, TradeOfferState

from add_account import add_new_account

"""
ВВОД ДАННЫХ
Название файла, которое необходимо ввести ниже, генерируется автоматически, после запуска без
редактирования данного скрипта или скрипта add_account.py и ввода данных в него данных.
Найдите в папке accounts_data файл с данными, имя которого соответствует логину вашего аккаунта.
Пример вставки ниже: account_file = 'account_login.json'
"""
account_file = 'название_файла.json'


def main():
try:
steamguard_path = join('accounts_data', account_file)
with open(steamguard_path, 'r') as guard_file:
data = json.load(guard_file)

username = data['username']
password = data['password']
api_key = data['api_key']
print('Запуск бота, принимающего входящие офферы')
client = SteamClient(api_key)
client.login(username, password, steamguard_path)
print('Вход в Steam прошёл успешно.')
print('Офферы будут подтверждаться каждые 10 секунд. Нажмите Ctrl+С, чтобы сделать паузу.')
accept_offers(client)

except FileNotFoundError:
add_new_account()

except json.decoder.JSONDecodeError:
user_answer = prompt('\nОшибка декодирования. Скорее всего файлы с данными об аккаунтах пусты'
' или введены не верно.\n'
'Введите add, чтобы добавить\перезаписать новый аккаунт или любые символы, '
'чтобы выйти из программы\n'
'Ввод')

if user_answer == 'add':
add_new_account()

else:
exit()


def accept_offers(client):
if client.is_session_alive():
try:
while True:
offers = client.get_trade_offers()['response']['trade_offers_received']
for offer in offers:
if is_donation(offer):
offer_id = offer['tradeofferid']
num_accepted_items = len(offer['items_to_receive'])
client.accept_trade_offer(offer_id)
print('Принятые предложения {} - всего скинов в оффере {}'.format(offer_id, num_accepted_items))
time.sleep(10)

except KeyboardInterrupt:
user_answer = prompt('Введите "c" для продолжения')
if (user_answer == 'c') or (user_answer == 'с'):
print('Перезапуск подтверждения офферов. Нажмите Ctrl+С, чтобы сделать паузу.')
accept_offers(client)
else:
exit()

else:
main()


def is_donation(offer: dict):
return offer.get('items_to_receive') \
and not offer.get('items_to_give') \
and offer['trade_offer_state'] == TradeOfferState.Active \
and not offer['is_our_offer']


if __name__ == "__main__":
main()
44 changes: 44 additions & 0 deletions for_less_than_5_bots(icons)/add_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import json
from os import mkdir
from os.path import join

from terminal import prompt


def add_new_account():
username = prompt('\nВведите ваш логин от Steam')
password = prompt('Введите ваш пароль')
api_key = prompt('\nВвод API-ключа Steam. Вы его можете сделать доступным, '
'после перехода по ссылке https://steamcommunity.com/dev/apikey. '
'Для того, чтобы сделать его доступным необходимо один раз запустить на аккаунте '
'любую игру.\n\nИтак, введите API-ключ')
steamid = prompt('\nСледующие данные, если вы пользовались Steam Desktop Autendeficator, '
'можете найти в папке maFiles. Имя файла соответствует вашему SteamID(64)'
'Открывайте простым текстовым редактором. Если данные будут закодированы, то '
'просто сбросьте пароь от программы - зайдите в неё и нажмите Setup Encryption. '
'Далее следуйте инструкциям. Остальные способы можете узнать отсюда - '
'http://steamcommunity.com/sharedfiles/filedetails/?id=678365301'
'\n\nВведите ваш SteamID(64)')
shared_secret = prompt('Введите ваш shared_secret')
identity_secret = prompt('Введите ваш identity_secret')

data = {
'username': username,
'password': password,
'api_key': api_key,
'steamid': steamid,
'shared_secret': shared_secret,
'identity_secret': identity_secret
}

create_steam_guard_file(username, data)


def create_steam_guard_file(account_name, data):
try:
mkdir('accounts_data')
create_steam_guard_file(account_name, data)

except FileExistsError:
with open(join('accounts_data', account_name + '.json'), 'w') as guard_file:
json.dump(data, guard_file, sort_keys=True, indent=4, ensure_ascii=False)
Empty file.
45 changes: 45 additions & 0 deletions for_more_than_5_bots(terminal)/accept_offers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-

import time
from click import prompt

from steampy.client import SteamClient, TradeOfferState


def accept_incoming_offers(username, password, api_key, steamguard_path):
print('Запуск бота, принимающего входящие офферы')
client = SteamClient(api_key)
client.login(username, password, steamguard_path)
print('Вход в Steam прошёл успешно.')
print('Офферы будут подтверждаться каждые 10 секунд. Нажмите Ctrl+С, чтобы сделать паузу. Затем можно будет'
' выйти из цикла.')
accept_offers_loop(client)


def accept_offers_loop(client):
try:

while True:
offers = client.get_trade_offers()['response']['trade_offers_received']
for offer in offers:
if is_donation(offer):
offer_id = offer['tradeofferid']
num_accepted_items = len(offer['items_to_receive'])
client.accept_trade_offer(offer_id)
print('Принятые предложения {} - всего скинов в оффере {}'.format(offer_id, num_accepted_items))
time.sleep(10)

except KeyboardInterrupt:
user_answer = prompt('Введите "c" на английском для продолжения')
if (user_answer == 'c') or (user_answer == 'с'):
print('Перезапуск подтверждения офферов. Нажмите Ctrl+С, чтобы сделать паузу.')
accept_offers_loop(client)
else:
exit()


def is_donation(offer: dict):
return offer.get('items_to_receive') \
and not offer.get('items_to_give') \
and offer['trade_offer_state'] == TradeOfferState.Active \
and not offer['is_our_offer']
185 changes: 185 additions & 0 deletions for_more_than_5_bots(terminal)/account_input.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# -*- coding: utf-8 -*-

"""
Этот скрипт является модулем (составляющей) проограммы для торговли скинами в Steam.
Данный модуль является главным в программе. Его основная функция заключается в том,
чтобы спрашивать у пользователя, что ему необходимо и в зависимости от этого производить
такие действия (каждое действие - отдельный модуль:
1. Сохранять данные аккаунта, если их нет в системе. Они сохраняются в файл account_data.json,
а так же создаёт папку guard и сохраняет отдельные данные, необходимые для аутендефикации и авторизации в Steam.
2. Принятие входящих трейдов в цикле и его пауза при нажатии Ctrl+C. Возобновление при вводе 'c'.
3. и т.д. Функционал будет расширяться
Программа предполагает, что у пользователя уже есть доступ к торговой площадке и возможность мгновенного обмена
"""

import json
from os.path import abspath, join
from sys import exit

from accept_offers import accept_incoming_offers
from save_data import create_steam_guard_file, add_in_data
from click import prompt


def main():
"""Главная функция, которая вызывается после запуска скрипта.
Определяет, есть ли файл с
базой аккаунтов - account_data.json. Так же даёт возможность пользователю
выбрать первый аккаунт из списка, после ввода любых символов.
"""

try:
with open(data_file_name, 'r+') as data_file:
global data
data = json.load(data_file)
string = ''
counter = 1
dict_bots_ids_names = {} # Словарь в котором ключи являются цифрами (индентификаторми)

for account_name in data:
dict_bots_ids_names[str(counter)] = account_name
string += '{n}: {username}\n'.format(n=counter, username=account_name)
counter += 1

list_bots_ids_names_values = list(dict_bots_ids_names.values())

user_answer = prompt('\nВаши аккаунты в программе:\n' + string +
'\nДобавить дополнительные аккаунты? - введите add\n'
'Выбрать аккаунт, от которого хотите совершать действие - введите его номер '
'или имя\n'
'Совершить действие от первого аккаунта в списке - введите любой символ\n'
'Выйти из программы - введите e\n'
'\nВведите данные и нажмите Enter')

if user_answer == 'add':
add_new_account()
main()

elif (user_answer in list_bots_ids_names_values) or (user_answer in dict_bots_ids_names):
choose_account_and_accept_offers(user_answer, data, dict_bots_ids_names, string)


elif (user_answer == 'e') or (user_answer == 'е'):
exit()


elif not data:
add_new_account()


else:
first_username = dict_bots_ids_names['1']
accept_incoming_offers(first_username, data[first_username]['steam']['password'],
data[first_username]['steam']['api_key'], abspath(join('guard', first_username)))
repeat_user(data, dict_bots_ids_names, string)


except FileNotFoundError:
add_new_account()


except json.decoder.JSONDecodeError:
user_answer = prompt('\nОшибка декодирования. Скорее всего файлы с данными об аккаунтах пусты.\n'
'Введите add, чтобы добавить новый аккаунт или любые символы, чтобы выйти из программы\n'
'Ввод')

if user_answer == 'add':
add_new_account()

else:
exit()


def add_new_account():
"""Добавить новый аккаунт в систему
При вызове данной функции у пользователя запрашиваются все необходимые данные для аутендификации в Steam.
Функция возвращает словарь со всеми значениями, для её дальнейшей отправки в account_data.json.
Так же выделяются данные необходимые для входа через библиотеку steampy и создаётся соответствующий файл
в папке guard.
"""

username = prompt('\nВведите ваш логин от Steam')
password = prompt('Введите ваш пароль')
api_key = prompt('\nВвод API-ключа Steam. Вы его можете сделать доступным, '
'после перехода по ссылке https://steamcommunity.com/dev/apikey. '
'Для того, чтобы сделать его доступным необходимо один раз запустить на аккаунте '
'любую игру.\n\nИтак, введите API-ключ')
steamid = prompt('\nСледующие данные, если вы пользовались Steam Desktop Autendeficator, '
'можете найти в папке maFiles. Имя файла соответствует вашему SteamID(64)'
'Открывайте простым текстовым редактором. Если данные будут закодированы, то '
'просто сбросьте пароь от программы - зайдите в неё и нажмите Setup Encryption. '
'Далее следуйте инструкциям'
'\n\nВведите ваш SteamID(64)')
shared_secret = prompt('Введите ваш shared_secret')
identity_secret = prompt('Введите ваш identity_secret')

data[username] = {
'steam':
{
'username': username,
'password': password,
'api_key': api_key,
'steamid': steamid,
'shared_secret': shared_secret,
'identity_secret': identity_secret
}
}

create_steam_guard_file(username, steamid, shared_secret, identity_secret)
add_in_data(data)
main()


def choose_account_and_accept_offers(user_answer, data, dict_bots_ids_names, string):
# Данная функция позволяет выбрать от имени какого аккаунта необходимо совершить действие и логинится

if user_answer in map(str, dict_bots_ids_names):
username = dict_bots_ids_names[user_answer]
guard_file = abspath(join('guard', username + '.json'))
accept_incoming_offers(username, data[username]['steam']['password'], data[username]['steam']['api_key'],
guard_file)
repeat_user(data, dict_bots_ids_names, string)


elif user_answer in data.keys():
guard_file = abspath(join('guard', user_answer))
accept_incoming_offers(user_answer, data[user_answer]['steam']['password'],
data[user_answer]['steam']['api_key'], guard_file)
repeat_user(data, dict_bots_ids_names, string)

else:
user_answer = prompt(
string + '\nНекорректный ввод. Введите номер бота или его имя, от которого вы хотите совершить действие')
choose_account_and_accept_offers(user_answer, data, dict_bots_ids_names, string)


def repeat_user(data, dict_bots_ids_names, string):
# Данная функция позволяет пользователю продолжить работу с программой, после её удачного окончания по одному аккаунту.

user_answer = prompt('\n-Выбрать другой или этот аккаунт? - Введите номер бота или его имя \n\n' + string +
'\n-Добавить дополнительные аккаунты? - введите add\n'
'-Закрыть программу? - введите любой символ\n'
'Ввод данных'
)

if (user_answer in data) or (user_answer in dict_bots_ids_names):
choose_account_and_accept_offers(user_answer, data, dict_bots_ids_names, string)

elif user_answer == 'add':
add_new_account()


else:
exit()

main()


data_file_name = abspath('account_data.json')
data = {}
main()
24 changes: 24 additions & 0 deletions for_more_than_5_bots(terminal)/save_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import json
from os import mkdir
from os.path import join

data_file_name = 'account_data.json'


# Данная функция создаёт файл, необходимый для входа в Steam через библиотеку steampy, в папке guard.
def create_steam_guard_file(account_name, steamid, shared_secret, identity_secret):
try:
mkdir('guard')
create_steam_guard_file(account_name, steamid, shared_secret, identity_secret)

except FileExistsError:
with open(join('guard', account_name + '.json'), 'a') as guard_file:
guard_dict = {"steamid": steamid, "shared_secret": shared_secret, "identity_secret": identity_secret}
json.dump(guard_dict, guard_file, sort_keys=True, indent=4, ensure_ascii=False)


# Данная функция добавляет в файл данные, введённые пользователем в add_new_account().
def add_in_data(data):
with open(data_file_name, 'w') as new_file:
json.dump(data, new_file, sort_keys=True, indent=4, ensure_ascii=False)
print('\nДанные сохранены!')
5 changes: 5 additions & 0 deletions install_modules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import subprocess

run_pip = subprocess.check_call(['pip', 'install', '-r', 'requirements.txt'])
input('Нажмите Enter, чтобы завершить программу: ')

Loading

0 comments on commit 6f29581

Please sign in to comment.