Как мне пришла эта идея
На уроке обществознания предложили создать бизнес-план своего проекта. Я начал думать, что я буду описывать. Можно было сделать только план, но я решил сделать целый проект. Тогда, все что я умел программировать - это telegram боты на aiogram и telebot. И в голову пришла идея сделать приложение на PyQt6 и telegram бот для покупки подписок.
Первые попытки
Я пробовал использовать tkinter, все было ок, но дизайн выходил скучным и не было полной поддержки javascript вставок, которые мне были нужны чтобы связать tg бот и само приложение. Была идея, когда пользователь хотел зайти в аккаунт, появлялось бы меню с кнопкой "войти через telegram". Но tkinter нормально не поддерживал js, поэтому я перешел на PyQt6, где была полная его поддержка.
Первые дизайны получались откровенно дерьмовыми и я начал использовать либу custom-tkinter. С ней ситуация улучшилась, но все же я не мог сделать аутентификацию через telegram. Я сменил курс на PyQt6 и PyDracula как стартовый шаблон.
Переход на веб-приложения
Главным минусом для меня любых gui на python является их размер. Как я помню, приложение на PyQt6 у меня весило около 600 мегабайт в распакованном виде. При этом там практически ничего не было кроме кнопочек и формочек. Надо было что-то делать. В голове появилась идея перенести интерфейс на сервер и подгружать его когда это нужно. С этой задачею отлично справлялся electron. Я мог просто захостить сайт и подгружать его удаленно с клиента! Меня это воодушевило и в этот момент начался мой путь знакомства с веб фреймворками.
Создание telegram бота
Данные о подписках надо было как-то хранить и я решил юзать sqlite как бд. В самом tg боте была система выдачи ключей. Примерная схема работы была такова:
Генерация ключа
Выдача ключа пользователю
Запись в бд уже зашифрованного ключа
Для представления меню я использовал WebApp. Его код вы можете найти на моем github. Кстати я использовал фишку для проводки разных изображений и цен для разных товаров.
Вот код:
ITEMS = {
"1": "7",
"2": "31",
"3": "365",
"4": "infinity"
}
ITEMS_IMAGE = {
"1": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/%D1%82%D0%B5%D1%81%D1%82.png",
"2": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/1%20%D0%BC%D0%B5%D1%81%D1%8F%D1%86.png",
"3": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/1%20%D0%B3%D0%BE%D0%B4.png",
"4": "https://raw.githubusercontent.com/alananisimov/"
"ezfps-tg-web-app/main/%D0%BD%D0%B0%D0%B2%D1%81%D0%B5%D0%B3%D0%B4%D0%B0.png"
}
await bot.send_invoice(
chat_id=web_app_message.chat.id,
title='Покупка',
description='Высокой FPS за минимальdную стоимость',
provider_token="" if mode != "dev" else "",
currency='rub',
need_email=False,
photo_url=ITEMS_IMAGE[f'{web_app_message.web_app_data.data}'],
need_phone_number=True,
prices=PRICE[f'{web_app_message.web_app_data.data}'],
start_parameter='',
payload=ITEMS[f'{web_app_message.web_app_data.data}']
)
Написание Electron приложения
Electron - потрясающая вещь. Он предоставляет возможность нативно управлять ПК через web приложение не храня интерфейс локально. Для оптимизации я сделал отдельный класс ScriptManager
. В нем можно удобно управлять, обновлять и удалять exe`шники и взаимодействовать с системой. Вот система оптимизации:
Формирование json файла с параметрами и путями до игр
Скачивание exe`шника с сервера
Запуск с параметрами из json файла
Создание оптимизационного скрипта
Концепция была такова:
Юзер выбирал степень оптимизации(чем больше - чем больше эффект)
Electron запускал скрипт с параметрами и этой степенью
Скрипт действовал по разному в отличии от системы
Сначала я пытался использовать bash скрипты, но на Windows они не работали, что осложняло разработку. С++ показался мне понятным и я мог полноценно взаимодействовать с системой. В коде я постарался разделить оптимизацию под разную систему используя ее особенности. К примеру на Windows я использовал powershell и изменение регистра. Но одно было везде - оптимизация CSGo и Dota2. Я играл в эти игры и понимал что там можно оптимизировать.
Фоточки
Конец
Спасибо за прочтение статьи! Я буду стараться и дальше развивать этот проект. Это мой первый проект такого размера. Жду разумную критику в комментариях :-)