ключ, статистика, срок

This commit is contained in:
Vlad
2024-09-16 06:50:53 +03:00
parent 40365a5324
commit 86c86c9198
3 changed files with 26 additions and 52 deletions
+16 -39
View File
@@ -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}")
+9 -13
View File
@@ -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<pre>{connection_link}</pre>", parse_mode="HTML")
# Сброс состояния
await state.clear()
except Exception as e:
await message.reply(f"Ошибка: {e}")
+1
View File
@@ -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: