UPD:
Подсказали, что тут необходимо использовать Finite State Machine (FSM).
Первый раз о ней слышу (Учусь только).
Доделываю своего бота в телеграме.
При нажатии кнопки, он должен вывести сообщение "XXXXX", после которого пользователь отправляет фото боту, которое он пересылает уже в другой чат. На этом цикл завершается.
Однако, всё работает криво.
см. ниже*
Есть кусок кода:
b1 = InlineKeyboardButton('XXXXXXXXXX', callback_data='adm',)
b2 = InlineKeyboardButton('XXXXXXXXXX', callback_data='art')
Back = InlineKeyboardButton('XXXXXXXX', callback_data='back')
KBB = InlineKeyboardMarkup().add(Back)
KB = InlineKeyboardMarkup().add(b1).add(b2)
@dp.message_handler(commands=['start'])
async def firstmessage(msg: types.Message):
dir1 = 'XXXXXXXX'
with open(dir1, 'rb') as pic1:
await bot.send_photo(msg.from_user.id, pic1, caption=XXXXX, reply_markup=KB)
@dp.callback_query_handler(lambda c: c.data == 'back')
async def back_to_menu(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
dir2 = 'XXXXXXXXXX'
with open(dir2, 'rb') as pic2:
await bot.send_photo(callback_query.from_user.id, pic2, caption='XXXXXX', reply_markup=KB)
@dp.callback_query_handler(lambda c: c.data == 'adm')
async def admcontact(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, 'XXXXXXXXX', reply_markup=KBB)
@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
@dp.message_handler(content_types=["photo"])
async def replying(pic):
await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)
Если боту скинуть фотографию ДО строчки:
@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
@dp.message_handler(content_types=["photo"])
async def replying(pic):
await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)
То он на неё НЕ реагирует. Так и должно быть.
Если же нажать на кнопку b2 (т.е активировать этот самый кусок), а после перейти обратно к другой клавиатуре, то бот уже будет пересылать отправленное фото тогда, когда не надо.