Может кто помочь дописать бота?) | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой уникальный скрипт?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Может кто помочь дописать бота?)

Ksandr

Джун
Автор темы
4 Фев 2023
15
0
0
Писал ChatGPT, долго с ним мучались.. Суть такова - бот, который может загрузить видео с YouTube и отправить его вам в zip-архиве (Видео, название, теги, описание и превью) Может кто потыкать и исправить ошибки? И добавить что бы после отправки пользователю архива файлы удалялись с сервера.
Python:
import os
import zipfile
import yt_dlp as youtube_dl
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

TOKEN = 'Токен от бота'

def handle_video_url(update, context):
    url = update.message.text
    try:
        with youtube_dl.YoutubeDL({}) as ydl:
            info_dict = ydl.extract_info(url, download=False)
            video_url = info_dict.get('url', None)
            title = info_dict.get('title', 'video')
            description = info_dict.get('description', '')
            tags = info_dict.get('tags', None)
            video_id = info_dict.get('id', None)
            context.bot.send_message(chat_id=update.effective_chat.id, text="Видео загружено")
            ydl.download([url])

            # Saving the video preview
            preview_url = info_dict.get('thumbnail', None)
            if preview_url:
                preview_filename = f'{title}.jpg'
                ydl.download([preview_url])
                os.rename(os.path.join(os.getcwd(), 'maxresdefault [maxresdefault].jpg'), os.path.join(os.getcwd(), preview_filename))
            else:
                context.bot.send_message(chat_id=update.effective_chat.id, text="Превью не найдено")

            zip_filename = create_zip(video_id, title, description, tags)
            with open(zip_filename, 'rb') as zip_file:
                context.bot.send_document(chat_id=update.effective_chat.id, document=zip_file)
    except Exception as e:
        context.bot.send_message(chat_id=update.effective_chat.id, text=f"Произошла ошибка: {e}")

def create_zip(video_id, title, description, tags):
    zip_filename = f"{title}.zip"
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as myzip:
        myzip.write(f'{title}.mp4', arcname=f'{title}.mp4')
        with open(f'{title}.txt', 'w', encoding='utf-8') as f:
            f.write(f'Video ID: {video_id}\nTitle: {title}\nDescription: {description}\nTags: {tags}')
        preview_path = os.path.join(os.getcwd(), f'{title}.jpg')
        if os.path.exists(preview_path):
            myzip.write(preview_path, arcname=f'{title}.jpg')
    return zip_filename

def start(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id, text="Привет! Я бот, который может загрузить видео с YouTube и отправить его вам в zip-архиве. Просто отправьте мне ссылку на видео.")

def main():
    updater = Updater(token=TOKEN, use_context=True)
    dp = updater.dispatcher
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_video_url))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()
 

Ksandr

Джун
Автор темы
4 Фев 2023
15
0
0
Как я понял ошибка в том что он не может найди заданый файл. Не находит потому-что к самому названию после скачивания добавилось ещё айди видео "примернaзвания [EfesfkSkjd].mp4 "
 

Вложения

  • вап.jpg
    вап.jpg
    13.3 KB · Просмотры: 19

v_NLP

Dev Py3
8 Янв 2023
46
14
8
Ksandr, Говорят чатгпт заменит людей. Ага.

Описание которое чатгпт дал можно? какая версия библиотек тут используется?
 

Ksandr

Джун
Автор темы
4 Фев 2023
15
0
0
v_NLP, Я говорю исправь одну ошибку а он пол кода переписывает и добавляет новые модули. В итоге понял что надо ему четко сразу прописывать что делать и что не делать.
 

v_NLP

Dev Py3
8 Янв 2023
46
14
8
1676981314228

Исправление. Костыльно:
import os
import zipfile
from pprint import pprint

import yt_dlp as youtube_dl
from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import filters, Text, Command
from aiogram.utils import executor

TOKEN = 'ТОКЕНБОТА'
bot = Bot(token=TOKEN)


async def handle_video_url(message):
    url = message.text
    try:
        with youtube_dl.YoutubeDL({}) as ydl:
            info_dict = ydl.extract_info(url, download=False)
            video_url = info_dict.get('url', None)
            title = info_dict.get('title', 'video')
            description = info_dict.get('description', '')
            tags = info_dict.get('tags', None)
            video_id = info_dict.get('id', None)
            video_ext = info_dict.get('video_ext', None)
            mainTitle = f"{title} [{video_id}].{video_ext}"
            await message.answer(text="Видео загружается")
            ydl.download([url])
            await message.answer(text="Видео загружено")


            # Saving the video preview
            preview_url = info_dict.get('thumbnail', None)
            if preview_url:
                preview_filename = f'{title}.jpg'
                ydl.download([preview_url])
                os.rename(os.path.join(os.getcwd(), 'maxresdefault [maxresdefault].jpg'), os.path.join(os.getcwd(), preview_filename))
            else:
                await message.answer(text="Превью не найдено")

            zip_filename = create_zip(video_id, title, description, tags, mainTitle)
            with open(zip_filename, 'rb') as zip_file:
                await message.reply_document(document=zip_file)
            for i in [f"{title}.txt", f"{title}.zip",
                      "maxresdefault [maxresdefault].jpg",
                      preview_filename,mainTitle]:
                try:
                    os.unlink(i)
                except:
                    pass

    except Exception as e:
        await message.answer(text=f"Произошла ошибка: {e}")

def create_zip(video_id, title, description, tags, mainTitle):
    zip_filename = f"{title}.zip"
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as myzip:
        myzip.write(mainTitle, arcname=mainTitle)
        with open(f'{title}.txt', 'w', encoding='utf-8') as f:
            f.write(f'Video ID: {video_id}\nTitle: {title}\nDescription: {description}\nTags: {tags}')
        preview_path = os.path.join(os.getcwd(), f'{title}.jpg')
        if os.path.exists(preview_path):
            myzip.write(preview_path, arcname=f'{title}.jpg')
    return zip_filename

async def start(message):
    await message.answer(text="Привет! Я бот, который может загрузить видео с YouTube и отправить его вам в zip-архиве. Просто отправьте мне ссылку на видео.")

def main():
    dp = Dispatcher(bot, storage=MemoryStorage())
    dp.register_message_handler(start, commands="start")
    dp.register_message_handler(handle_video_url, Text)
    executor.start_polling(dp, skip_updates=True)

if __name__ == '__main__':
    main()

Заменил библиотеку тг на aiogram
 
Последнее редактирование:
Like
  • 1
Реакции: 1 user

Ksandr

Джун
Автор темы
4 Фев 2023
15
0
0
v_NLP, Произошла ошибка: [WinError 2] The system cannot find the file specified: 'C:\\Users\\LENOVO\\Desktop\\gg\\maxresdefault [maxresdefault].jpg' -> 'C:\\Users\\LENOVO\\Desktop\\gg\\Самое короткое Minecraft видео.jpg'
 

v_NLP

Dev Py3
8 Янв 2023
46
14
8
Ksandr, добавь конструкцию try - except там где оно пытается переименовать файл

Python:
try:
    os.rename(os.path.join(os.getcwd(), 'maxresdefault [maxresdefault].jpg'), os.path.join(os.getcwd(), preview_filename))
except:
    pass


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

Ksandr

Джун
Автор темы
4 Фев 2023
15
0
0
v_NLP, А эта ошибка возникает из-за того что превью скачивается в формате .webp а не .jpg
Произошла ошибка: [WinError 2] The system cannot find the file specified: 'C:\\Users\\LENOVO\\Desktop\\gg\\maxresdefault [maxresdefault].jpg' -> 'C:\\Users\\LENOVO\\Desktop\\gg\\Самое короткое Minecraft видео.jpg'
 

v_NLP

Dev Py3
8 Янв 2023
46
14
8
Ksandr, по хорошему просто отловить как скачивается и просто ренеймать по имени которое скачалось. Можешь проверку
Код:
if os.path.exists(preview_filename ): 
os.rename(os.path.join(os.getcwd(), 'maxresdefault [maxresdefault].jpg'), os.path.join(os.getcwd(), preview_filename))
 
Активность:
Пока что здесь никого нет