Как забрать значение InLine кнопки и чтобы записать в FSM
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram import types, Dispatcher
from TelegramBot.create_bot import bot
from TelegramBot.sqlRequests import SqlRequests as mSql
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
class FSMSearchArticle(StatesGroup):
searchArticle = State()
brandID = State()
# @dp.message_handler(commands=['search_article'], state=None)
async def start_search_article(message: types.Message):
await FSMSearchArticle.searchArticle.set()
await bot.send_message(message.from_user.id, "? Введите номер запчасти")
await message.delete()
# @dp.message_handler(state=FSMSearchArticle.searchArticle)
async def load_search_article(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['s_article'] = message.text
nor = mSql.number_of_results(message.text)
article_result = mSql.search_by_article(message.text)
if nor == 0:
await state.finish()
await message.reply(" ❌ Жаль, но я не знаю номер: " + message.text + "\n\n")
elif nor == 1:
await state.finish()
result = ('?\nАртикул: ' + str(article_result[0][1]) + '\n'
+ 'Бренд: ' + str(article_result[0][3]) + '\n'
+ 'Наименование: ' + str(article_result[0][4]))
await bot.send_message(message.chat.id, result)
else:
brand_inline_keyboard = InlineKeyboardMarkup()
for i in article_result:
brand_inline_keyboard.add(InlineKeyboardButton(text=i[3], callback_data=i[2]))
await FSMSearchArticle.next()
await bot.send_message(message.from_user.id, "Данный артикул присутствует в нескольких брендах!\n\n"
"? Пожалуйста выберете необходимый бренд.",
reply_markup=brand_inline_keyboard)
# @dp.callback_query_handler(text="text")
async def load_brand(callback_query: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
data["brand_id"] = callback_query.data
print(data)
await bot.send_message('результат !!!!! ДОПИСАТЬ')
await state.finish()
def register_handlers_client_search_article(dp: Dispatcher):
dp.register_message_handler(start_search_article, commands=['search_article'])
dp.register_message_handler(load_search_article, state=FSMSearchArticle.searchArticle)
dp.register_message_handler(load_brand, text="text")
Не понимаю как написать следующий handler, чтобы callback_data была записана в FSM.
Ответы (1 шт):
Не давайте такой обрезанный код пожалуйста, если вы присылаете хендлер то пришлите его начиная с декоратора.
А насчет вопроса, то это делается вот так.
@dp.callback_query_handler(text="text")
async def echos(callback_query: CallbackQuery, state: FSMContext):
async with state.proxy() as data:
data["data_callback"] = callback_query.data
UPD1. Ааа, ты так занимаешься этими извращениями с регистрацией хендлеров? Тогда понятно.
Ну смотри, меняй вот это
dp.register_message_handler(load_brand, text="text") на вот это dp.register_callback_handler(load_brand, text="text").
А ещё лучше будет полный отказ от регистрации хедлеров таким способом. Просто сделай пакет с инитом, который импортирует разбитые по папкам модули с хендлерами внутри и вот этот пакет импортируй в основном файле. В PyCharm'е он будет выделяться серым так как не используется, но он свою задачу сделал, он зарегистрировал их и они будут работать, главное не забывать импортировать новые модули в ините.
UPD2. Ну так само собой он не будет срабатывать ведь в @dp.callback_query_handler(text="text") нужно заменить "text" на ту колбек дату которую возвращает тебе инлайн кнопка. К примеру можно вот так.
# @dp.message_handler(state=FSMSearchArticle.searchArticle)
async def load_search_article(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['s_article'] = message.text
nor = mSql.number_of_results(message.text)
article_result = mSql.search_by_article(message.text)
if nor == 0:
await state.finish()
await message.reply(" ❌ Жаль, но я не знаю номер: " + message.text + "\n\n")
elif nor == 1:
await state.finish()
result = ('?\nАртикул: ' + str(article_result[0][1]) + '\n'
+ 'Бренд: ' + str(article_result[0][3]) + '\n'
+ 'Наименование: ' + str(article_result[0][4]))
await bot.send_message(message.chat.id, result)
else:
brand_inline_keyboard = InlineKeyboardMarkup()
for i in article_result:
brand_inline_keyboard.add(InlineKeyboardButton(text=i[3], callback_data=f"load_search:{i[2]}"))
await FSMSearchArticle.next()
await bot.send_message(message.from_user.id, "Данный артикул присутствует в нескольких брендах!\n\n"
"? Пожалуйста выберете необходимый бренд.",
reply_markup=brand_inline_keyboard)
# @dp.callback_query_handler(text_startswith="load_search:")
async def load_brand(callback_query: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
data["brand_id"] = callback_query.data.split(":")[1]
print(data)
await bot.send_message('результат !!!!! ДОПИСАТЬ')
await state.finish()