Задать вопрос

Как правильно работать с JobQueue в python telegram bot?

Мне нужно, чтобы бот раз месяц присылал сообщение, но видимо я что-то упускаю, потому что бот ничего не присылает в нужное время.

async def monthly_task(context: ContextTypes.DEFAULT_TYPE):
    total_month_expenses = await expense.get_current_month_expenses() # тут строка
    await context.bot.send_message(chat_id=context.job.chat_id, text=total_month_expenses)


if __name__ == '__main__':
    application = ApplicationBuilder().token(TELEGRAM_TOKEN).build()

    start_handler = CommandHandler('start', start) # просто приветсвие
    application.add_handler(start_handler)

    month_job = application.job_queue
    month_job.run_monthly(monthly_task, when=datetime.time(hour=12, minute=50, second=0), day=4)
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Python-разработчик
    9 месяцев
    Далее
  • Хекслет
    Python-разработчик
    10 месяцев
    Далее
Решения вопроса 1
Lord_of_Rings
@Lord_of_Rings Куратор тега Python
Дунадан - северный странник. Злой, но очень добрый
Скорее всего это из-за того, что он воспринимает ваше время, как время UTC, а не как время в вашем часовом поясе. Например, если ваше время UTC+3 (московское время), и вы пишите datetime.time(hour=12, minute=50, second=0), то на самом деле это будет 15:50 по МСК. Т. е. для решения этой проблемы, я думаю, нужно или вычитать из времени сколько-то часов (в данном случае 3) или конвертировать местное время в UTC:
from datetime import datetime 
import pytz

local = pytz.timezone("Europe/Moscow")
naive = datetime.strptime("2024-12-4 12:50:00", "%Y-%m-%d %H:%M:%S")
local_dt = local.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BlizzardJedi
Насколько я понимаю, ошибка в использовании параметра chat_id функции run_monthly:

chat_id (int, optional) –
Chat id of the chat associated with this job. If passed, the corresponding chat_data will be available in the callback.


То бишь, если этот параметр не передать, то в контексте колбэка его просто не будет и Ваш вызов
await context.bot.send_message(chat_id=context.job.chat_id, text=total_month_expenses)
никуда не уйдёт.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы