Как отправить аудиофайл как голосовое сообщение ВКонтакте через python с примерами

В 2017 замечательный человек по имени Станислав Куделко собрал информацию о загрузке голосовых сообщений ВКонтакте, а Пётр Самохин написал об этом статью на хабре, но мне показалось, что она недостаточно понятная, поэтому сейчас я опишу весь процесс от подготовки файла к загрузке до отправки голосового сообщения в ЛС пользователю с Python.

  1. Подготовка файла к загрузке

    API ВКонтакте не позволяет загружать файлы mp3 и exe, поэтому вам придется конвертировать аудио в другой аудиоформат.

    Скриншот документации

    Скриншот документации ВКонтакте: https://vk.com/dev/upload_files_2?f=10.%2BЗагрузка%2Bдокументов

    Я использовал ogg, вы можете преобразовать файл из mp3 в ogg с помощью онлайн-конвертеров. Сохраните файл в удобной директории, в которой Python сможет прочитать его.
  2. Установите Python 3, если у вас он не установлен x
    Установите 32-битную или 64-битную версию Python 3:

    Инструкция для Windows

    Инструкция для Mac os x

    Инструкция для Linux

    Запустите терминал Python:

    Python Shell
  3. Установите библиотеку requests для Python

    В этом туториале я использую библиотеку requests. Вы можете использовать другую библиотеку, главное помнить, что нужно загрузить форму (то есть данные с заголовком Content-type, значение которого multipart/form-data) с помощью метода POST, у которой будет поле file, а в поле сам аудиофайл.

    Я также пробовал использовать http.client, но получал ошибку о слишком длинном адресе.
    Запустите терминал вашей ОС и напишите pip3 install requests

    Если у вас нет PIP, прочтите инструкцию по установке на Windows, Mac, Linux
    Прочтите инструкцию по установке, если возникнут проблемы
  4. Создайте файл скрипт и запишите туда алгоритм загрузки файла
    Создайте файл с расширением py3 и откройте его в текстовом редакторе
    В библиотеке requests форма отправляется, если указать аргумент files (пример ниже)

    response = requests.post(url, files={"file": open(file_path, 'rb')})

    url — адрес загрузки файла, его мы получим в следующем пункте

    Внутри аргумента files мы указываем dictionary с ключом file, которого требует от нас API вконтакте и значением данных аудиофайла, их мы получаем через функцию open(file_path, 'rb'). file_path — переменная, которую мы объявляем, содержащая путь до аудиофайла (например, «C:/Audio.ogg»), а 'rb' — метод открытия файла только для чтения в двоичном режиме. Подробнее об этой функции вы можете узнать здесь.

    Таким образом, в вашем файле должно быть следующее:

    import requests
    
    url = ""; # Адрес загрузки файла на сервер ВКонтакте
    url = url.replace("\/","/"); # ВКонтакте возвращает адрес с обратными слешами, их надо убрать, чтобы выполнить запрос
    file_path = "Адрес аудиофайла внутри вашего компьютера"; # Если файл находится в той же директории, что и скрипт, можно указать просто его название, например, "Audio.ogg"
    response = requests.post(url, files={"file": open(file_path, 'rb')});
    print(response.content); # Вывод ответа от сервера

    Сохраните этот файл в доступном для python месте
  5. Получение адреса для загрузки файла на сервер ВКонтакте

    Процесс получения адреса прост:
    Для начала, вам понадобится ваш ACCESS_TOKEN. Его можно получить через окно oauth.
    Если вы не хотите создавать свое приложение ВКонтакте, просто перейдите по этой ссылке, нажмите разрешить, в адресной строке появится ваш ACCESS_TOKEN: скопируйте его между
    oauth.vk.com/blank.html#access_token=
    и
    &expires_in=0&user_id
    Сохраните его в надежное место, он понадобится вам в следующих пунктах.

    Теперь в этой ссылке https://api.vk.com/method/docs.getUploadServer?access_token=ACCESS_TOKEN&type=audio_message&v=5.63 замените слово ACCESS_TOKEN на ваш токен и перейдите по ссылке в браузере. Вы получите ответ от ВКонтакте вида
    {"response":{"upload_url":"UPLOAD_URL"}}

    Вместо UPLOAD_URL у вас будет уникальный адрес загрузки. Вернитесь к файлу Python и поместите адрес внутрь переменной url
  6. Выполните скрипт с помощью терминала Python

    Вернитесь к Python shell и введите

    exec(open("Путь к скрипту", 'rb').read())

    В терминале вы получите ответ от сервера ВКонтакте вида:

    b'{"file":"123456|0|0|123456|123a4b5c|ogg|123456|filaname.ogg|12345a6b7c8d9e1f2g3h4i5j6k7l8m9n1o2p|12345a6b7c8d9e1f2g3h4i5j6k7l8m9n1o2p||||QkFTRTY0IEVYQU1QTEUgRklMRSBCQVNFNjQgRVhBTVBMRSBGSUxFIEJBU0U2NCBFWEFNUExFIEZJTEUgQkFTRTY0IEVYQU1QTEUgRklMRSA="}'

    Скопируйте и сохраните в надежном месте значение аргумента file (все что находится между b'{"file":" и "}' двойные кавычки в начале и конце строки сохранять не надо)
  7. Сохраните аудиофайл в документах пользователя

    Прежде чем использовать загруженный аудиофайл необходимо его сохранить в документах у пользователя. Он не будет виден публично в ваших документах, но будет доступен по адресу вида vk.com/doc12345_12345

    Для того, чтобы сохранить файл, надо в ссылке https://api.vk.com/method/docs.save?file=FILE_ARGUMENT&access_token=ACCESS_TOKEN&v=5.63 подставить вместо FILE_ARGUMENT значение file из прошлого пункта (без двойных кавычек в начале и в конце строки, просто вставляйте все что есть), а вместо ACCESS_TOKEN токен, полученный ранее. После этого перейдите по получившейся ссылке и получите долгожданный результат, сервер вернет ответ вида:

    {"response":[{"id":123,"owner_id":12345,"title":"filename.ogg","size":123456,"ext":"ogg","date":1604778921,"type":5,"url":"https:\/\/vk.com\/doc12345_123?hash=a1b2c3d4e5f&dl=A1B2C3D4E5F6G7:1604778921:a1b2c3d4e5f6&api=1&no_preview=1","preview":{"audio_msg":{"duration":0,"link_mp3":"...","link_ogg":"...","waveform":[0,0,0,0,0,0,0,0,0,3,3,3,16,11,13,22,18,13,18,23,15,16,27,18,20,29,17,31,27,18,21,11,4,11,3,11,3,7,4,6,4,3,10,5,12,13,10,13,8,14,7,7,10,3,9,6,3,8,6,3,6,5,3,5,2,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}}}]}

    Нужным для нас здесь является самый первый аргумент id — его мы используем для отправки сообщения с голосовым аудиофайлом
  8. Отправка ЛС

    Согласно документации на момент написания статьи важными аргументами являются peer_id, random_id, attachments.

    Если вы не хотите взаимодействовать с API вконтакте через сторонние сайты и код, можно сформировать запрос прямо через сайт.

    Перейдите на страницу https://vk.com/dev/messages.send и пролистайте вниз, к форме создания запроса (она появится только если вы предварительно вошли в аккаунт на сайте ВК). В поле peer_id вставьте ID пользователя, которму надо отправить сообщение. О том, как узнать ID пользователя, вы можете прочитать в этой статье. В поле random_id вставьте любое случайное числово значние, оно должно меняться каждый раз, когда вы отправляете новое сообщение. Число должно быть не больше 2147483647. В поле attachments нужно вставить строку следующего вида docOWNERID_MEDIAID где нужно заменить OWNERID на ваш ID (это он возвращается сервером в прошлом пункте) и MEDIAID на тот ID, который мы получили в прошлом пункте. Нажмите на кнопку выполнить и все готово!
Теги:
загрузка файлов, vkapi, python requests

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.