Публикация 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)