@deus97

Как в aiogram из инлайн кнопки вызвать функцию с параметрами?

Здравствуйте! Уже долгое время пытаюсь с этим разобраться, но нагуглить ответ на свой вопрос так и не удалось. Понимаю, что без помощи знающего человека не справлюсь..

Я пишу бота, который при получении ссылки из ютюб выводит название видео и две инлайн кнопки: "720р" и "Music", а по нажатию скачивает видео в качестве 720р, или музыку.

За обработку ссылки, скачивание и загрузку видео в бот отвечает данная функция:

async def download_youtube_video(url, message, bot):


Я могу вывести текст по нажатию на инлайн кнопку, но как через инлайн кнопку обратиться
к функции с параметрами не знаю.

Знаю что этот вариант не подходит:
@dp.callback_query_handler(lambda c: c.data == 'video')
async def send_video(callback_query: types.CallbackQuery):
    await callback_query.message.answer('Видео вроде как должно было начать загружаться, но..')


Вот полный код:

import os
from pytube import YouTube
from aiogram import *
from config import token
from aiogram.types import ReplyKeyboardMarkup, InlineKeyboardMarkup, InlineKeyboardButton

from aiogram.utils.callback_data import CallbackData


bot = Bot(token)
dp = Dispatcher(bot)


def create_keyboard():
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton(text="720p",  callback_data="video"))
    keyboard.add(InlineKeyboardButton(text="Music", callback_data="music"))
    return keyboard


@dp.message_handler()
async def text_message(message:types.Message):
    chat_id = message.chat.id
    url = message.text
    yt = YouTube(url)

    if message.text.startswith("https://www.youtube.com"):
        await bot.send_message(chat_id, f"{yt.title}",
                               reply_markup=create_keyboard(),
                               parse_mode="Markdown")


@dp.message_handler(commands=["start"])
async def start_message(message:types.Message):
    chat_id = message.chat.id
    await bot.send_message(chat_id, "Привет, чтобы скачать видео отправь мне ссылку на видео с YouTube!")


async def download_youtube_video(url, message, bot):
    try:
        yt = YouTube(url)
        stream = yt.streams.filter(progressive=True, file_extension="mp4")
        stream.get_highest_resolution().download(f"{message.chat.id}", f"{message.chat.id}_{yt.title}")

        with open(f"{message.chat.id}/{message.chat.id}_{yt.title}", "rb") as video:
            await bot.send_video(message.chat.id, video, parse_mode="Markdown")
            os.remove(f"{message.chat.id}/{message.chat.id}_{yt.title}")
    except:
        await bot.send_message(message.chat.id, "Не удалось")


@dp.callback_query_handler(lambda c: c.data == 'video')
async def send_video(callback_query: types.CallbackQuery):
    await callback_query.message.answer('Видео вроде как должно было начать загружаться, но..')


if __name__ == "__main__":
    executor.start_polling(dp)
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@borisalekseev
extra beginner junior python backend
Пихай в колбэк дату кнопки, которую отправляешь юзеру, в строку; через разделитель параметры (ссылка на видео), качество и все что нужно. В хэндлере распаршивай. Не знаю костыль или нет но работает и много кто так делает.

Пример:
def create_keyboard(video_url):
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton(text="720p",  callback_data=f"video|{video_url}"))
    keyboard.add(InlineKeyboardButton(text="Music", callback_data=f"music|{video_url}"))
    return keyboard

@dp.callback_query_handler(lambda c: c.data.startswith('video'))
async def send_video(callback_query: types.CallbackQuery):
    _, url = callback_query.data.split("|")
    ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы