Отправка голосовых сообщений ВКонтакте с помощью VK API +18
Всем, кто работал с VK API, давно известно, что доступ к любой работе с аудиозаписями ВКонтакте был закрыт 16 декабря 2016 года, а информация о голосовых сообщениях вообще отсутствует в документации.
На примере моего пустого сообщества-песочницы
Так как же это делается?
Предварительно необходимо обратить внимание на один очень важный момент: чтобы отправить голосовое сообщение от имени группы или публичной страницы, загружать его придется все равно с токеном пользователя, но прикреплять этот документ потом можно и при отправке сообществами, уже с их токеном.
Как и для обычного документа, получаем адрес сервера для загрузки:
Основной момент здесь: параметр type=audio_message.
В ответ мы должны получить следующий JSON:
Если отправлять файл не в формате multipart/form-data, ничего не выйдет.
В формате mp3 загрузить аудио тоже не получится, лучше всего использовать ogg, хотя можно и поэкспериментировать.
Можно использовать код отсюда, чтобы загрузить файл в нужном формате (пример указан на Java, аналоги для себя, я думаю, можно найти в интернете):
Используем экземпляр класса MultipartUtility, в нём ничего менять не нужно:
Всё, аудиосообщение загружено. Ответ от сервера в случае удачи будет похожим на это:
Здесь также важно подметить: если вы сохраните документ не у пользователя, то при отправке он будет выглядеть как документ, а не как голосовое сообщение. Либо же вы отправите просто пустое сообщение.
Делаем следующий запрос:
Это была последняя стадия. Получаем ответ:
Вот и всё. Можно отправлять сообщения обычным способом, в attachments указав ссылку doc(owner_id)_(id), используя owner_id и id, полученные выше.
P.S. Обычный пользователь не может отправить сообщение, содержащее что-то кроме записи голоса. А через API это делается очень легко. Раньше это работало и в комментариях/обсуждениях и так далее, но сейчас, видимо, лавочку прикрыли, как и загрузку (но не отправку!) голосовых сообщений сообществами.
Я не являюсь автором «расследования» по поиску способа отправки аудиосообщений через API, я лишь собрал всю информацию в кучу и постарался красиво оформить. Заметил на просторах интернета много вопросов по этому поводу.
Данная статья написана для тех, кто работал с ВКонтакте API, и описывать неинтересные вещи я не стал, стараясь писать лишь по делу. Если решусь, напишу еще пару статеек о том, как написать бота на Java с использованием LongPoll-сервера VK (для личных страниц) и с использованием Callback API и web-сервлетов (для сообществ).
За предоставленные материалы и помощь благодарность Станиславу Куделко.
На примере моего пустого сообщества-песочницы
Так как же это делается?
Используем скрытые параметры для загрузки документа
Предварительно необходимо обратить внимание на один очень важный момент: чтобы отправить голосовое сообщение от имени группы или публичной страницы, загружать его придется все равно с токеном пользователя, но прикреплять этот документ потом можно и при отправке сообществами, уже с их токеном.
Как и для обычного документа, получаем адрес сервера для загрузки:
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-сервлетов (для сообществ).
За предоставленные материалы и помощь благодарность Станиславу Куделко.
Поделиться с друзьями
Комментарии (6)
XRain
25.04.2017 11:22Это уже пофиксили, и теперь можно от имени сообщества грузить и отправлять аудиосообщение. Если слишком часто от имени пользователя загружать, то можно капчу словить. Да и mp3 наравне с ogg нормально грузится.
Ockonal
Для каких целей это может быть полезно?
PeterSamokhin
Ockonal видел краткие и, возможно, не очень полезные для начинающих разработчиков статьи по этой теме, а также увидел, что людям это интересно. Здесь же недавно тоже была статья про ботов на python и я подумал, что, возможно, подобного рода статьи заинтересуют кого-то, и хотел подробно написать от А до Я, как это сделать, и прикрепить готовый вариант. И всё же: зачем? Думаю, с той же целью, зачем написал и эту статью: донести информацию, о которой в интернете встречал немало вопросов, возможно она кому-то покажется интересной.
jasonOk
Статься хорошая, но всё это (практически) уже было написано здесь
Ещё и так же на Java.
PeterSamokhin
jasonOk это и писал Станислав Куделко, указанный в статье.