python-3.x 如何为循环中创建的所有内联电报bot按钮创建callback_handler?

brgchamk  于 2022-12-01  发布在  Python
关注(0)|答案(1)|浏览(130)

我有一个循环,它可以从我从一个网站上下载的视频中创建卡片,我在这些卡片上添加了内联按钮,让你可以观看视频、评论我需要为每个内联按钮创建一个callback_handler(我已经解决了“Пере гляд”-“查看”按钮现在),然后捕捉状态中的选择,然后选择一个可能的视频播放器和质量.由于id是自动创建的,手动为一百万个可能的视频编写处理程序是不现实的,所以我想知道是否有可能以某种方式自动化这个过程,或者请提供一个更简洁的解决方案。我试图在另一个处理程序中创建一个callback_handler,但是当我试图点击查看按钮时,我只得到了最后一张卡的响应。
example
很抱歉,如果我提交了一个错误的问题。写,我会解释更好的想法。

from aiogram import types
from loader import dp
from states import Search
from aiogram.dispatcher import FSMContext
from keyboards.inline_commands.inline_commands import get_video_from_site
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

@dp.callback_query_handler(text='search')
async def send_message(call: types.CallbackQuery):
    await call.message.answer(f'Введи назву аніме, наприклад: \"Сайтама\" 🦸')
    await Search.name.set()

@dp.message_handler(state=Search.name)
async def state1(message: types.Message, state: FSMContext):
    # name_anime = call.message.text
    name_anime = message.text
    await state.update_data(name=name_anime)

    data = await state.get_data()

    videocards = await get_video_from_site(data.get('name'))

    for i in range(0, len(videocards['img'])):
        link_id = videocards["link"][i].split("/")[3].split("-")[0]

        await message.answer_photo(photo=videocards['img'][i],
                                   caption=f'<b>{videocards["name"][i]}</b>'
                                           f'\n\n'
                                           f'{"".join(videocards["desc"][i][0:170])}....',
                                   reply_markup=InlineKeyboardMarkup(row_width=2,
                                                                     inline_keyboard=[
                                                                         [
                                                                             InlineKeyboardButton(text=f'Перегляд id={link_id}',
                                                                                                  callback_data=f'{link_id}-watch'),
                                                                             InlineKeyboardButton(text='Коменти',
                                                                                                  callback_data=f'{link_id}-comm')
                                                                         ],
                                                                         [
                                                                             InlineKeyboardButton(text='Більше',
                                                                                                  callback_data=f'{link_id}-more')
                                                                         ]
                                                                     ]))
        # await message.answer('Тепер вибери аніме, яке хочеш')
        # await Search.choose_button.set()

        @dp.callback_query_handler(text=f'{link_id}-watch')
        async def get_video(call: types.CallbackQuery, state: FSMContext):
            await call.message.answer(videocards["link"][i])

    await state.finish()
vecaoik1

vecaoik11#

该方法是将10个样品分别进行10次旋转,每次旋转10次。
data_city = types.InlineKeyboardMarkup(row_width=1) result = await sel.select_name_city() в результате я: data_city.row(types.InlineKeyboardButton(text=i[0], callback_data=i[0])) await callback_query.message.answer("Choose video:", reply_markup=data_city)

相关问题