Как заставить телеграм бота отправить новое сообщение по нажатию инлайн кнопки, предварительно удалив старое
Есть телеграм бот на aiogram. Нужно, чтобы по нажатию инлайн кнопки он удалял предыдущее сообщение и отправлял новое с новым инлайн меню кнопок. Но он этого не делает. Ещё и выдаётся ошибка после запуска бота: aiogram.utils.exceptions.TerminatedByOtherGetUpdates: Terminated by other getupdates request; make sure that only one bot instance is running, другие приложения не открыты, работает один экземпляр бота. Вот первая команда:`@dp.message_handler(Command("start"))
async def start(message: Message):
await message.answer("", reply_markup=choice)`
К ней вот такой набор кнопок:
choice = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text='', callback_data='katalog')
]
]
)
И ещё одна команда:
@dp.callback_query_handler(text='katalog')
async def answer(call: CallbackQuery):
await call.answer(cache_time=60)
callback.data = call.data
logging.info(f"call = {callback_data}")
await call.message.answer('', reply_markup=katalog_tovarov)
К ней такое меню инлайн кнопок:
katalog_tovarov = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text='', callback_data='oil'),
InlineKeyboardButton(text='', callback_data='soda')
]
]
) И дальше бот перестаёт работать, ничего не отправляет. Просто не знаю, что надо писать
Ответы (2 шт):
Вы можете редактировать сообщение. С помощью callback.message.edit_text. Примерно такой код:
import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
# Configure logging
logging.basicConfig(level=logging.INFO)
# Initialize bot and dispatcher
bot = Bot(token='ВАШТОКЕН')
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def load_znak(message: types.Message):
choice = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text='Каталог', callback_data='katalog')
]
])
await message.answer("Выберите", reply_markup=choice)
@dp.callback_query_handler(text='katalog')
async def answer(callback: CallbackQuery):
katalog_tovarov = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text='Масло', callback_data='oil'),
InlineKeyboardButton(text='Сода', callback_data='soda')
]
])
await callback.message.edit_text("Выбран каталог выберите товар.", reply_markup=katalog_tovarov)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Ошибка которую вы получаете должна выдаваться если запущено два polling-а если у вас запущен только 1 то попробуйте сменить токен бота.
Можно удалять любое сообщение с помощью delete_message, а следующим сообщением отправлять новую клавиатуру
@dp.callback_query_handler(lambda call: call.data.startswith('katalog'))
async def get_katalog_kb(call: types.CallbackQuery):
await bot.delete_message(chat_id=call.from_user.id, message_id=call.message.message_id)
if call.data == 'katalog':
await call.message.answer('Новое сообщение', reply_markup=katalog_tovarov)