Страницы

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

понедельник, 25 ноября 2019 г.

Как отправить голосовое сообщение через 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
    


Ответы

Ответ 1



Троекратное ура! Ответ найден! Итак, для того, чтобы загрузить аудио-сообщение на сервера 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

Ответ 2



Всем привет! API обновилось и изменились некоторые моменты. Во-первых загрузка mp3 в документы теперь запрещена. Это выглядит как ответ такой: { error: 'unknown error' } Во вторых, в адресе для отправки от имени группы пропущены символы: https://api.vk.com/method/docs.getWallUploadServer?group_id=&access_token=&v=5.62 И, наконец, третья проблема. Все сделал, все работает, но как результат - сам файл, а не голосовое сообщение (я его грузил как .ogg или .opus). Прошу вашей помощи!

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

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