Публикация VK клипов через API (Python)

Пытаюсь сделать загрузку клипов в сообщество VK.

r = requests.post("https://api.vk.com/method/shortVideo.create",  
                      params={'v': 5.199, 
                      "access_token": token,
                      'group_id': 228944932, 
                      'wallpost': 0, 
                      'description': caption, 
                      "file_size": os.path.getsize(file)})

Итог:

{'error': {'error_code': 5, 'error_msg': 'User authorization failed: no access_token passed.', 'request_params': [{'key': 'v', 'value': '5.199'}, {'key': 'group_id', 'value': '228944932'}, {'key': 'wallpost', 'value': '1'}, {'key': 'description', 'value': 'Описание 1'}, {'key': 'file_size', 'value': '2491198'}, {'key': 'method', 'value': 'shortVideo.create'}, {'key': 'oauth', 'value': '1'}]}}

Вся информация на эту тему от 2023 года и старше. Даже тогда были проблему с доступом т.к. метод закрытый. Все пишут, что помогает токен от VK ME, но он мне не помог, итог такой же.


Ответы (1 шт):

Автор решения: not_honey

Токен берите у vkhost - "vk.сом" на кнопке. Пример на vk_api, для requests добавляем к запросам параметр access_token. Версию можно не указывать или 5.249

import vk_api
from vk_api.exceptions import ApiError
import requests
import os
import time
import json

def upload_short_video(token: str, group_id: int, video_path: str):
    try:
        vk = vk_api.VkApi(token=token).get_api()
        file_size = os.path.getsize(video_path)
        
        # 1. Получаем upload URL
        print("1. Получаем upload URL...")
        upload_data = vk.shortVideo.create(
            group_id=group_id, # Обязательно
            file_size=file_size, # Обязательно
        )
        
        # 2. Загружаем шортс
        print("2. Загружаем шортс...")
        with open(video_path, 'rb') as f:
            response = requests.post(upload_data['upload_url'], files={'file': f})
        video_info = response.json()
        
        # 3. ВАЖНО: Добавляем задержку для обработки видео
        print("3. Ждем обработки шортс (10 сек)...")
        time.sleep(10)
        
        # 3.5 Редактируем описание
        print("3.5 Редактируем описание...")
        edit_result = vk.shortVideo.edit(
            video_id=video_info['video_id'], # Обязательно
            owner_id=video_info['owner_id'], # Обязательно
            description="Описание с #хештегами",  # Текст описания
            privacy_view='all',
            can_make_duet=1
        )
        #print("Результат редактирования:")
        #print(json.dumps(edit_result, indent=2))
        
        # 4. Публикуем шортс
        print("4. Публикуем шортс...")
        publish_result = vk.shortVideo.publish(
            video_id=video_info['video_id'], # Обязательно
            owner_id=video_info['owner_id'], # Обязательно
            license_agree=1, # Обязательно
            publish_date=0,
            wallpost=1 # wallpost=0 если не нужно на стену
        )
        
        #print("\nОтвет метода shortVideo.publish:")
        #print(json.dumps(publish_result, indent=2))
        
        print("\nУСПЕХ! Шортс опубликован ✅")
        
        wall_post_id = None
        if 'video' in publish_result and 'wall_post_id' in publish_result['video']:
            wall_post_id = publish_result['video']['wall_post_id']
        elif 'wall_post_id' in publish_result:
            wall_post_id = publish_result['wall_post_id']
        
        print(" ")
        print(f"Пост ID: {wall_post_id}")
        print(f"Ссылка: https://vk.com/wall-{group_id}_{wall_post_id}")
        
    except ApiError as e:
        print(f"\nОшибка VK API {e.code}: {e.error['error_msg']}")
        if e.code == 100:
            print("Ошибка VK API: Проверьте обязательные параметры:")
        elif e.code == 3001:
            print("Ошибка VK API: Видео еще не обработано. Увеличьте время ожидания")
        elif e.code == 9:
            print("Ошибка VK API 9: Flood control. Слишком много загрузок Shorts.")
        else:
            raise  
    except Exception as e:
        print(f"\n❌ Критическая ошибка: {str(e)}")

if __name__ == "__main__":
    TOKEN = "TOKEN от vkhost - vk.сом"
    GROUP_ID = 123456789
    VIDEO_PATH = "video.mkv"

    upload_short_video(TOKEN, GROUP_ID, VIDEO_PATH)
→ Ссылка