Professional Professional
Мудрец
(15933)
1 месяц назад
Ошибка, которую вы получаете, связана с попыткой редактировать сообщение пользователя, что недопустимо в API Telegram. Вы можете редактировать только сообщения, отправленные ботом. Давайте исправим ваш код.
**Основные изменения:**
1. **В обработчике текстовых сообщений:** Вместо `bot.edit_message_text` используйте `bot.send_message`, чтобы отправить новое сообщение пользователю.
2. **Удалите вызов функции `text(call.message)` из обработчика колбэков:** Эта функция предназначена для обработки сообщений от пользователя, и вызывать ее напрямую не требуется.
Вот исправленный код:
```python
@bot.message_handler(commands=['start'])
def start(message):
mainmenu = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='вход', callback_data='in')
mainmenu.add(switch)
bot.send_message(message.chat.id, "Основное меню:", reply_markup=mainmenu)
@bot.callback_query_handler(func=lambda call: True)
def button(call):
if call.data == "mainmenu":
main = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='вход', callback_data='in')
main.add(switch)
bot.edit_message_text('Основное меню:', call.message.chat.id, call.message.message_id, reply_markup=main)
elif call.data == "in":
x = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='Назад', callback_data='mainmenu')
x.add(switch)
bot.edit_message_text('Введите текст:', call.message.chat.id, call.message.message_id, reply_markup=x)
# Удаляем вызов функции text(call.message)
@bot.message_handler(content_types=['text'])
def text(message):
if message.text == 'ok':
x1 = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='Назад', callback_data='mainmenu')
x1.add(switch)
# Используем send_message вместо edit_message_text
bot.send_message(message.chat.id, 'Нажмите кнопку назад:', reply_markup=x1)
bot.polling()
```
**Объяснение:**
- **Редактирование сообщений:** В `text(message)` вы пытались отредактировать сообщение пользователя, что вызывает ошибку 400. Используя `bot.send_message`, вы отправляете новое сообщение от бота.
- **Удаление лишнего вызова функции:** В функции `button(call)` вызывался `text(call.message)`, что не нужно, так как обработчик текстовых сообщений сам обработает ввод пользователя.
После внесения этих изменений ваш бот должен работать без ошибок.
петр константиновЗнаток (404)
1 месяц назад
Иж вы простой какой,мне нужна функциональность та которая была, нужно удаление кнопки и текста при выполнении назад ....
** Эгоист **
Знаток
(483)
1 месяц назад
Вот исправленный код:
import telebot
from telebot import types
bot = telebot.TeleBot('YOUR_API_KEY')
@bot.message_handler(commands=['start'])
def start(message):
mainmenu = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='вход', callback_data='in')
mainmenu.add(switch)
bot.send_message(message.chat.id, "Основное меню:", reply_markup=mainmenu)
@bot.callback_query_handler(func=lambda call: True)
def button(call):
if call.data == "mainmenu":
# Восстановление главного меню
main = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='вход', callback_data='in')
main.add(switch)
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Основное меню:', reply_markup=main)
elif call.data == "in":
# Переход к вводу текста
x = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='Назад', callback_data='mainmenu')
x.add(switch)
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Введите текст:', reply_markup=x)
@bot.message_handler(content_types=['text'])
def text_handler(message):
if message.text == 'ok':
# Обработка ввода текста
x1 = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='Назад', callback_data='mainmenu')
x1.add(switch)
bot.send_message(message.chat.id, 'Нажмите кнопку назад:', reply_markup=x1)
else:
# Если вводится любой другой текст, то возвращаемся к меню ввода текста
if message.reply_to_message and message.reply_to_message.text == 'Введите текст:':
x = types.InlineKeyboardMarkup()
switch = types.InlineKeyboardButton(text='Назад', callback_data='mainmenu')
x.add(switch)
bot.send_message(message.chat.id, 'Введите текст:', reply_markup=x)
bot.polling()
Основные изменения:
Использование chat_id и message_id в edit_message_text: Убедитесь, что вы передаете правильные параметры.
Удаление старых клавиатур: Когда вы отправляете новое сообщение, используется send_message, чтобы сохранить контекст.
Обработка текстовых сообщений: Я добавил проверку, чтобы при вводе текста возвращаться к вводу текста, если текст не "ok".
Проверка условий: Убедитесь, что бот реагирует на сообщения, когда они отвечают на предыдущие сообщения.
Теперь функционал вашего бота должен работать корректно: кнопка "вход" приводит к вводу текста, а кнопка "Назад" возвращает к основному меню, удаляя предыдущие элементы. Если возникнут дополнительные вопросы, дайте знать!
петр константиновЗнаток (404)
1 месяц назад
Разобрался как это делать, вы не совсем правильно исправили код, у вас кнопка назад появляется после правильного ввода текста с новым текстом,а надо ее не трогать а менять текст кнопки! при этом чтоб была возможность вернуться назад...