Вопрос: Скрипт на Python (автозагрузка видео в VKvideo)

w1llis01

One Level
23.10.2025
2
1
Добрый день всем. Занялся на днях скриптом для автоматизации загрузки видео в VK\VKvideo. Вроде бы работает, а вроде и руки кривые, да знаний не хватает. Площадка для меня новая и не все тонкости её знакомы.

Собственно говоря какова была задумка:
1. Берутся видео из папки и грузятся на Vkvideo (оно же VK, в принципе) - в нужно канал или группу, но не на свою страницу.
2. Оттуда же подгружается превью к нужным видео.
3. Берется название и описание к видео и вставляется в рандомном порядке.
4. Всё это действо после загрузки, автоматически публикуется, соотсветсвенно.

Но по итогу:
Видео загружается, всё вроде бы четко, но превью не ставится. Так же, название и описание - остаются пустыми (думал как-то привязать генерацию этого всего дела, но увы не вышло, из файла данные вроде берутся по логам, но на платформе - пустота). Пробовал по разному, но никак. И главное - видео грузятся на личный профиль (канал), но никак не выходит, чтобы оно грузилось в канал (группу), который нужен.

Код:

Python:
import os
import random
import pandas as pd
import requests

# Вставь свой токен доступа VK
access_token = '12345'
group_id = '12345'  # ID канала или группы, куда нужно загружать видео
video_folder = r'C:\Users\админ\Desktop\vk\DN'  # Путь к папке с видео и превью

# Загрузка данных из Excel или CSV
def load_video_data(file_path):
    # Загружаем данные из Excel или CSV
    if file_path.endswith('.xlsx'):
        df = pd.read_excel(file_path)
    elif file_path.endswith('.csv'):
        df = pd.read_csv(file_path)
    else:
        raise ValueError("Неподдерживаемый формат файла. Поддерживаются только .xlsx и .csv")
 
    return df

# Получаем случайное название и описание
def get_random_title_and_description(df):
    # Случайным образом выбираем строку
    random_row = df.sample(n=1).iloc[0]
    video_title = random_row['Название']
    video_description = random_row['Описание']
    return video_title, video_description

def get_upload_url():
    # Получаем URL для загрузки видео
    url = f'https://api.vk.com/method/video.save?access_token={access_token}&v=5.131'
    response = requests.get(url)
    data = response.json()
 
    if 'response' in data:
        upload_url = data['response']['upload_url']
        return upload_url
    else:
        print("Ошибка при получении URL для загрузки:", data)
        return None

def save_video_from_direct_link(direct_link, video_title, video_description):
    # Сохранение видео с использованием прямой ссылки и параметров для названия и описания
    url = f'https://api.vk.com/method/video.save?access_token={access_token}&v=5.131'
    params = {
        'direct_link': direct_link,
        'owner_id': group_id,  # Используем отрицательное значение для ID группы/канала
        'name': video_title,  # Название видео
        'description': video_description  # Описание видео
    }

    response = requests.post(url, params=params)
    data = response.json()

    if 'response' in data:
        print("Видео успешно сохранено!")
        return data['response']
    else:
        print("Ошибка при сохранении видео:", data)
        return None

def upload_video_to_vk(upload_url, video_file_path, preview_file_path):
    # Загружаем видео на сервер VK
    video_data = {'file': open(video_file_path, 'rb')}
    upload_response = requests.post(upload_url, files=video_data)

    # Для диагностики выводим весь ответ, который возвращает сервер
    print(f"Ответ сервера на загрузку видео: {upload_response.text}")
 
    try:
        upload_result = upload_response.json()
    except ValueError as e:
        print(f"Ошибка при декодировании JSON: {e}")
        return None

    if 'video' in upload_result:
        video_id = upload_result['video']['id']
        owner_id = upload_result['video']['owner_id']
        print(f"Видео успешно загружено: {video_id}")
   
        # Проверка существования файла превью (обложки)
        if not os.path.exists(preview_file_path):
            print(f"Ошибка: Превью {preview_file_path} не найдено!")
            return video_id, owner_id, None, None
   
        # Загружаем превью (обложку)
        preview_url = f'https://api.vk.com/method/photos.save?access_token={access_token}&v=5.131&album_id=profile'
        preview_data = {'file': open(preview_file_path, 'rb')}
        preview_response = requests.post(preview_url, files=preview_data)
        preview_result = preview_response.json()

        if 'response' in preview_result:
            preview_id = preview_result['response'][0]['id']
            preview_owner_id = preview_result['response'][0]['owner_id']
            return video_id, owner_id, preview_id, preview_owner_id
        else:
            print(f"Ошибка при загрузке превью: {preview_result}")
            return video_id, owner_id, None, None
    else:
        print("Ошибка при загрузке видео:", upload_result)
        return None

def post_video_on_channel(video_id, owner_id, preview_id, preview_owner_id, video_title, video_description):
    # Публикуем видео на канале с названием и описанием
    post_url = f'https://api.vk.com/method/video.save?access_token={access_token}&v=5.131'
 
    # Логирование параметров
    print(f"Публикуем видео с названием: {video_title} и описанием: {video_description}")

    post_data = {
        'video_id': video_id,
        'owner_id': owner_id,  # ID группы или канала
        'name': video_title,  # Название видео
        'description': video_description,  # Описание видео
        'preview_id': preview_id,  # ID превью
        'preview_owner_id': preview_owner_id  # Owner ID превью
    }

    post_response = requests.post(post_url, data=post_data)
    post_result = post_response.json()

    if 'response' in post_result:
        print(f"Видео успешно опубликовано на канале с ID: {video_id}")
    else:
        print(f"Ошибка при публикации видео: {post_result}")

def process_video_folder(df):
    upload_url = get_upload_url()
    if not upload_url:
        print("Не удалось получить URL для загрузки видео.")
        return
 
    for filename in os.listdir(video_folder):
        if filename.endswith('.mp4'):
            video_file = os.path.join(video_folder, filename)
            preview_file = os.path.splitext(video_file)[0] + '.jpg'

            if os.path.exists(preview_file):
                print(f"Загружаем видео: {filename} с превью {os.path.basename(preview_file)}")

                # Получаем случайное название и описание из Excel/CSV
                video_title, video_description = get_random_title_and_description(df)

                # Логирование
                print(f"Генерация названия: {video_title}, описание: {video_description}")

                # Получаем ссылку для загрузки видео
                upload_url = get_upload_url()
                if not upload_url:
                    print("Не удалось получить URL для загрузки видео.")
                    return

                video_data = {'file': open(video_file, 'rb')}
                upload_response = requests.post(upload_url, files=video_data)

                # Проверяем, что сервер вернул корректный ответ
                print(f"Ответ сервера на загрузку видео: {upload_response.text}")

                try:
                    upload_result = upload_response.json()
                    if 'direct_link' in upload_result:
                        # Если ссылка на загрузку получена, сохраняем видео с этой ссылкой
                        result = save_video_from_direct_link(upload_result['direct_link'], video_title, video_description)
                        if result:
                            video_id = result['video_id']
                            print(f"Видео с ID {video_id} успешно загружено!")
                            # После загрузки, публикуем видео на канале с названием и описанием
                            post_video_on_channel(video_id, group_id, result['preview_id'], result['preview_owner_id'], video_title, video_description)
                except Exception as e:
                    print(f"Ошибка при обработке ответа: {e}")

# Загрузка данных из Excel или CSV
file_path = r'C:\Users\админ\Desktop\video_data.xlsx'  # Укажи путь к своему файлу Excel или CSV
df = load_video_data(file_path)

# Запуск обработки всех видео в папке
process_video_folder(df)





Сам скрипт - прикрепил. Может у кого-то был опыт и знает, как чего там нужно сделать? Буду крайне признателен за помощь!
 

Вложения

  • 1.zip
    1.zip
    2,5 КБ · Просмотры: 6
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab