Загрузка данных


import time
import json
import os
import re
from curl_cffi import requests
from bs4 import BeautifulSoup

# === НАСТРОЙКИ ===
TELEGRAM_BOT_TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER"
TELEGRAM_CHAT_ID = "ВАШ_CHAT_ID"
MAX_PRICE = 2000

# Ссылка из браузера с фильтром "по дате" и нужным регионом/поиском:
AVITO_URL = "https://www.avito.ru/rossiya/odezhda_obuv_aksessuary/aksessuary/golovnye_ubory-ASgBAgICAUT8AtgM?q=gatta&s=104"

# Файл, куда сохраняются уже увиденные ID объявлений
SEEN_FILE = "seen_items.json"
CHECK_INTERVAL_SECONDS = 90  # Интервал проверки (не ставь слишком часто, чтобы не словить бан)


def send_telegram_message(text: str):
    """Отправка сообщения в Telegram."""
    api_url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
    payload = {
        "chat_id": TELEGRAM_CHAT_ID,
        "text": text,
        "parse_mode": "HTML",
        "disable_web_page_preview": False
    }
    try:
        requests.post(api_url, json=payload, timeout=10)
    except Exception as e:
        print(f"[TG ERROR] Ошибка отправки: {e}")


def load_seen_ids() -> set:
    if os.path.exists(SEEN_FILE):
        try:
            with open(SEEN_FILE, "r", encoding="utf-8") as f:
                return set(json.load(f))
        except Exception:
            return set()
    return set()


def save_seen_ids(seen_ids: set):
    with open(SEEN_FILE, "w", encoding="utf-8") as f:
        json.dump(list(seen_ids), f, ensure_ascii=False, indent=2)


def extract_price(price_text: str) -> int:
    """Извлекает число из строки вида '1 800 ₽'."""
    clean_digits = re.sub(r"[^\d]", "", price_text)
    return int(clean_digits) if clean_digits else 0


def check_avito(seen_ids: set):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.avito.ru/",
    }

    try:
        # curl_cffi маскирует TLS-отпечаток под реальный Chrome
        response = requests.get(
            AVITO_URL,
            headers=headers,
            impersonate="chrome124",
            timeout=20
        )

        if response.status_code != 200:
            print(f"[AVITO] Ошибка доступа: статус {response.status_code}")
            return

        soup = BeautifulSoup(response.text, "html.parser")
        
        # Блоки объявлений на Авито
        items = soup.find_all("div", {"data-marker": "item"})
        
        if not items:
            print("[AVITO] Объявления не найдены или выдача скрыта проверкой.")
            return

        for item in items:
            item_id = item.get("data-item-id")
            if not item_id or item_id in seen_ids:
                continue

            # Название и ссылка
            title_tag = item.find("a", {"data-marker": "item-title"})
            if not title_tag:
                continue

            title = title_tag.get_text(strip=True)
            link = "https://www.avito.ru" + title_tag.get("href", "")

            # Цена
            price_tag = item.find("meta", {"itemprop": "price"})
            if price_tag and price_tag.get("content"):
                price = int(price_tag["content"])
            else:
                price_elem = item.find("strong")
                price = extract_price(price_elem.get_text()) if price_elem else 0

            # Фильтр по слову и цене
            if "gatta" in title.lower() and 0 < price <= MAX_PRICE:
                message = (
                    f"🔥 <b>Найдена кепка Gatta дешевле {MAX_PRICE} ₽!</b>\n\n"
                    f"📌 <b>Товар:</b> {title}\n"
                    f"💰 <b>Цена:</b> {price} ₽\n"
                    f"🔗 <a href='{link}'>Открыть объявление</a>"
                )
                print(f"[FOUND] {title} — {price} ₽")
                send_telegram_message(message)

            # Добавляем в просмотренные, чтобы не проверять повторно
            seen_ids.add(item_id)

        save_seen_ids(seen_ids)

    except Exception as e:
        print(f"[LOOP ERROR] Произошла ошибка при парсинге: {e}")


def main():
    print("Бот запущен. Ожидание новых объявлений...")
    seen_ids = load_seen_ids()
    
    send_telegram_message("🚀 <i>Бот мониторинга кепок Gatta запущен и готов ловить объявления!</i>")

    while True:
        check_avito(seen_ids)
        time.sleep(CHECK_INTERVAL_SECONDS)


if __name__ == "__main__":
    main()