71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
#!/usr/bin/python
|
||
# -*- coding: utf-8 -*-
|
||
import logging
|
||
import os
|
||
from aiogram import Bot, Dispatcher, types
|
||
from aiogram.utils import executor
|
||
from pytube import YouTube, request
|
||
import youtube_dl
|
||
import yt_dlp as youtube_dl
|
||
|
||
# Ваш токен от BotFather
|
||
API_TOKEN = '564432189:AAEF5uBBZZ3VLUl-njjwzDRlqF4HCA9ceGo'
|
||
|
||
# Путь к файлу cookies.txt
|
||
COOKIES_FILE = 'cookies.txt'
|
||
|
||
# Настройка логирования с записью в файл
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
handlers=[
|
||
logging.FileHandler('bot_logs.log'),
|
||
logging.StreamHandler()
|
||
]
|
||
)
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Инициализация бота и диспетчера
|
||
bot = Bot(token=API_TOKEN)
|
||
dp = Dispatcher(bot)
|
||
|
||
# Обработчик команды /start
|
||
@dp.message_handler(commands=['start'])
|
||
async def send_welcome(message: types.Message):
|
||
await message.reply("Привет! Я бот для скачивания видео с YouTube. Отправьте команду /download чтобы начать.")
|
||
|
||
|
||
# Обработчик команды /download
|
||
@dp.message_handler(commands=['download'])
|
||
async def prompt_for_link(message: types.Message):
|
||
await message.reply("Пожалуйста, отправьте ссылку на видео или Shorts с YouTube.")
|
||
|
||
|
||
# Обработчик получения ссылки на YouTube
|
||
@dp.message_handler()
|
||
async def download_youtube_video(message: types.Message):
|
||
link = message.text
|
||
|
||
try:
|
||
ydl_opts = {
|
||
'outtmpl': '%(title)s.%(ext)s',
|
||
'cookies': COOKIES_FILE,
|
||
}
|
||
|
||
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
|
||
info_dict = ydl.extract_info(link, download=True)
|
||
video_file = ydl.prepare_filename(info_dict)
|
||
|
||
await message.reply("Видео скачивается, пожалуйста подождите...")
|
||
|
||
with open(video_file, 'rb') as video:
|
||
await bot.send_video(message.chat.id, video, caption="Вот ваше видео с YouTube")
|
||
|
||
os.remove(video_file)
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при скачивании видео: {e}")
|
||
await message.reply("Произошла ошибка при скачивании видео. Пожалуйста, попробуйте ещё раз.")
|
||
|
||
if __name__ == '__main__':
|
||
logger.info('Start polling.')
|
||
executor.start_polling(dp, skip_updates=True) |