Страницы

Поиск по вопросам

вторник, 2 октября 2018 г.

Как отправить голосовое сообщение через VK API?

Здесь про это не сказано ровным счётом ничего. В ходе "расследования" скачивал различные клиенты. Kate mobile может отправить такое сообщение, но как-то раз я увидел его "голым". Скажем так, как файл с расширением. С этого момента начал рыть документацию в этом месте и мне кажется, что message.send и docs связаны. Как бы на практике только отправить такое сообщение?
P. 's. То, что я смог отрыть :
там все засунули в документы. В полученном URL методом docs.getUploadServer добавляется один параметр, ... не скажу сейчас какой (не помню, кажется, type) равный audio_msg
Update: С помощью сниффинга трафика Kate смог отрыть, что загружается аудио-сообщение путем передачи СКРЫТОГО параметра. Пример:
https://api.vk.com/method/docs.getUploadServer?access_token=your_token&type=audio_message&v=5.38
Теперь новая стадия вопроса: Как передать файл голосовой в формате multipart/form-data
Update: Ответ с Tostera (там тоже активчик по такому вопросу):
Пытался реализовать то же самое, но на питоне, в итоге перепробовав все пришел к выводу, что камнем преткновения становится UUID который присутствует в заголовке "boundary=", а так-же передается сразу перед тем как улетит файл. Подобной дупликации нет при загрузке других документов, там UUID передается однажды. [Скриншот перехваченого пакета с официального приложения во время отправки аудиосообщения]
Кстати, если это важно - из пакета я достал формат файла: Kate: .3gp Официальный клиент: .ogg/.mp3


Ответ

Троекратное ура! Ответ найден! Итак, для того, чтобы загрузить аудио-сообщение на сервера VK, надо:
Получаем ссылку для загрузки на сервер. Обратите внимание на параметр:
type=audio_message
https://api.vk.com/method/docs.getUploadServer?access_token=your_token&type=audio_message&v=5.38 В ответ нам придет вот такой JSON
{"response":{"upload_url":"https:\/\/pu.vk.com\/c806630\/upload.php?act=add_doc&mid=151665536&aid=0&gid=0&type=audio_message&hash=a171e6bf246f389425f23a62ba4165d4&rhash=6e0e444008a2186f484af9f02c2ac49f&api=1"}} Забираем из него URL для загрузки:
https://pu.vk.com/c806630/upload.php?act=add_doc&mid=151665536&aid=0&gid=0&type=audio_message&hash=a171e6bf246f389425f23a62ba4165d4&rhash=6e0e444008a2186f484af9f02c2ac49f&api=1 Заимствуем код отсюда:
http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically
Поясню: здесь мы берем код, который поможет загрузить нам файл на сервера VK в формате multipart/form-data, который VK и требует. Возможные форматы файлов: mp3 (Использует официальный клиент), 3gp (использует Kate)
В классе MultipartFileUploader добавляем поле "file", как того требует VK:
Передайте файл на адрес upload_url, полученный в предыдущем пункте, сформировав POST-запрос с полем file. Это поле должно содержать файл в формате multipart/form-data.
multipart.addFilePart("file", uploadFile1); Выполняем запрос, ПРОФИТ! Получаем вот такой JSON в ответ:
"file":"123456|65421|0|415317|20ee43693a|jpg|81897|Document.jpg|6798bc4fe908cc476cb1c13ce844a985|105d984a920fe7ee9042681bb6d30fbd|m_20ee43693a||m:130x72,s:100x55,x:604x331,y:807x442,o:748x409" Далее сохраняем наш документ на сервере VK:
https://api.vk.com/method/docs.save?file=ЗДЕСЬ_ПОЛУЧЕННЫЙ_ПАРАМЕТР_ФАЙЛ&access_token=your_token&v=5.60
И получаем такой JSON в ответ:
"response": [{ "**id**": 440531838, "**owner_id**": 151665536, "title": "comm", "size": 467756, "ext": "ogg", "url": "https://vk.com/do...90e2afaa7&api=1", "date": 1483295228, "type": 5, "preview": { "audio_msg": { "duration": 292, "waveform": [0, 0, 0, 0, 0, 0, 1, 5, 1, 6, 0, 2, 5, 20, 10, 8, 7, 12, 24, 16, 5, 4, 8, 8, 4, 6, 2, 6, 5, 1, 9, 10, 4, 2, 7, 3, 16, 0, 6, 1, 11, 2, 7, 3, 3, 4, 3, 5, 2, 8, 2, 7, 13, 5, 8, 9, 5, 3, 2, 13, 20, 6, 7, 8, 13, 2, 13, 1, 5, 14, 1, 2, 16, 12, 10, 5, 21, 31, 15, 7, 16, 19, 19, 9, 13, 1, 4, 10, 10, 4, 2, 11, 5, 5, 2, 8, 2, 8, 1, 3, 0, 1, 5, 4, 2, 5, 3, 7, 5, 0, 3, 3, 2, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "link_ogg": "https://cs540102....udio/b70049db92.ogg", "link_mp3": "https://cs540102....udio/b70049db92.mp3" } } }]
С помощью метода messages.send отправляем наш загруженный файл в виде doc
https://api.vk.com/method/messages.send?user_id=111111&attachment=doc_&access_token=your_token&v=5.60
Данные owner_id и media_id мы получаем из предыдущего пункта
И благополучно получаем в лс аудио-сообщение. Спасибо за внимание!
P/s Кстати, версия 5.60 тоже работает (проверил), поэтому можно в запросах использовать и её.

Update: Тут возник новый вопрос - как ответить аудио-сообщением юзеру в сообщениях сообщества? Отвечаем-с...

Для группы:
Первым делом открываем доступ администраторам к документам группы ("ограниченный" режим) Потом заходим в настройки сообщества и там берем ключ сообщества Дальше делаем такой запрос на загрузку:
https://api.vk.com/method/docs.getWallUploadServer?group_id=&access_token=&v=5.60 Загружаем файл так, как я показывал выше и сохраняем таким же образом Отправляем сообщение юзеру от имени сообщества вот так:
https://api.vk.com/method/messages.send?user_id=&attachment=doc_&access_token=&v=5.60
Профит!

Для публичной страницы: Казалось бы, все так просто будет и публичной страницей, но не тут-то было. Так как для пабликов не предусмотрены голосовые сообщения и Вам будет отдавать ошибку авторизации,используем небольшой лайфхак..
Переводим наш паблик в группу и обязательно получаем новый ключ уже группы с доступом к документам и аудио Снова переводим группу в паблик В меню Управление сообществом -> Настройки -> Разделы ставим галочки на пунктах: "Ссылки" и "Аудиозаписи" Благополучно используем все, что я написал для группы

Ну и немножко веселья:
В комменты/на стену/в обсуждения (оказывается), можно отправить АУДИО-СООБЩЕНИЕ (вчитайтесь еще раз, пожалуйста). Делается весьма просто. Обычным запросом на отправку в комменты/на стену/в обсуждения. В аттаче прикрепляем наше аудио (выглядит действительно как аудио-сообщение, что вызвало вой удивления в пабликах, в которых я это тестировал) Еще одна замечательная вещь - пустые энтити аудио-сообщений. Для отправки вместо формата doc в описании attachment пишем audio И снова новый баг. Можно отправить пустое аудио (просто убираем флаг на чтение и отправляем "ничего". Было проверено на Python): Пустые комменты.... Magic!
Делается так же. При отправке коммента вместо формата doc в описании attachment пишем audio. Заметил, однако, что в разных комментариях баг выглядит по-разному. Где-то без пустого места внутри, а где-то с пустым... P/s Кстати, проверил, прокатывает и в обсуждениях. Оставил в группе vk api напоминание :)

Update: Вместо формата аттача doc или audio можно вставить почти что угодно. Хоть вики. Возможно, чем то полезно. Правда, photo не вставляется...

Update: Большие файлы загружать НЕЛЬЗЯ! Получим ошибку: 504 Gateway Time-out

Update: Техподдержка ответила: Новый ответ:

Ну и собственно, завершение спектакля

Update: Ну раз тех.поддержка говорит про закрытый AudioAPI, то почему бы его не использовать, пока не прикрыли? Накатал недавно небольшой текст по его использованию. Такой простой доступ был неожиданностью... В конце, кстати, приводятся интересные сайты, до сих пор работающие с вк.
http://telegra.ph/Работа-с-закрытым-VK-API-12-31

Комментариев нет:

Отправить комментарий