From 4a3883ee71f64a674fc44c9bf7bae7d55efb523e Mon Sep 17 00:00:00 2001 From: Capybara-z Date: Tue, 18 Feb 2025 13:45:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BA=D0=B0=D0=B7=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/keys/subscriptions.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/handlers/keys/subscriptions.py b/handlers/keys/subscriptions.py index 4e9daa40..9fe44941 100644 --- a/handlers/keys/subscriptions.py +++ b/handlers/keys/subscriptions.py @@ -149,6 +149,7 @@ async def handle_subscription(request, old_subscription=False): combined_subscriptions = await combine_unique_lines(urls, tg_id or email, query_string) random.shuffle(combined_subscriptions) + # Извлечение времени (time_left) из метаданных подписки. time_left = None for line in combined_subscriptions: if "#" in line: @@ -157,12 +158,9 @@ async def handle_subscription(request, old_subscription=False): except ValueError: continue parts = meta.split("-") - - if SUPERNODE: - candidate = parts[-1] if parts else "" - else: - candidate = parts[-1] if parts else "" + candidate = parts[-1] if parts else "" candidate_decoded = urllib.parse.unquote(candidate) + # Ищем формат "11D,1H", либо "1H" m = re.search(r'(?:(\d+)D,)?(\d+)H', candidate_decoded) if m: d = int(m.group(1)) if m.group(1) else 0 @@ -172,6 +170,7 @@ async def handle_subscription(request, old_subscription=False): if not time_left: time_left = "N/A" + # Логика зависит от значения SUPERNODE. cleaned_subscriptions = [] for line in combined_subscriptions: if "#" in line: @@ -181,19 +180,24 @@ async def handle_subscription(request, old_subscription=False): continue parts = meta.split("-") if SUPERNODE: + # Если SUPERNODE=True: + # Если трафик включен (4 поля или 3 поля): берем страну и трафик (если 4 поля – берем третью, если 3 – оставляем только страну) if parts: country = parts[0] + # Убираем префикс до символа "_" if "_" in country: country = country.split("_", 1)[1] if len(parts) == 4: meta_clean = country + "-" + parts[2] elif len(parts) == 3: + # Если трафик отключен, оставляем только страну meta_clean = country else: meta_clean = country else: meta_clean = "" else: + # Для SUPERNODE=False: if len(parts) == 4: meta_clean = parts[0] + "-" + parts[2] elif len(parts) == 3: @@ -210,14 +214,17 @@ async def handle_subscription(request, old_subscription=False): final_subscriptions = cleaned_subscriptions base64_encoded = base64.b64encode("\n".join(final_subscriptions).encode("utf-8")).decode("utf-8") + # Информации о подписке, которая используется в заголовке вместе с PROJECT_NAME subscription_info = f"📄 Подписка: {email} - {time_left}" user_agent = request.headers.get("User-Agent", "") if "Happ" in user_agent: + # Для Happ передаётся только PROJECT_NAME encoded_project_name = f"{PROJECT_NAME}" support_username = SUPPORT_CHAT_URL.split("https://t.me/")[-1] announce_str = f"↖️Бот | {subscription_info} | Поддержка↗️" + # Вычисляем expire таймштамп + текущее время expire_timestamp = 0 m_expire = re.search(r'(?:(\d+)D,)?(\d+)H', time_left) if m_expire: @@ -225,6 +232,7 @@ async def handle_subscription(request, old_subscription=False): h = int(m_expire.group(2)) expire_timestamp = int(time.time() + d * 86400 + h * 3600) + # Извлекаем общий трафик (total) total_traffic_bytes = 0 if cleaned_subscriptions: first_line = cleaned_subscriptions[0] @@ -246,6 +254,7 @@ async def handle_subscription(request, old_subscription=False): else: total_traffic_bytes = int(value) + # Заголовок subscription-userinfo для Happ subscription_userinfo = f"upload=0; download=0; total={total_traffic_bytes}; expire={expire_timestamp}" headers = { @@ -270,7 +279,6 @@ async def handle_subscription(request, old_subscription=False): logger.info(f"Возвращаем объединенные подписки для email: {email}") return web.Response(text=base64_encoded, headers=headers) - async def handle_old_subscription(request): """Обработка запроса для старых клиентов.""" return await handle_subscription(request, old_subscription=True)