/
zimaaadev
/
Parser
Обзор
Документация
Войти
/
zimaaadev
/
Parser
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
bot/utils/subscriptions.py
87 строк
3 KB
zimaaadev
Ищет природные объекты, набнрежные и т.п.
24 дек 2025, 17:18
24 дек 2025, 17:18
2d73bc2
Код
Авторство
О чём код?
# bot/utils/subscriptions.py # bot/utils/subscriptions.py import asyncio import logging from typing import Dict, List, Tuple from datetime import datetime from bot.utils.database import save_listing, is_listing_exists from parsers.aggregator import aggregate_listings logger = logging.getLogger(__name__) # Храним активные подписки subscriptions: Dict[int, Dict] = {} # user_id → {site, city, category} # === Управление подписками === def subscribe(user_id: int, site: str, city: str, category: str): subscriptions[user_id] = { "site": site, "city": city, "category": category, "last_check": datetime.now().isoformat() } logger.info(f"✅ Пользователь {user_id} подписан на {site}/{city}/{category}") def unsubscribe(user_id: int): if user_id in subscriptions: logger.info(f"❌ Пользователь {user_id} отписан") subscriptions.pop(user_id) def get_subscriptions() -> List[Tuple[int, Dict]]: return list(subscriptions.items()) # === Проверка новых объявлений === async def check_new_listings(context): logger.info("🔍 Проверка новых объявлений для подписчиков...") found = 0 try: async for item in aggregate_listings(): avito_id = item.get("avito_id") or item.get("id") if not avito_id: continue # Пропускаем, если уже есть в БД if await is_listing_exists(avito_id): continue # Сохраняем в PostgreSQL await save_listing(item) logger.info(f"💾 Новое объявление: {avito_id}") # Рассылаем подписчикам for user_id, sub in get_subscriptions(): if sub["site"].lower() not in item.get("source", "").lower(): continue try: message = ( f"🔥 <b>Новое объявление!</b>\n\n" f"📌 <b>{item['title']}</b>\n" f"📍 {item.get('address') or item.get('location', 'Не указано')}\n" f"💰 {item['price']}\n" f"📐 {item.get('price_per_m2', '—')}\n" f"🔗 <a href='{item['url']}'>Смотреть</a>" ) if item.get("image_url"): await context.bot.send_photo( chat_id=user_id, photo=item["image_url"], caption=message, parse_mode="HTML" ) else: await context.bot.send_message( chat_id=user_id, text=message, parse_mode="HTML" ) found += 1 except Exception as e: logger.error(f"❌ Ошибка отправки {user_id}: {e}") logger.info(f"✅ Рассылка завершена. Отправлено: {found} уведомлений") except Exception as e: logger.error(f"❌ Ошибка в check_new_listings: {e}")