Telegram bot (aiogram). Отвечает на фото тогда, когда не нужно
Доделываю своего бота в телеграме. Обнаружил, что он реагирует на фото тогда, когда это не нужно.
Есть кусок кода:
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 (те активировать этот самый кусок фото), а после перейти обратно к другой клавиатуре, то бот уже будет пересылать отправленное фото тогда, когда не надо.
Ответы (1 шт):
Зачем Вам обработчик для фотографий, вложенный в функцию для обработки коллбэков? Они должны быть разделены. Вместо:
@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)
Если Вы хотите, чтобы бот начинал диалог с пользователем и ждал от него фотографии только тогда, когда юзер нажал на кнопку art, то реализовать такое можно с помощью aiogram FSM:
class UploadPhotoForm(StatesGroup):
photo = State()
@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 UploadPhotoForm.photo.set()
@dp.message_handler(lambda message: message.photo is None, state=UploadPhotoForm.photo)
async def process_photo_invalid(message: types.Message):
return await message.reply("Фотография не найдена в сообщении!")
@dp.message_handler(lambda message: message.photo is not None, state=UploadPhotoForm.photo)
async def process_photo(message: types.Message, state: FSMContext):
file_id = message.photo[-1].file_id # file ID загруженной фотографии
# await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
await bot.send_message(callback_query.from_user.id, "Фотография успешно загружена!")
await state.finish()