From 86c86c9198f05be4cb8ff032e7ec9dd51b7ab048 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 16 Sep 2024 06:50:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87,=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B0,=20=D1=81=D1=80?= =?UTF-8?q?=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auth.py | 55 ++++++++++++++++------------------------------------- bot.py | 22 +++++++++------------ database.py | 1 + 3 files changed, 26 insertions(+), 52 deletions(-) diff --git a/auth.py b/auth.py index daa5f98d..6d3cbc00 100644 --- a/auth.py +++ b/auth.py @@ -1,17 +1,19 @@ - import requests -from config import GET_INBOUNDS_URL, AUTH_URL, DOMEN +from config import ADMIN_USERNAME, ADMIN_PASSWORD, GET_INBOUNDS_URL import json +session = None + def login_with_credentials(username, password): - auth_url = AUTH_URL + global session + session = requests.Session() + auth_url = "https://vpn.pocomacho.ru:34268/solonet/login/" data = { "username": username, "password": password } response = requests.post(auth_url, json=data) if response.status_code == 200: - session = requests.Session() session.cookies.update(response.cookies) return session else: @@ -24,53 +26,28 @@ def get_clients(session): else: raise Exception(f"Ошибка при получении клиентов: {response.status_code}, {response.text}") -def link(session, user_id: str): +def link(session, client_id: str): """ - Получение ссылки для подключения по ID пользователя. + Получение ссылки для подключения по ID клиента. :param session: requests.Session - авторизованная сессия - :param user_id: str - идентификатор пользователя (email или другой параметр) + :param client_id: str - идентификатор клиента :return: str - ссылка для подключения """ - client_id = '' - - # Получаем список клиентов через API response = get_clients(session) if 'obj' not in response or len(response['obj']) == 0: raise Exception("Не удалось получить данные клиентов.") - - # Извлекаем данные клиента + inbounds = response['obj'][0] # Убедитесь, что это правильный индекс settings = json.loads(inbounds['settings']) - # Ищем клиента по user_id - for client in settings["clients"]: - if client['email'] == user_id: - client_id = client["id"] - break - - if not client_id: - raise Exception(f"Клиент с идентификатором {user_id} не найден.") - - # Получаем streamSettings и генерируем ссылку + # Найти клиентский ID в настройках stream_settings = json.loads(inbounds['streamSettings']) - tcp = stream_settings.get('network', 'tcp') # Предположим, по умолчанию 'tcp' - reality = stream_settings.get('security', 'reality') # Предположим, по умолчанию 'reality' - flow = stream_settings.get('flow', 'xtls-rprx-vision') # Предположим, по умолчанию 'xtls-rprx-vision' - email = user_id - - # Создание ссылки для подключения VLESS - val = f"vless://{client_id}@{DOMEN}?type={tcp}&security={reality}&fp=chrome&pbk=ZIMoEnEd8-qMJkReVU5JxbiEj8CCSrvpm_ckvJ-46TE&sni=yahoo.com&sid=0fb4b595&spx=%2F&flow={flow}#VPN_F-{email}" + tcp = stream_settings.get('network', 'tcp') + reality = stream_settings.get('security', 'reality') + flow = stream_settings.get('flow', 'xtls-rprx-vision') + # Создание ссылки для подключения VLESS + val = f"vless://{client_id}@vpn.pocomacho.ru:443?type={tcp}&security={reality}&fp=chrome&pbk=ZIMoEnEd8-qMJkReVU5JxbiEj8CCSrvpm_ckvJ-46TE&sni=yahoo.com&sid=0fb4b595&spx=%2F&flow={flow}#VPN_F-{client_id}" return val -def get_statistics(session, tg_id: int): - # Пример URL для получения статистики - STATS_URL = f"https://vpn.pocomacho.ru:34268/solonet/panel/api/inbounds/stats/{tg_id}" - response = session.get(STATS_URL) - if response.status_code == 200: - stats = response.json() - # Форматирование статистики для отображения - return f"Загрузка: {stats['upload']} MB\nВывод: {stats['download']} MB" - else: - raise Exception(f"Ошибка при получении статистики: {response.status_code}, {response.text}") diff --git a/bot.py b/bot.py index 808e1e51..161e39b1 100644 --- a/bot.py +++ b/bot.py @@ -100,15 +100,14 @@ async def handle_text(message: types.Message, state: FSMContext): current_state = await state.get_state() if current_state == Form.waiting_for_key_name.state: + tg_id = message.from_user.id + + if await has_active_key(tg_id): + await message.reply("У вас уже есть активный ключ. Вы не можете создать новый.") + await state.clear() + return + try: - tg_id = message.from_user.id - - # Проверка на наличие активного ключа - if await has_active_key(tg_id): - await message.reply("У вас уже есть активный ключ. Один клиент может иметь только один активный ключ.") - return - - # Создание уникального ID клиента client_id = str(uuid.uuid4()) email = message.text limit_ip = 1 @@ -120,16 +119,13 @@ async def handle_text(message: types.Message, state: FSMContext): add_client(session, client_id, email, tg_id, limit_ip, total_gb, expiry_time, enable, flow) - # Получение ссылки на подключение - connection_link = link(session, email) + # Используем client_id для получения ссылки + connection_link = link(session, client_id) - # Сохранение данных в базу данных await add_connection(tg_id, client_id, email, expiry_time) - # Отправка ключа в виде цитаты await message.reply(f"Ключ создан:\n
{connection_link}
", parse_mode="HTML") - # Сброс состояния await state.clear() except Exception as e: await message.reply(f"Ошибка: {e}") diff --git a/database.py b/database.py index 192bb1c8..e2fd22a3 100644 --- a/database.py +++ b/database.py @@ -1,6 +1,7 @@ import aiosqlite from datetime import datetime from config import DATABASE_PATH +import aiosqlite async def init_db(): async with aiosqlite.connect(DATABASE_PATH) as db: