# core/bot_downloader.py Handles "click to download" inline button flows. Some Telegram channels post files via a bot behind a button rather than directly attaching them. ## Public API ```python from core.bot_downloader import ( handle_bot_download_message, has_download_button, extract_password, ) ``` ### `handle_bot_download_message(client, bot, msg, source_name, patterns, password=None)` **async.** Full pipeline: 1. Detect download button 2. Click it (URL button → `/start payload` to the bot; callback button → `.click()`) 3. Wait up to `BOT_REPLY_TIMEOUT` seconds for the bot to send a file back 4. Hand each file response to `core.scraper.handle_message()` ### `has_download_button(msg) -> bool` Returns `True` if the message contains a recognisable download button. Checked in live handler and backfill before calling this module. ### `extract_password(msg) -> str | None` Scans message text for `Pass: ...` / `Password: ...` / `Contraseña: ...` patterns. Returns the extracted password string, or `None`. --- ## Button detection Recognised button text keywords (case-insensitive): ``` DOWNLOAD, DESCARGAR, GET FILE, GET PACK, ⬇, 📥 ``` --- ## URL button flow (most common) ``` Button URL: https://t.me/SomeBot?start=ABC123 → parse bot username + payload → client.send_message(bot_entity, "/start ABC123") → poll get_messages(bot_entity, limit=3) every 1s for BOT_REPLY_TIMEOUT seconds → return file messages found ``` ## Callback button flow (fallback) ``` btn.click() → sleep 2s → get_messages(sender, limit=5) → return file messages found ``` --- ## Constants | Name | Value | Description | |------|-------|-------------| | `BOT_REPLY_TIMEOUT` | `10` | Seconds to wait for bot file reply | | `DOWNLOAD_BUTTON_KEYWORDS` | see above | Button text triggers | | `PASSWORD_PATTERN` | regex | Matches `Pass[word]: value` in message text |