Бот отвечает дважды, почему?

Всем привет! Хочу написать бота, который будет что-то раздавать раз в сутки. Моя проблема в том, что бот дважды принимает команду /start

Но мне нужно, чтобы он принимал её только раз в сутки.

Сам код:

import telebot
import time


bot = telebot.TeleBot("")


@bot.message_handler(commands=['start'])
def hello(message):
    while True:
        bot.send_message(message.chat.id, "Привет!")
        time.sleep(60)


bot.polling()

while True

Написал для теста, планируется что там будет if

Заранее спасибо!


Ответы (3 шт):

Автор решения: Mamkin Hacker

Во-первых, тебе нужен токен, + надо добавить строку с кое-чем (времени объяснять нет) перед bot.polling(). Вот классный видеоурок который все объясняет.

https://www.youtube.com/watch?v=M8fhrtvedHA

Попробуй убрать while True. Так как сообщение аргумент постоянно выполняться. Сообщение отправляется дважды.

→ Ссылка
Автор решения: BlueScreen
@bot.message_handler(commands=['video'])
def video_command(message):
    print(message)
    global lections
    video_today = day_lections(1) #Массив, сегодняшнии лекции
    if video_today == []:
        out_text = "К счастью сегодня лекций нет"
    else:
        out_text = "*Лекции в ближайшие 24 часа*"
        for i in video_today:
            out_text +="\n" + i["name"] + " " + str(i["datetime"]) + " в " + "["+ i["platform"] +"](" + i["link"] + ")"
    bot.send_message(
        message.chat.id,
        out_text,
        parse_mode="Markdown"
  )

Это пример моего кода для бота с if. И он отправляет 1 сообщение. Убедится в этом вы можете, например написав вместо while True: вот это if True:. Повторная отправка сообщения связана с тем, что функция hello(msg) вызывается в том случае если боту пришло 'start', и он на это не ответил. Соответственно на 1-ом проходе цикла бот отправляет ваше сообщение, идёт на 2-ой, но так как. сервер телеграмма еще не успел обработать 1-ое сообщение он отправляет еще одно.

→ Ссылка
Автор решения: Alex Zab

Совсем не нужно вечный цикл)

import telebot
import time


bot = telebot.TeleBot("token")


@bot.message_handler(commands=['start'])
def hello(message):
    bot.send_message(message.chat.id, "Привет!")
    # time.sleep(60) Это 60 секунд, что бы получить сутки (24 часа) нужно домножить на 60, выйдет 3600, это час и на 24 - 86400, поэтому пишем - 
    time.sleep(86400)


bot.polling(none_stop=True)

Но лучше всего не делать time.sleep() в основном цикле потому что это будет глушить бота и он не будет отвечать. Что бы не допустить такого используем threading -

import telebot
import time
import threading


bot = telebot.TeleBot("token")


@bot.message_handler(commands=['start'])
def hello(message):
    bot.send_message(message.chat.id, "Привет!")
    time.sleep(86400)

threading.Thread(target = hello, args = (1,), daemon = True).start()

bot.polling(none_stop=True)

Таким образом у нас и 24 часа будут считаться и бот будет работать дальше, отвечать на другие команды

→ Ссылка