Как отправить аудиофайл как голосовое сообщение ВКонтакте через python с примерами
Ожидает приглашения
В 2017 замечательный человек по имени Станислав Куделко собрал информацию о загрузке голосовых сообщений ВКонтакте, а Пётр Самохин написал об этом статью на хабре, но мне показалось, что она недостаточно понятная, поэтому сейчас я опишу весь процесс от подготовки файла к загрузке до отправки голосового сообщения в ЛС пользователю с Python.
- Подготовка файла к загрузке
API ВКонтакте не позволяет загружать файлы mp3 и exe, поэтому вам придется конвертировать аудио в другой аудиоформат.
Скриншот документации ВКонтакте: https://vk.com/dev/upload_files_2?f=10.%2BЗагрузка%2Bдокументов
Я использовал ogg, вы можете преобразовать файл из mp3 в ogg с помощью онлайн-конвертеров. Сохраните файл в удобной директории, в которой Python сможет прочитать его. - Установите Python 3, если у вас он не установлен x
Установите 32-битную или 64-битную версию Python 3:
Инструкция для Windows
Инструкция для Mac os x
Инструкция для Linux
Запустите терминал Python:
- Установите библиотеку requests для Python
В этом туториале я использую библиотеку requests. Вы можете использовать другую библиотеку, главное помнить, что нужно загрузить форму (то есть данные с заголовкомContent-type
, значение которогоmultipart/form-data
) с помощью метода POST, у которой будет поле file, а в поле сам аудиофайл.
Я также пробовал использовать http.client, но получал ошибку о слишком длинном адресе.
Запустите терминал вашей ОС и напишитеpip3 install requests
Если у вас нет PIP, прочтите инструкцию по установке на Windows, Mac, Linux
Прочтите инструкцию по установке, если возникнут проблемы - Создайте файл скрипт и запишите туда алгоритм загрузки файла
Создайте файл с расширением 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 месте - Получение адреса для загрузки файла на сервер ВКонтакте
Процесс получения адреса прост:
Для начала, вам понадобится ваш 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 - Выполните скрипт с помощью терминала Python
Вернитесь к Python shell и введите
exec(open("Путь к скрипту", 'rb').read())
В терминале вы получите ответ от сервера ВКонтакте вида:
b'{"file":"123456|0|0|123456|123a4b5c|ogg|123456|filaname.ogg|12345a6b7c8d9e1f2g3h4i5j6k7l8m9n1o2p|12345a6b7c8d9e1f2g3h4i5j6k7l8m9n1o2p||||QkFTRTY0IEVYQU1QTEUgRklMRSBCQVNFNjQgRVhBTVBMRSBGSUxFIEJBU0U2NCBFWEFNUExFIEZJTEUgQkFTRTY0IEVYQU1QTEUgRklMRSA="}'
Скопируйте и сохраните в надежном месте значение аргумента file (все что находится междуb'{"file":"
и"}'
двойные кавычки в начале и конце строки сохранять не надо) - Сохраните аудиофайл в документах пользователя
Прежде чем использовать загруженный аудиофайл необходимо его сохранить в документах у пользователя. Он не будет виден публично в ваших документах, но будет доступен по адресу вида 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
— его мы используем для отправки сообщения с голосовым аудиофайлом - Отправка ЛС
Согласно документации на момент написания статьи важными аргументами являются 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, который мы получили в прошлом пункте. Нажмите на кнопку выполнить и все готово!