Привет всем, выкладываю исходник-пример реализации публикации клипов в Основная проблема тех, кто пытался это сделать, не работает стандартный метод files из коробки в библиотеке requests. Это косяк их сервера, так как через html форму клип заливается на ура. Пример html формы для публикации клипа: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Публикация клипа</title> </head> <body> <!-- В action подставляем ссылку полученную с запроса https://api.vk.com/method/shortVideo.create --> <form action="https://ovu.mycdn.me/upload.do?\..." method="post" enctype="multipart/form-data"> <input type="file" name="data" value="video.mp4"> <button>Загрузить клип!</button> </form> </body> </html> HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Публикация клипа</title> </head> <body> <!-- В action подставляем ссылку полученную с запроса https://api.vk.com/method/shortVideo.create --> <form action="https://ovu.mycdn.me/upload.do?\..." method="post" enctype="multipart/form-data"> <input type="file" name="data" value="video.mp4"> <button>Загрузить клип!</button> </form> </body> </html> На помощь к нам идёт сторонняя библиотека для requests - requests_toolbelt. С помощью данной библиотеки можно представить html код выше в виде запроса! Для данного скрипта необходимы python 3.6+ и установить через pip requests, requests_toolbelt Код: import requests from os.path import getsize import random import string from requests_toolbelt import MultipartEncoder filename = "video.mp4" # путь к видео, которое надо загрузить token = "123foo" # токен от ВК страницы description = "Не судите строго, мой первый тестовый клип #хештег1 #хештег_хештегич ..." # описание клипа с хештегами if __name__ == '__main__': r = requests.post("https://api.vk.com/method/shortVideo.create", data=dict(v=5.132, wallpost=0, description=description, file_size=getsize(filename), access_token=token)) upload_url = r.json()["response"]["upload_url"] # подготовка multipart запроса fields = { 'file': ('untitiled.mp4', open(filename, "rb"), "video/mp4"), } boundary = '----WebKitFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) m = MultipartEncoder(fields=fields, boundary=boundary) r = requests.post(upload_url, data=m, headers={"user-agent": "vk-test-clip-upload 1", "Content-Type": m.content_type}) print(r.status_code, r.text) # если вернёт статус 200 и <retval>1</retval> значит клип залит! Код import requests from os.path import getsize import random import string from requests_toolbelt import MultipartEncoder filename = "video.mp4" # путь к видео, которое надо загрузить token = "123foo" # токен от ВК страницы description = "Не судите строго, мой первый тестовый клип #хештег1 #хештег_хештегич ..." # описание клипа с хештегами if __name__ == '__main__': r = requests.post("https://api.vk.com/method/shortVideo.create", data=dict(v=5.132, wallpost=0, description=description, file_size=getsize(filename), access_token=token)) upload_url = r.json()["response"]["upload_url"] # подготовка multipart запроса fields = { 'file': ('untitiled.mp4', open(filename, "rb"), "video/mp4"), } boundary = '----WebKitFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16)) m = MultipartEncoder(fields=fields, boundary=boundary) r = requests.post(upload_url, data=m, headers={"user-agent": "vk-test-clip-upload 1", "Content-Type": m.content_type}) print(r.status_code, r.text) # если вернёт статус 200 и <retval>1</retval> значит клип залит! Ура! Клип залит успешно и его можно смотреть! Бонус темы - накрутка просмотров на клип через API: from time import time, sleep import requests def code_payload(video_id) -> str: """подготовка vkscript кода просмотра клипа для метода execute""" return f"""var s = API.stats.trackEvents({{events:"[ {{\\"e\\":\\"video_play\\",\\"source\\":\\"clips\\",\\"network_type\\":\\"wi-fi\\",\\"ts\\":{round(time())}, \\"ref\\":\\"clips\\", \\"player_type\\":\\"fullscreen\\",\\"position\\":\\"start\\",\\"video_id\\":\\"{video_id}\\", \\"autoplay\\":\\"1\\"}}]"}}); return s;""".strip() if __name__ == '__main__': token = "" # ВК токен clip_id = "0_456239014" # id клипа куда нужно просмотры накрутить code = code_payload(clip_id) # максимальное число просмотров с одного аккаунта - 20. Задержка должна быть 0.5-2 секунды for i in range(20): requests.post("https://api.vk.com/method/execute", data=dict(code=code, v="5.132", access_token=token)) sleep(0.5) Код from time import time, sleep import requests def code_payload(video_id) -> str: """подготовка vkscript кода просмотра клипа для метода execute""" return f"""var s = API.stats.trackEvents({{events:"[ {{\\"e\\":\\"video_play\\",\\"source\\":\\"clips\\",\\"network_type\\":\\"wi-fi\\",\\"ts\\":{round(time())}, \\"ref\\":\\"clips\\", \\"player_type\\":\\"fullscreen\\",\\"position\\":\\"start\\",\\"video_id\\":\\"{video_id}\\", \\"autoplay\\":\\"1\\"}}]"}}); return s;""".strip() if __name__ == '__main__': token = "" # ВК токен clip_id = "0_456239014" # id клипа куда нужно просмотры накрутить code = code_payload(clip_id) # максимальное число просмотров с одного аккаунта - 20. Задержка должна быть 0.5-2 секунды for i in range(20): requests.post("https://api.vk.com/method/execute", data=dict(code=code, v="5.132", access_token=token)) sleep(0.5) PS: requests в данном примере использован для наглядности, данное решение можно легко адаптировать под сторонние библиотеки по типу vk_api Видео для клипов находить и заимствовать через те же запросы дело простое, а чтобы их выбить в тренды необходимо раскрутка, просто так не мечтайте покорить tiktok с Колей Басковым и Даней Милохиным их не будут находить!
Почему то на стену добавляется, а в клипах пусто.. Уже приложение вк отснифал, сделал по таким же запросам, все равно только на стене. Никто не сталкивался с таким? Может еще какой запрос я упустил
vypivshiy, С этим параметром разобрался. Дело в том, что у меня только на стену добавляется клип если wallpost=1, а в раздел мои клип не попадает. Если wallpost=0, то загрузка проходит тоже успешно, но клипа вообще нигде не найти
Использовал старый access_token, получилось. С новым не получается. Пишет `Unknown method passed`. Скорее всего, при генерации access_token есть недостающий scope, чтоли
reads, я уже не помню как делал, но там что-то связано с новой версией API. Поищи в ней метод этот и через него можно заливать
Для метода shortVideo.create необходим токен с правами что-то вроде "shortVideo". Получить его можно либо из браузерной сессии. Как получить иначе не смог найти :( Как получить токен с нужными правами через oauth authorize? Работающие параметры следующие. В том числе для публикации в группе. {'v': 5.132, 'file_size': 16384, 'group_id': GROUP_ID, 'access_token': TOKEN}
С таким кодом получилось. Токен получал на vkhost.github.io для vk.com import asyncio import vk_api import aiohttp from os.path import getsize filename = "video.mp4" token = "" description = "Test description" vk_session = vk_api.VkApi(token=token) vk = vk_session.get_api() async def main(): a = vk.shortVideo.create(wallpost=1, file_size=getsize(filename)) upload_url = a["upload_url"] data = {"file": open("video.mp4", "rb")} async with aiohttp.ClientSession() as session: async with session.post( upload_url, data=data, ) as res: print(res.status, await res.text()) if __name__ == "__main__": asyncio.run(main()) Python import asyncio import vk_api import aiohttp from os.path import getsize filename = "video.mp4" token = "" description = "Test description" vk_session = vk_api.VkApi(token=token) vk = vk_session.get_api() async def main(): a = vk.shortVideo.create(wallpost=1, file_size=getsize(filename)) upload_url = a["upload_url"] data = {"file": open("video.mp4", "rb")} async with aiohttp.ClientSession() as session: async with session.post( upload_url, data=data, ) as res: print(res.status, await res.text()) if __name__ == "__main__": asyncio.run(main()) Возвращает 200, правда клипа нигде нет --- Сообщение объединено с предыдущим 29 июн 2023 UPD: Решил. Токен от VK ME берите https://oauth.vk.com/token?grant_type=password&client_id=6146827&client_secret=qVxWRF1CwHERuIrKBnqe&username= ЛОГИН &password= ПАРОЛЬ &v=5.131&2fa_supported=1