@Delawere

Telegram Bot как отправлять ежедневные сообщения?

Я пытаюсь настроить телеграм бот на ежедневные уведомления, в определенное время, в моем случае 9 утра. Но по какой то причине бот срабатывает только в первый день, на второй день сообщение либо не отправляется, либо приходит в рандомное время.
Ниже полный код, кроме конфига
import requests
import pytz
from telegram import Bot, Update
from datetime import time, tzinfo, timezone, datetime
from telegram.ext import Updater, CommandHandler, Filters
from config import TG_TOKEN, PROXY, WEATHER_APP_ID, CITY

class Weather:
  @staticmethod
  def get_weather():
      try:
        res = requests.get(
          "http://api.openweathermap.org/data/2.5/find",
          params={'q': CITY, 'units': 'metric', 'lang': 'ru', 'APPID': WEATHER_APP_ID}
        )
        data = res.json()

        item = data['list'][0]
        main = item['main']
        weather = item['weather'][0]
        weather_desc = weather['description']
        temp = main['temp']
        feels_like = main['feels_like']

        return {
          'desc': weather_desc,
          'temp': temp,
          'feels_like': feels_like
        }

      except Exception as e:
        print("Exception (find):", e)
        pass

def message_handler(bot: Bot, job):
    weather = Weather().get_weather()
    desc = weather['desc']
    temp = round(weather['temp'])
    feels_like = round(weather['feels_like'])
    reply_text = f'{temp}°C {desc} {feels_like}°C'

    bot.send_message(
      chat_id = job.context['chat_id'],
      text = reply_text,
      parse_mode= "Markdown"
    )

def callback_timer(bot, update, job_queue):
    d = datetime.now()
    timezone = pytz.timezone("Europe/Moscow")
    d_aware = timezone.localize(d)
    context = {
      'chat_id': update.message.chat_id,
    }
    notify_time = time(9, 0, 0, 0, tzinfo=d_aware.tzinfo)

    bot.send_message(chat_id=update.message.chat_id, text='Starting!')
    job_queue.run_daily(message_handler, notify_time, context=context)

def stop_timer(bot, update, job_queue):
    bot.send_message(chat_id=update.message.chat_id, text='Stoped!')
    job_queue.stop()

def main():
    bot = Bot(
      token=TG_TOKEN,
      base_url=PROXY
    )
    updater = Updater(
      bot=bot,
    )
    updater.dispatcher.add_handler(CommandHandler('start', callback_timer, pass_job_queue=True))
    updater.dispatcher.add_handler(CommandHandler('stop', stop_timer, pass_job_queue=True))

    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

Бота поднимал тут https://www.pythonanywhere.com/
  • Вопрос задан
  • 1078 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mrisid
Попробуйте библиотеку
https://pypi.org/project/schedule/

Т.к. у вас будет 2 цикла (цикл считающий время и цикл бота)
То цикл который считает время нужно реализовать через поток
(про потоки можно почитать в интернете).
Надеюсь помог вам
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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