Скрипт загрузки видео с YouTube

Electro

Активный участник
Возникла проблема при написании скрипта для загрузки видео с YouTube через бота в Telegram: появляется сообщение об ошибке 'get_throttling_function_name: could not find match for multiple'. Помощь требуется!"

Python:
import os
from aiogram import Bot, types, executor, Dispatcher
from pytube import YouTube

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

def download_video(url):
    yt = YouTube(url)
    yt.streams.first().download(filename='temp_video')
    return 'temp_video.mp4'

@dp.message_handler()
async def download_and_send(message: types.Message):
    url = message.text
    try:
        video_path = download_video(url)
        with open(video_path, 'rb') as video:
            await bot.send_video(message.chat.id, video)
        os.remove(video_path)
        await bot.send_message(message.chat.id, "Видео успешно скачано и отправлено!")
    except Exception as e:
        await bot.send_message(message.chat.id, f"Произошла ошибка: {e}")

if __name__ == "__main__":
    executor.start_polling(dp)
 
Чтобы скрипт для скачивания видео с YouTube в телеграм мог работать, вам сначала нужно обновить модуль pytube, который используется для обработки видео с YouTube. Вот как это сделать:
  1. Откройте Python скрипт в вашем файловом менеджере и перейдите к следующему пути: \Python\Lib\site-packages\pytube\cipher.py
  2. Откройте файл cipher.py с помощью редактора кода.
  3. Найдите строку 272. Вы должны увидеть код, который выглядит примерно так:

    Python:
    r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*',

  4. Заменить на:

    Python:
    r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*.*\|\|\s*(.*)\(',

  5. Сохраните и закройте файл cipher.py.
  6. Перезапустите ваш скрипт бота.
А вот готовый скрипт и адрес бота для скачиванию видео с Youtube в телеграм:
  1. Бот: @vidvortex_bot
  2. Скрипт:

  3. Python:
    import os
    from aiogram import Bot, types, executor, Dispatcher
    from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
    from pytube import YouTube
    
    class VideoDownloaderBot:
        def __init__(self, token):
            self.bot = Bot(token=token)
            self.dp = Dispatcher(self.bot)
            self.dp.message_handler(commands=['start'])(self.start)
            self.dp.message_handler()(self.handle_message)
            self.download_status = {}
    
        def download_video(self, url):
            yt = YouTube(url)
            video_stream = yt.streams.get_by_itag(137)  # 1080p
            if video_stream is None:
                video_stream = yt.streams.get_by_itag(22)  # 720p
            if video_stream is None:
                video_stream = yt.streams.first()  # если потоки 137 и 22 недоступны, скачиваем первый доступный поток
            video_path = video_stream.download(filename='temp_video', output_path=os.getcwd())
            return video_path
    
        async def start(self, message: types.Message):
            keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
            button = types.KeyboardButton(text='Скачать видео с YouTube')
            keyboard.add(button)
            await self.bot.send_message(message.chat.id, "Выберите действие:", reply_markup=keyboard)
    
        async def handle_message(self, message: types.Message):
            chat_id = message.chat.id
    
            if self.download_status.get(chat_id, False):
                await self.bot.send_message(chat_id, "Видео еще загружается. Пожалуйста, подождите...")
                return
    
            if message.text == 'Скачать видео с YouTube':
                await self.bot.send_message(chat_id, "Пожалуйста, отправьте ссылку на видео.")
                return
    
            url = message.text
            try:
                self.download_status[chat_id] = True
                await self.bot.send_message(chat_id, "Видео загружается, пожалуйста, подождите...")
                video_path = self.download_video(url)
                with open(video_path, 'rb') as video:
                    await self.bot.send_video(chat_id, video)
                os.remove(video_path)
                await self.bot.send_message(chat_id, "Видео успешно скачано и отправлено!")
                self.download_status[chat_id] = False
            except Exception as e:
                print(e)
                await self.bot.send_message(chat_id, f"Произошла ошибка: {e}")
                self.download_status[chat_id] = False
    
        def run(self):
            executor.start_polling(self.dp)
    
    if __name__ == "__main__":
        bot = VideoDownloaderBot('ВСТАВИТЬ СВОЙ ТОКЕН')
        bot.run()
 
Последнее редактирование модератором:
Чтобы скрипт для скачивания видео с YouTube в телеграм мог работать, вам сначала нужно обновить модуль pytube, который используется для обработки видео с YouTube. Вот как это сделать:
  1. Откройте Python скрипт в вашем файловом менеджере и перейдите к следующему пути: \Python\Lib\site-packages\pytube\cipher.py
  2. Откройте файл cipher.py с помощью редактора кода.
  3. Найдите строку 272. Вы должны увидеть код, который выглядит примерно так:

    Python:
    r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*'

  4. Заменить на:

    Python:
    r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*.*\|\|\s*(.*)\('

  5. Сохраните и закройте файл cipher.py.
  6. Перезапустите ваш скрипт бота.
А вот готовый скрипт и адрес бота для скачиванию видео с Youtube в телеграм:
  1. Бот: @vidvortex_bot
  2. Скрипт:

  3. Python:
    import os
    from aiogram import Bot, types, executor, Dispatcher
    from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
    from pytube import YouTube
    
    class VideoDownloaderBot:
        def __init__(self, token):
            self.bot = Bot(token=token)
            self.dp = Dispatcher(self.bot)
            self.dp.message_handler(commands=['start'])(self.start)
            self.dp.message_handler()(self.handle_message)
            self.download_status = {}
    
        def download_video(self, url):
            yt = YouTube(url)
            video_stream = yt.streams.get_by_itag(137)  # 1080p
            if video_stream is None:
                video_stream = yt.streams.get_by_itag(22)  # 720p
            if video_stream is None:
                video_stream = yt.streams.first()  # если потоки 137 и 22 недоступны, скачиваем первый доступный поток
            video_path = video_stream.download(filename='temp_video', output_path=os.getcwd())
            return video_path
    
        async def start(self, message: types.Message):
            keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
            button = types.KeyboardButton(text='Скачать видео с YouTube')
            keyboard.add(button)
            await self.bot.send_message(message.chat.id, "Выберите действие:", reply_markup=keyboard)
    
        async def handle_message(self, message: types.Message):
            chat_id = message.chat.id
    
            if self.download_status.get(chat_id, False):
                await self.bot.send_message(chat_id, "Видео еще загружается. Пожалуйста, подождите...")
                return
    
            if message.text == 'Скачать видео с YouTube':
                await self.bot.send_message(chat_id, "Пожалуйста, отправьте ссылку на видео.")
                return
    
            url = message.text
            try:
                self.download_status[chat_id] = True
                await self.bot.send_message(chat_id, "Видео загружается, пожалуйста, подождите...")
                video_path = self.download_video(url)
                with open(video_path, 'rb') as video:
                    await self.bot.send_video(chat_id, video)
                os.remove(video_path)
                await self.bot.send_message(chat_id, "Видео успешно скачано и отправлено!")
                self.download_status[chat_id] = False
            except Exception as e:
                print(e)
                await self.bot.send_message(chat_id, f"Произошла ошибка: {e}")
                self.download_status[chat_id] = False
    
        def run(self):
            executor.start_polling(self.dp)
    
    if __name__ == "__main__":
        bot = VideoDownloaderBot('ВСТАВИТЬ СВОЙ ТОКЕН')
        bot.run()
Это просто огонище. Я весь инет перерыл. Спасибо большое. Работает.
 
Назад
Сверху