This commit is contained in:
2026-08-24 15:54:08 +03:30
commit 236002a87c
133 changed files with 5946 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
# 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