ключ, статистика, срок
This commit is contained in:
@@ -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}")
|
||||
|
||||
@@ -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,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:
|
||||
|
||||
Reference in New Issue
Block a user