Как объединить schedule и bot.polling()?

Здравствуйте!
У меня есть бот, который проверяет работоспособность некого сайта через фиксированный отрезок времени (например каждые пол часа). Для этой задачи в интернете нашел пакет schedule, сама работа с Telegram api ведется через pyTelegramBotAPI. Я столкнулся со следующей проблемой: если работает планировщик, то не работает bot.polling и наоборот, подскажите пожалуйста как их синхронизировать.
п.с. вот так бот получает ответ api, но schedule не работает
def main_loop():
    bot.polling(True)
    while 1:
        schedule.run_pending()
        time.sleep(1)


if __name__ == '__main__':
    main_loop()


вот весь скрипт:
import telebot
from config import ACCESS_TOKEN
import config
from telebot.types import Message
import requests
import schedule
import time
import sys

bot = telebot.TeleBot(ACCESS_TOKEN)
chat_id = '434574930'


# @bot.message_handler(func=lambda message: True)
def send_message():
    req_home = requests.get(config.HOME_URL, auth=(config.LOGIN, config.PASS))
    req_ocr = requests.get(config.OCR_URL, auth=(config.LOGIN, config.PASS))
    response = ''

    #   если ответ сервера не 200
    #   пока отлаживаю, ожидаю 200 
    if req_home.status_code == 200:
        response = config.HOME_URL + " status code: " + str(req_home.status_code) + '\n'

    #   если ответ сервера не 200
    if req_ocr.status_code == 200:
        response = response + config.OCR_URL + " status code: " + str(req_ocr.status_code) + '\n'

    #   если сервер вернул ошибку
    if response != '':
        bot.send_message(chat_id, response)


#   Планировщик для бота
schedule.every(config.SCHEDULE_DELAY).seconds.do(send_message)


@bot.message_handler(commands=['start'])
def set_chat_id(message: Message):
    global chat_id
    chat_id = message.chat.id
    bot.reply_to(message, "Start checking ...")


def main_loop():
    bot.polling(True)
    while 1:
        schedule.run_pending()
        time.sleep(1)


if __name__ == '__main__':
    main_loop()
  • Вопрос задан
  • 6979 просмотров
Решения вопроса 1
devildayne
@devildayne
Threading поможет, как мне кажется
https://docs.python.org/3/library/threading.html
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Danya_Violet
@Danya_Violet
CTO/CIO
def send_message():
<...>

schedule.every(5).minutes.do(send_message)

while True:
    schedule.run_pending()
    time.sleep(1)
Ответ написан
@Error4uk
Шедулер выноси в отдельный скрипт
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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