Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пожалуйста исправить ошибки в коде для библиотеки telebot Python

петр константинов Знаток (404), на голосовании 1 неделю назад
Ошибка Error code: 400. Description: Bad Request....
 @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)

if 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)
bot.edit_message_text('Нажмите кнопку назад:', message.chat.id, message.message_id,reply_markup=x1)

bot.polling()
Дополнен 1 месяц назад
Функционал должен остаться прежним!!! прошлые меню должны чиститься а на мести их появяться новые!!!
Дополнен 1 месяц назад
пытаюсь сделать кнопку вход (inline) по нажатию на которую появится кнопка назад(inline) и ввод сообщения (если что до ввода сообщения можно вернуться к началу т.е к кнопке входа при этом удаляется кнопка назад) после ввода сообщения(котор нужно отследить в условии) нужно нажать эту кнопку назад и вернуться в начальную кнопку вход при этом удалится кнопка назад и введенное сообщение
Голосование за лучший ответ
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 месяц назад
Иж вы простой какой,мне нужна функциональность та которая была, нужно удаление кнопки и текста при выполнении назад ....
петр константинов Знаток (404) петр константинов, Иж вы простой какой,мне нужна функциональность та которая была, нужно удаление кнопки назад и текста при выполнении назад .. чтобы старое меню вернуось при этом удалилось прошлое
петр константиновЗнаток (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 месяц назад
Разобрался как это делать, вы не совсем правильно исправили код, у вас кнопка назад появляется после правильного ввода текста с новым текстом,а надо ее не трогать а менять текст кнопки! при этом чтоб была возможность вернуться назад...
Похожие вопросы