Функция edit_message_media не работает корректно

Рейтинг: -1Ответов: 1Опубликовано: 07.07.2023

Я пытался создать слайд-шоу, я создал простого бота, когда я пишу /start бот выдает сообщение с картинкой и кнопкой "Вперед", когда я нажимаю на кнопку ничего не меняется, а после когда я снова пишу /start то всё срабатывает. С функцией edit_message_text тоже так же. У других ютуберов всё получилось, но они делали на старой версии PyTelegramBotAPI. Я ставил старую версию, но там так же. Мне кажется это связано с тем что поменялось работа передачей id сообщении. Либо там передачу API, либо chat id поменяли. Я не знаю потому что не разработчик телеграмма.

В интернете не смог найти ответа, потому что никто не писал подобный код, если даже кто-то писал наверное он приватный. Помогите пожалуйста добрые люди!

Работа бота:

  1. Пишу "/start" и выводится смс с картинкой и клавиатурой

введите сюда описание изображения

  1. Нажимаю "Вперед", ничего не происходит

введите сюда описание изображения

  1. Пишу снова "/start", и предыдущая картинка меняется и одновременно создается новое

введите сюда описание изображения

Вот код:

import telebot
from telebot import types

bot = telebot.TeleBot("token")

@bot.message_handler(commands=['start'])
def handle_start(message):
    photo = open("pictures/photo1.jpg", "rb")
    markup = types.InlineKeyboardMarkup(row_width=1)
    next_button = types.InlineKeyboardButton('Вперед', callback_data='next')
    markup.add(next_button)
    print(f"{types.InputMediaPhoto(open('pictures/photo3.jpg', 'rb'))}")
    bot.send_photo(message.chat.id, photo, f'Страница: 1', reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def handle_button_click(call):
    markup = telebot.types.InlineKeyboardMarkup()
    markup.add(telebot.types.InlineKeyboardButton(text='Назад', callback_data='previous'))
    if call.data == 'next':
        markup.add(telebot.types.InlineKeyboardButton(text='Вперед', callback_data='next'))
        new_photo = types.InputMediaPhoto(open('pictures/photo3.jpg', 'rb'))
        bot.edit_message_media(media=new_photo,
                               chat_id=call.message.chat.id,
                               message_id=call.message.message_id,
                               reply_markup=markup)

bot.infinity_polling()

Здесь ошибка:

bot.edit_message_media(media=photo,
                           chat_id=call.message.chat.id,
                           message_id=call.message.message_id,
                           reply_markup=markup)

Ошибка в строке:

  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\main.py", line 282, in handle_button_click
    bot.edit_message_media(media=photo,

Сама ошибка:

2023-07-07 18:38:55,675 (__init__.py:1083 MainThread) ERROR - TeleBot: "Threaded polling exception: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message"
2023-07-07 18:38:55,676 (__init__.py:1085 MainThread) ERROR - TeleBot: "Exception traceback:
Traceback (most recent call last):
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\__init__.py", line 1074, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\util.py", line 147, in raise_exceptions
    raise self.exception_info
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\util.py", line 90, in run
    task(*args, **kwargs)
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\__init__.py", line 6770, in _run_middlewares_and_handler
    result = handler['function'](message)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\main.py", line 282, in handle_button_click
    bot.edit_message_media(media=photo,
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\__init__.py", line 3862, in edit_message_media
    result = apihelper.edit_message_media(self.token, media, chat_id, message_id, inline_message_id, reply_markup)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\apihelper.py", line 1354, in edit_message_media
    return _make_request(token, method_url, params=payload, files=file, method='post' if file else 'get')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\apihelper.py", line 162, in _make_request
    json_result = _check_result(method_name, result)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Nuraly\Desktop\Demon Slayer Bot\venv\Lib\site-packages\telebot\apihelper.py", line 189, in _check_result
    raise ApiTelegramException(method_name, result, result_json)
telebot.apihelper.ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
"

Ответы

▲ 0

Ошибка возникает из-за того, что вы пытаетесь изменить содержимое и разметку сообщения на точно такие же значения, какие они уже есть.

В вашем случае, ошибка возникает из-за того, что при вызове bot.edit_message_media() вы передаете ту же самую фотографию и разметку, что и в исходном сообщении. Telegram API требует, чтобы новое содержимое и разметка отличались от текущих значений.

Чтобы исправить ошибку, вам нужно изменить содержимое или разметку сообщения, чтобы они отличались от исходного. Например, вы можете изменить текст сообщения или добавить/удалить кнопки в разметке.