Загрузка данных
import time
import json
import os
import re
import requests
from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright
# === НАСТРОЙКИ TELEGRAM ===
TELEGRAM_BOT_TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER"
TELEGRAM_CHAT_ID = "ВАШ_CHAT_ID"
# Если в вашей сети api.telegram.org блокируется, укажите прокси (например, "http://127.0.0.1:1080")
# Если VPN уже включен на всей системе, оставьте None
TG_PROXY = None
# === НАСТРОЙКИ АВИТО ===
MAX_PRICE = 2000
# Ссылка на выдачу (фильтр по дате и нужным параметрам)
AVITO_URL = "https://www.avito.ru/rossiya/odezhda_obuv_aksessuary/aksessuary/golovnye_ubory-ASgBAgICAUT8AtgM?q=gatta&s=104"
CHECK_INTERVAL = 60 # Секунд между обновлениями страницы
SEEN_FILE = "seen_items.json"
def send_telegram(text: str):
"""Отправка сообщения в Telegram со встроенной защитой от тайм-аута."""
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
}
proxies = {"http": TG_PROXY, "https": TG_PROXY} if TG_PROXY else None
try:
requests.post(url, json=payload, timeout=12, proxies=proxies)
except Exception as e:
print(f"[TG ERROR] Не удалось отправить сообщение: {e}")
def load_seen():
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(seen_ids):
with open(SEEN_FILE, "w", encoding="utf-8") as f:
json.dump(list(seen_ids), f, ensure_ascii=False, indent=2)
def extract_price(text: str) -> int:
clean = re.sub(r"[^\d]", "", text)
return int(clean) if clean else 0
def parse_page(html_content: str, seen_ids: set):
soup = BeautifulSoup(html_content, "html.parser")
items = soup.find_all("div", {"data-marker": "item"})
if not items:
return
for item in items:
item_id = item.get("data-item-id")
if not item_id or item_id in seen_ids:
continue
title_el = item.find("a", {"data-marker": "item-title"})
if not title_el:
continue
title = title_el.get_text(strip=True)
link = "https://www.avito.ru" + title_el.get("href", "")
price_meta = item.find("meta", {"itemprop": "price"})
if price_meta and price_meta.get("content"):
price = int(price_meta["content"])
else:
price_box = item.find("strong")
price = extract_price(price_box.get_text()) if price_box else 0
# Проверка ключевого слова и цены
if "gatta" in title.lower() and 0 < price <= MAX_PRICE:
msg = (
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"[УСПЕХ] Найдено: {title} — {price} ₽")
send_telegram(msg)
seen_ids.add(item_id)
save_seen(seen_ids)
def run_bot():
seen_ids = load_seen()
send_telegram("🚀 <i>Браузерный монитор кепок Gatta запущен!</i>")
with sync_playwright() as p:
# headless=False отключает флаг веб-драйвера, снижая риск капчи
browser = p.chromium.launch(
headless=False,
args=["--disable-blink-features=AutomationControlled"]
)
context = browser.new_context(
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",
viewport={"width": 1366, "height": 768}
)
page = context.new_page()
print("Открываем Авито...")
page.goto(AVITO_URL, wait_until="domcontentloaded", timeout=45000)
page.wait_for_timeout(4000)
while True:
try:
# Обновляем страницу для получения свежих объявлений
page.reload(wait_until="domcontentloaded", timeout=45000)
# Даем 3-4 секунды на выполнение проверок антифрода и рендеринг цен
page.wait_for_timeout(3500)
# Забираем актуальный HTML
content = page.content()
parse_page(content, seen_ids)
print(f"[OK] Проверка выполнена. Ждем {CHECK_INTERVAL} сек...")
except Exception as err:
print(f"[ОШИБКА ЦИКЛА] {err}")
time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
run_bot()