75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
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)
|