# apps/messaging/providers/bot_api.py """ پایه‌ی مشترک ارسال از طریق Bot API — تلگرام، بله و ایتا هرکدام یک Bot API تلگرام‌سازگار دارند (endpoint یکسان: POST {base}/bot{token}/sendMessage با بدنه‌ی {chat_id, text}). این یعنی این سه پلتفرم فقط base_url و token متفاوت دارند؛ منطق ارسال یکی است. نکته‌ی مهم — opt-in: بات فقط می‌تواند به chat_id هایی پیام بدهد که قبلا خودشان چت با بات را با /start شروع کرده‌اند (دقیقا مثل قانون خودِ تلگرام). یعنی این تابع فقط برای مخاطبینی کار می‌کند که chat_id شان قبلا (از طریق webhook خود بات، خارج از این فایل) در Contact.channel_ids ثبت شده باشد؛ برای بقیه، صدازننده باید needs_manual برگرداند — نه اینکه اینجا حدس بزند. """ import logging import requests logger = logging.getLogger(__name__) REQUEST_TIMEOUT_SECONDS = 10 def send_bot_message(base_url: str, token: str, chat_id: str, text: str) -> bool: if not base_url or not token: logger.error("توکن یا آدرس Bot API تنظیم نشده است") return False url = f"{base_url.rstrip('/')}/bot{token}/sendMessage" try: response = requests.post( url, json={"chat_id": chat_id, "text": text}, timeout=REQUEST_TIMEOUT_SECONDS ) response.raise_for_status() body = response.json() return bool(body.get("ok", True)) except (requests.RequestException, ValueError) as exc: logger.error(f"❌ خطا در ارسال Bot API به {url}: {exc}") return False