🔍 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

NameTypeDescription
messagestrThe text to send to the user.
telegram_user_idintTelegram chat ID or user ID to receive the message.

⚙️ Task Parameters

NameTypeDescription
max_retriesintMaximum retry attempts (default: 10).
default_retry_delayintDelay between retries in seconds (default: 15).

🔄 Error Handling & Retries

  • HTTP 429 Rate Limit

    • Reads retry_after from Telegram API response parameters.
    • Retries after retry_after seconds.
  • 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,
)