adding
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user