Всем, кто работал с VK API, давно известно, что доступ к любой работе с аудиозаписями ВКонтакте был закрыт 16 декабря 2016 года, а информация о голосовых сообщениях вообще отсутствует в документации.
На примере моего пустого сообщества-песочницы
Так как же это делается?
Используем скрытые параметры для загрузки документа
Предварительно необходимо обратить внимание на один очень важный момент: чтобы отправить голосовое сообщение от имени группы или публичной страницы, загружать его придется все равно с токеном пользователя, но прикреплять этот документ потом можно и при отправке сообществами, уже с их токеном.
Как и для обычного документа, получаем адрес сервера для загрузки:
https://api.vk.com/method/docs.getUploadServer?access_token=ACCESS_TOKEN&type=audio_message&v=5.63
Основной момент здесь: параметр type=audio_message.
В ответ мы должны получить следующий JSON:
{
"response":
{
"upload_url":"https://..."
}
}
Как правильно загрузить файл на сервер ВКонтакте
Если отправлять файл не в формате multipart/form-data, ничего не выйдет.
В формате mp3 загрузить аудио тоже не получится, лучше всего использовать ogg, хотя можно и поэкспериментировать.
Можно использовать код отсюда, чтобы загрузить файл в нужном формате (пример указан на Java, аналоги для себя, я думаю, можно найти в интернете):
Используем экземпляр класса MultipartUtility, в нём ничего менять не нужно:
StringBuilder response_sb = new StringBuilder();
try {
MultipartUtility multipart = new MultipartUtility("адрес_сервера_для_загрузки", "UTF-8");
multipart.addFilePart("путь_до_файла_с_голосовым_сообщением");
List<String> response = multipart.finish();
for (String line : response) {
response_sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Всё, аудиосообщение загружено. Ответ от сервера в случае удачи будет похожим на это:
{
"file":"62802565|0|0|805131|многосимволов|ogg|9943|file.ogg|многосимволов|многосимволов||||многосимволов="
}
Сохраняем документ на сервере
Здесь также важно подметить: если вы сохраните документ не у пользователя, то при отправке он будет выглядеть как документ, а не как голосовое сообщение. Либо же вы отправите просто пустое сообщение.
Делаем следующий запрос:
https://api.vk.com/method/docs.save?file=полученный_ранее_file&access_token=ACCESS_TOKEN&v=5.63
Это была последняя стадия. Получаем ответ:
{
"response": [
{
"id": 000000000,
"owner_id": 000000000
... и ещё куча параметров, которые нам сейчас не нужны
}
]
}
Вот и всё. Можно отправлять сообщения обычным способом, в attachments указав ссылку doc(owner_id)_(id), используя owner_id и id, полученные выше.
P.S. Обычный пользователь не может отправить сообщение, содержащее что-то кроме записи голоса. А через API это делается очень легко. Раньше это работало и в комментариях/обсуждениях и так далее, но сейчас, видимо, лавочку прикрыли, как и загрузку голосовых сообщений сообществами.
Я не являюсь автором «расследования» по поиску способа отправки аудиосообщений через API, я лишь собрал всю информацию в кучу и постарался красиво оформить. Заметил на просторах интернета много вопросов по этому поводу.
Данная статья написана для тех, кто работал с ВКонтакте API, и описывать неинтересные вещи я не стал, стараясь писать лишь по делу. Если решусь, напишу еще пару статеек о том, как написать бота на Java с использованием LongPoll-сервера VK (для личных страниц) и с использованием Callback API и web-сервлетов (для сообществ).
За предоставленные материалы и помощь благодарность Станиславу Куделко.
Автор: PeterSamokhin