import base64 import aiohttp from aiohttp import web from loguru import logger from config import SERVERS async def fetch_url_content(url): try: logger.debug(f"Получение URL: {url}") async with aiohttp.ClientSession() as session: async with session.get(url, ssl=False) as response: if response.status == 200: content = await response.text() logger.debug(f"Успешно получен контент с {url}") return base64.b64decode(content).decode("utf-8").split("\n") else: logger.error( f"Не удалось получить {url}, статус: {response.status}" ) return [] except Exception as e: logger.error(f"Ошибка при получении {url}: {e}") return [] async def combine_unique_lines(urls, query_string): all_lines = [] logger.debug(f"Начинаем объединение подписок для запроса: {query_string}") urls_with_query = [f"{url}?{query_string}" for url in urls] logger.debug(f"Составлены URL-адреса: {urls_with_query}") for url in urls_with_query: lines = await fetch_url_content(url) all_lines.extend(lines) all_lines = list(set(filter(None, all_lines))) logger.debug( f"Объединено {len(all_lines)} строк после фильтрации и удаления дубликатов" ) return all_lines async def handle_subscription(request): email = request.match_info["email"] logger.info(f"Получен запрос на подписку для email: {email}") urls = [] for server in SERVERS.values(): server_subscription_url = f"{server['SUBSCRIPTION']}/{email}" urls.append(server_subscription_url) query_string = request.query_string logger.debug(f"Извлечен query string: {query_string}") combined_subscriptions = await combine_unique_lines(urls, query_string) base64_encoded = base64.b64encode( "\n".join(combined_subscriptions).encode("utf-8") ).decode("utf-8") headers = { "Content-Type": "text/plain; charset=utf-8", "Content-Disposition": "inline", "profile-update-interval": "7", "profile-title": email, } logger.info(f"Возвращаем объединенные подписки для email: {email}") return web.Response(text=base64_encoded, headers=headers)