Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Ошибка тг бота в питоне

import telebot
import datetime
import threading

# Создаем объект бота и передаем ему токен нашего бота
bot = telebot.TeleBot('мой токен')

# Обработчик команды /start
@bot.message_handler(commands=['start'])
def start_message(message):
# Отправляем сообщение пользователю
bot.send_message(message.chat.id, 'Привет! Я бот-напоминалка. Чтобы создать напоминание, введите /reminder.')

# Обработчик команды /reminder
@bot.message_handler(commands=['reminder'])
def reminder_message(message):
# Запрашиваем у пользователя название напоминания и дату и время напоминания
bot.send_message(message.chat.id, 'Введите название напоминания:')
bot.register_next_step_handler(message, set_reminder_name)

# Функция, которую вызывает обработчик команды /reminder для установки названия напоминания
def set_reminder_name(message):
user_data = {}
user_data[message.chat.id] = {'reminder_name': message.text}
bot.send_message(message.chat.id, 'Введите дату и время, когда вы хотите получить напоминание в формате ГГГГ-ММ-ДД чч:мм:сс.')
bot.register_next_step_handler(message, reminder_set, user_data)

# Функция, которую вызывает обработчик команды /reminder для установки напоминания
def reminder_set(message, user_data):
try:
# Преобразуем введенную пользователем дату и время в формат datetime
reminder_time = datetime.datetime.strptime(message.text, '%Y-%m-%d %H:%M:%S')
now = datetime.datetime.now ()
delta = reminder_time - now
# Если введенная пользователем дата и время уже прошли, выводим сообщение об ошибке
if delta.total _seconds() <= 0:
bot.send_message(message.chat.id, 'Вы ввели прошедшую дату, попробуйте еще раз.')
# Если пользователь ввел корректную дату и время, устанавливаем напоминание и запускаем таймер
else:
reminder_name = user_data[message.chat.id]['reminder_name']
bot.send_message(message.chat.id, 'Напоминание "{}" установлено на {}.'.format(reminder_name, reminder_time))
reminder_timer = threading.Timer( delta.total _seconds(), send_reminder, [message.chat.id, reminder_name])
reminder_timer.start()
# Если пользователь ввел некорректную дату и время, выводим сообщение об ошибке
except ValueError:
bot.send_message(message.chat.id, 'Вы ввели неверный формат даты и времени, попробуйте еще раз.')

# Функция, которая отправляет напоминание пользователю
def send_reminder(chat_id, reminder_name):
bot.send_message(chat_id, 'Время получить ваше напоминание "{}"!'.format(reminder_name))

# Обработчик любого сообщения от пользователя
@bot.message_handler(func=lambda message: True)
def handle_all_message(message):
bot.send_message(message.chat.id, 'Я не понимаю, что вы говорите. Чтобы создать напоминание, введите /reminder.')

# Запускаем бота
if __name__ == '__main__':
bot.polling(none_stop=True)


Traceback (most recent call last):
File "C:/Users/Никитос/AppData/Local/Programs/Python/Python313/tgbot.py", line 59, in <module>
bot.polling(none_stop=True)

По дате
По рейтингу
Аватар пользователя
Мастер
5мес

import telebot
import datetime
import threading

# Создаем объект бота и передаем ему токен нашего бота
bot = telebot.TeleBot('ваш токен')

# Глобальная переменная для хранения данных пользователей
user_data = {}

# Обработчик команды /start
@bot.message_handler(commands=['start'])
def start_message(message):
# Отправляем сообщение пользователю
bot.send_message(message.chat.id, 'Привет! Я бот-напоминалка. Чтобы создать напоминание, введите /reminder.')

# Обработчик команды /reminder
@bot.message_handler(commands=['reminder'])
def reminder_message(message):
# Запрашиваем у пользователя название напоминания и дату и время напоминания
bot.send_message(message.chat.id, 'Введите название напоминания:')
bot.register_next_step_handler(message, set_reminder_name)

# Функция, которую вызывает обработчик команды /reminder для установки названия напоминания
def set_reminder_name(message):
user_data[message.chat.id] = {'reminder_name': message.text}
bot.send_message(message.chat.id, 'Введите дату и время, когда вы хотите получить напоминание в формате ГГГГ-ММ-ДД чч:мм:сс.')
bot.register_next_step_handler(message, reminder_set)

# Функция, которую вызывает обработчик команды /reminder для установки напоминания
def reminder_set(message):
try:
# Преобразуем введенную пользователем дату и время в формат datetime
reminder_time = datetime.datetime.strptime(message.text, '%Y-%m-%d %H:%M:%S')
now = datetime.datetime.now ()
delta = reminder_time - now

# Если введенная пользователем дата и время уже прошли, выводим сообщение об ошибке
if delta.total _seconds() <= 0:
bot.send_message(message.chat.id, 'Вы ввели прошедшую дату, попробуйте еще раз.')
else:
reminder_name = user_data[message.chat.id]['reminder_name']
bot.send_message(message.chat.id, 'Напоминание "{}" установлено на {}.'.format(reminder_name, reminder_time))
reminder_timer = threading.Timer( delta.total _seconds(), send_reminder, [message.chat.id, reminder_name])
reminder_timer.start()
except ValueError:
bot.send_message(message.chat.id, 'Вы ввели неверный формат даты и времени, попробуйте еще раз.')

# Функция, которая отправляет напоминание пользователю
def send_reminder(chat_id, reminder_name):
bot.send_message(chat_id, 'Время получить ваше напоминание "{}"!'.format(reminder_name))

# Обработчик любого сообщения от пользователя
@bot.message_handler(func=lambda message: True)
def handle_all_message(message):
bot.send_message(message.chat.id, 'Я не понимаю, что вы говорите. Чтобы создать напоминание, введите /reminder.')

# Запускаем бота
if __name__ == '__main__':
bot.polling(none_stop=True)

Аватар пользователя
Мудрец
5мес

Ошибки в вашем коде связаны с синтаксисом и отступами. Вот исправленная версия:

python
import telebot
import datetime
import threading

bot = telebot.TeleBot('мой токен')

@bot.message_handler(commands=['start'])
def start_message(message):
bot.send_message(message.chat.id, 'Привет! Я бот-напоминалка. Чтобы создать напоминание, введите /reminder.')

@bot.message_handler(commands=['reminder'])
def reminder_message(message):
bot.send_message(message.chat.id, 'Введите название напоминания:')
bot.register_next_step_handler(message, set_reminder_name)

def set_reminder_name(message):
user_data = {}
user_data[message.chat.id] = {'reminder_name': message.text}
bot.send_message(message.chat.id, 'Введите дату и время в формате ГГГГ-ММ-ДД чч:мм:сс.')
bot.register_next_step_handler(message, reminder_set, user_data)

def reminder_set(message, user_data):
try:
reminder_time = datetime.datetime.strptime(message.text, '%Y-%m-%d %H:%M:%S')
now = datetime.datetime.now ()
delta = reminder_time - now

if delta.total _seconds() <= 0: # Исправлено total_seconds()
bot.send_message(message.chat.id, 'Дата в прошлом, попробуйте снова.')
else:
reminder_name = user_data[message.chat.id]['reminder_name']
bot.send_message(message.chat.id, f'Напоминание "{reminder_name}" установлено на {reminder_time}.')

# Запуск таймера
reminder_timer = threading.Timer(
delta.total _seconds(), # Исправлено total_seconds()
send_reminder,
[message.chat.id, reminder_name]
)
reminder_timer.start()

except ValueError:
bot.send_message(message.chat.id, 'Неверный формат даты, попробуйте снова.')

# Функция должна быть на верхнем уровне (без лишних отступов)
def send_reminder(chat_id, reminder_name):
bot.send_message(chat_id, f'Время получить напоминание "{reminder_name}"!')

@bot.message_handler(func=lambda message: True)
def handle_all_message(message):
bot.send_message(message.chat.id, 'Не понимаю. Для создания напоминания введите /reminder')

if __name__ == '__main__':
bot.polling(none_stop=True)

Основные исправления:
1. Убраны пробелы в `total_seconds()` (было `total _seconds()`)
2. Исправлены отступы у функции `send_reminder` (должна быть на том же уровне, что и другие функции)
3. Добавлен правильный формат строки через f-strings
4. Исправлены пробелы вокруг операторов

Теперь бот должен работать без синтаксических ошибок. Однако учтите, что для работы с threading.Timer в долгоживущих приложениях могут потребоваться дополнительные доработки, а для хранения данных пользователя между шагами лучше использовать глобальный словарь или базу данных.

Аватар пользователя
Мыслитель
5мес

думаю тебе с этим лучше к нейросети, как раз deepseek вышел, он это легко исправит