Привет всем, выкладываю исходник-пример реализации публикации клипов в Основная проблема тех, кто пытался это сделать, не работает стандартный метод 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, чтоли
keremish, для страниц уже понял как заливать, но меня интересует как для групп можно заливать через этот скрипт. Есть такая инфа?
Для метода 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