Здесь про это не сказано ровным счётом ничего. В ходе "расследования" скачивал различны
клиенты. 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). Прошу вашей помощи!
Комментариев нет:
Отправить комментарий