frdks
@frdks
коротко о себе

Делаю бота в на python и пытаюсь сделать чтоб сообщение отправлялось в определенное время, но появляется ошибка, что делать?

Полный код:
import time
import schedule
import telebot

bot = telebot.TeleBot('ключ')


@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, 'тут будет чота гавгать')


schedule.every().day.at("17:47").do(start_command)

while True:
    schedule.run_pending()
    time.sleep(1)

bot.polling()


Ошибка:6137aee24df2f990520171.png

ps
Я понимаю ошибку, не понимаю как решить. Я не понимаю как мне вклеить аргумент, а что самое главное не знаю куда)
  • Вопрос задан
  • 2147 просмотров
Пригласить эксперта
Ответы на вопрос 5
@wasp1ck
Попробуйте вместо "def start_message(message)" написать "def start_message()".
Вы не передаете в свою функцию аргумент message
Ответ написан
Комментировать
@fanepka
Работаю на Python
Вы не то вставили в функцию schedule.every().day.at("17:47").do(). Нужно было вставить bot.polling()

import time
import schedule
import telebot

bot = telebot.TeleBot('ключ')


@bot.message_handler(commands=['start'])
def start_command(message):
    bot.send_message(message.chat.id, 'тут будет чота гавгать')


schedule.every().day.at("17:47").do(bot.polling()) #Здесь запускаем бота в нужный момент

while True:
    schedule.run_pending()
    time.sleep(1)


Если я вас правильно понял, то бот должен запустить в 17:47. Если это так, то код, который я написал выше, подойдет вам
Ответ написан
Комментировать
@MEDIOFF
Python Developer
Иногда полезно смотреть документацию
Как я понимаю вам надо просто кому то отправить сообщение, так что я на вашем месте вынес бы это в отдельную функцию и ее запуска, а handler не трогайте для этих задач
def my_daily_task(tg_id):
    bot.send_message(tg_id, 'тут будет чота гавгать')
schedule.every().day.at("17:47").do(start_command, tg_id=<Id пользователя кому отправляем>)
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Следует понимать, что bot.polling() запустит рабочий цикл бота, и не вернёт управление, пока бот не отключится.
Это означает, что подружить бота с while True: schedule.run_pending() очень проблематично - они оба хотят запустить вечный цикл, в котором они будут заниматься своими делами, но такой цикл может быть только один... в рамках одного потока.
Я бы сделал так:
1. В основном потоке подготовливаем второй поток и задаём нужное время срабатывания через schedule.every(). Потом запускаем бота через bot.polling().
2. Второй поток выполняет цикл schedule.run_pending()+sleep(). Используй логическую переменную, чтобы цикл знал когда завершаться.
3. По выходу из bot.polling() сигналим завершение для второго потока и ждём его.
Ответ написан
Комментировать
@tatarinovkg
Попробуйте так, нашел решение на stackoverflow, сам использую

import telebot
import time
import schedule
import threading

def start_polling():
    bot.infinity_polling(none_stop=True)

polling_thread = threading.Thread(target=start_polling)
polling_thread.start()

def start_command():
    #...

schedule.every().day.at("17:47").do(start_command)

while True:
    schedule.run_pending()
    time.sleep(1)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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