🔍 Overview
send_telegram_message_task is a Celery task designed to send messages to Telegram users via a Bot built with the pyTelegramBotAPI (telebot) library. It handles rate-limiting (HTTP 429) and other exceptions by retrying automatically up to a configurable limit.
📝 Task Definition
@celery.task(bind=True, max_retries=10, default_retry_delay=15)
def send_telegram_message_task(self: Task, message: str, telegram_user_id: int):
try:
bot.send_message(
chat_id=telegram_user_id,
text=message,
disable_web_page_preview=True,
timeout=30,
)
except ApiTelegramException as e:
if e.error_code == 429:
retry_after = int(e.result_json.get('parameters', {}).get('retry_after', self.default_retry_delay))
logger.warning(f"Rate limit exceeded for user {telegram_user_id}. Retrying in {retry_after} seconds.")
raise self.retry(exc=e, countdown=retry_after)
else:
logger.warning(
f"Failed to send message to user {telegram_user_id}: {e}."
f"Retrying in {self.default_retry_delay} seconds."
)
raise self.retry(exc=e)
except Exception as e:
logger.error(f"Unexpected error: {e}. Retrying in {self.default_retry_delay} seconds.")
raise self.retry(exc=e)
else:
logger.info(f"Message successfully sent to user {telegram_user_id}.")📑 Attributes
| Name | Type | Description |
|---|---|---|
message | str | The text to send to the user. |
telegram_user_id | int | Telegram chat ID or user ID to receive the message. |
⚙️ Task Parameters
| Name | Type | Description |
|---|---|---|
max_retries | int | Maximum retry attempts (default: 10). |
default_retry_delay | int | Delay between retries in seconds (default: 15). |
🔄 Error Handling & Retries
-
HTTP 429 Rate Limit
- Reads
retry_afterfrom Telegram API response parameters. - Retries after
retry_afterseconds.
- Reads
-
Other
ApiTelegramException- Logs a warning.
- Retries after
default_retry_delay.
-
Other Exceptions
- Logs an error.
- Retries after
default_retry_delay.
Celery will stop retrying after max_retries attempts and propagate the last exception.
🚀 Usage Example
from telegram.tasks import send_telegram_message_task
send_telegram_message_task.delay(
message="Hello user! This is a test message.",
telegram_user_id=123456789,
)