40 lines
1.8 KiB
Python
40 lines
1.8 KiB
Python
# 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
|