Как отправить аудиофайл как голосовое сообщение ВКонтакте через 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, который мы получили в прошлом пункте. Нажмите на кнопку выполнить и все готово!
Tags:
загрузка файлов, vkapi, python requests

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.