-
-
Save fizvlad/4c2eb98b5fb12a6a975d27b0bfcd9fcf to your computer and use it in GitHub Desktop.
/* | |
Инструкция по использованию: | |
- Заходим в раздел с аудиозаписями | |
- Листаем в самый низ (Чтобы прогрузились все аудиозаписи) (Можно зажать клавишу PageDown) | |
- Открываем консоль браузера (F12 -> Консоль) | |
- Вставляем код и нажимаем Enter | |
- Скачивание началось... | |
- Браузер может потребовать разрешение на сохранение файлов, необходимо подтвердить действие | |
- Оставляем браузер на время прямо пропорциональное количеству аудиозаписей :) | |
Важно! С открытой вкладкой ничего не делаем! | |
*/ | |
// ----------------------------------------------------------------------------- | |
// Подключение jQuery и download.js | |
// ----------------------------------------------------------------------------- | |
if (typeof vk_downloader_dependencies == "undefined") { | |
let vk_downloader_dependencies = ["https://code.jquery.com/jquery-3.2.1.min.js", "https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.7/download.min.js"]; | |
for (let i = 0; i < vk_downloader_dependencies.length; i++) { | |
let script = document.createElement('script'); | |
script.src = vk_downloader_dependencies[i]; | |
document.getElementsByTagName('head')[0].appendChild(script); | |
} | |
} | |
// ----------------------------------------------------------------------------- | |
// Настройки | |
// ----------------------------------------------------------------------------- | |
var VK_DOWNLOADER_DOWNLOAD_LATEST = 0; // Если потребуется загрузить только N последних аудиозаписей, укажите N. Иначе укажите 0 | |
var VK_DOWNLOADER_START_TIMEOUT = 2000; // Промежуток времени, отведённый на подгрузку скриптов (мс) | |
var VK_DOWNLOADER_TRIGGER_INTERVAL = 500; // Интервал между переходами по аудиозаписям (мс) | |
var VK_DOWNLOADER_PLAYER_TIMEOUT = 800; // Время работы плеера ВК (мс) | |
// ----------------------------------------------------------------------------- | |
// Вспомогательные функции | |
// ----------------------------------------------------------------------------- | |
// Проверка на наличие окна с плейлистом | |
function if_playlist() { | |
return $(".ap_layer_wrap").css("display") == "block"; | |
} | |
// Вызов скрипта ВК и получение ссылки на скачивание | |
function vk_downloader_get_links(audios, handler, callback) { | |
let i = 0; | |
let interval = setInterval(function() { | |
if (i >= audios.length || (VK_DOWNLOADER_DOWNLOAD_LATEST != 0 && i >= VK_DOWNLOADER_DOWNLOAD_LATEST)) { | |
if (typeof callback == "function") { | |
callback(); | |
} | |
clearInterval(interval); | |
return; | |
} | |
let newEvent = new Event("click"); | |
audios[i].dispatchEvent(newEvent); | |
getAudioPlayer().toggleAudio(audios[i], newEvent); | |
setTimeout(function() { | |
let performer = jQuery(audios[i]).find(".audio_row__performers").text().trim(); | |
let title = jQuery(audios[i]).find(".audio_row__title_inner").text().trim(); | |
let url = getAudioPlayer()._impl._currentAudioEl.src; | |
console.log("Downloading: " + performer + " - " + title); | |
handler(url, performer, title); | |
i++; | |
}, VK_DOWNLOADER_PLAYER_TIMEOUT); | |
}, VK_DOWNLOADER_TRIGGER_INTERVAL + VK_DOWNLOADER_PLAYER_TIMEOUT); | |
} | |
// Скачать отдельный файл | |
function vk_downloader_download_file(url, name, type, callback) { | |
let xhr = new XMLHttpRequest(); | |
xhr.open("GET", url, true); | |
xhr.responseType = "blob"; | |
xhr.onload = function() { | |
download(xhr.response, name + ".mp3", type); | |
if (typeof callback == "function") { | |
callback(); | |
} | |
}; | |
/* | |
// Отображение прогресса | |
xhr.onprogress = function (e) { | |
let progress = e.loaded * 100 / e.total; | |
console.log( name, Math.round(progress, 2) + "%" ); | |
}; | |
*/ | |
xhr.send(); | |
} | |
// Скачать вcе аудиозаписи | |
function vk_downloader_download_all_audio() { | |
let elems; | |
if (if_playlist()) { | |
console.log("Загружаем аудиозаписи из открытого плейлиста"); | |
elems = jQuery(".ap_layer_wrap .audio_row_content"); | |
} else { | |
elems = jQuery(".audio_page__audio_rows .audio_row_content"); | |
} | |
if (elems.length == 0) { | |
console.log("Нет аудиозаписей!"); | |
return; | |
} | |
console.log("Найдено аудиозаписей: ", elems.length); | |
if (VK_DOWNLOADER_DOWNLOAD_LATEST) { | |
console.log("Загружаем лишь " + VK_DOWNLOADER_DOWNLOAD_LATEST + " последних записей"); | |
if (VK_DOWNLOADER_DOWNLOAD_LATEST > elems.length) { | |
console.log("Ошибка: Не все аудиозаписи могут быть загружены! Обновите страницу, опуститесь до дна списка и повторите снова"); | |
return; | |
} | |
} | |
console.log( | |
"Ожидаемое время загрузки: " + | |
Math.round(((VK_DOWNLOADER_DOWNLOAD_LATEST != 0 ? VK_DOWNLOADER_DOWNLOAD_LATEST : elems.length) * (VK_DOWNLOADER_TRIGGER_INTERVAL + VK_DOWNLOADER_PLAYER_TIMEOUT)) / (1000)) + | |
" секунд"); | |
vk_downloader_get_links(elems, | |
function(url, performer, title) { | |
let name = performer + " - " + title; | |
vk_downloader_download_file(url, name, "audio/mp3"); | |
}, | |
function() { | |
console.log("Все аудиозаписи скачаны!"); | |
}); | |
} | |
// ----------------------------------------------------------------------------- | |
// Main | |
// ----------------------------------------------------------------------------- | |
setTimeout(vk_downloader_download_all_audio, VK_DOWNLOADER_START_TIMEOUT); |
часть API, которую они скрыли
Ага. API, которое использует страница с аудиозаписями
в js вообще предусмотрены методы для получения инфы о нетворке?
Можно попробовать подменить request-функцию. Как-то так:
XMLHttpRequest_ = XMLHttpRequest;
XMLHttpRequest = function(){var re = new XMLHttpRequest_(); console.log(re); return re};
Оттуда уже можно пробовать достать ссылку
31.05.18 .trim() названия и исполнителя
18.06.18 Теперь, если открыт какой-либо плейлист, аудиозаписи будут скачиваться из него
@gangbanghoe вряд ли есть такая возможность
Я бы поправил опечатки: в названии переменных VK_DOWLOADER_DOWNLOAD_LATEST и VK_DOWLOADER_PLAYER_TIMEOUT не хватает 'N'
@artslob спасибо!
Эпичный говнокод.
@jadigar :(
Ты ведь понимаешь, что твой комментарий бессмыслен без какого-либо конкретного замечания?
@jadigar чем же говнокод, если не считать мелкие косяки уровня подряд идущих jQuery(audios[i])?
Код читаемый и понятный, задачу свою выполняет, кастомизируется тоже легко
This is currently the only code working to download audio from VK, it's great! Do you mind if I get a greasyfork extension created from this?
@JUSSKiE That would be great :)
@fizvlad
Сделайте пожалуйста при вставке кода, кнопки скачать Альбом или возле каждой аудио записи скачать по кнопке.
@fizvlad
I'm not a programmer, do you have any plans to make a greasyfork script? I've tried but I just don't have the skills :) I am looking at paying someone to do it on fiverr.com...
For anyone that cares, this script is working for me now: https://greasyfork.org/en/scripts/38614-vk-media-downloader
@JUSSKiE I am familiar with TamperMonkey, so I can try to creat some GUI
@fizvlad
Go for it! I'm sure loads of people would really appreciate it (including me!). Let me know your script URL when you've created it.
10.11.18 Пофикшен баг, из-за которого скачивались аудиозаписи внутри выпадающего списка уведомлений
Есть для этих целей репозиторий на PHP для скачивания с vk.com тут https://github.com/elnurxf/vk.audio
Хитрый ВК поменял работу getAudioPlayer()._impl._currentAudioEl.src
, поэтому скрипт пока мёртв :[
У кого ошибки типа:
"Content Security Policy: Параметры страницы заблокировали загрузку ресурса https:// code.jquery.com/jquery-3.2.1.min.js («script-src»)."
Или
"Content Security Policy: Параметры страницы заблокировали загрузку ресурса https:// cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.7/download.min.js («script-src»)."
Я немного переделал код, вот ссылка - https://gist.github.com/Whatisone/0f8acc4cad4f4e5fe95d54e5fc454472
P.S. Я, к слову, не понимаю какой смысл был подключать JQuery на пару строчек с селекторами? Зачем? Я за 5 минут нормально все переделал на чистый js...
Было интересно, спасибо. Пытаясь родить аналог, как - то не додумался заюзать ими же написанный метод для получения ссылки на проигрываемый трек. Я так понимаю, это часть API, которую они скрыли?))
__
В девтулзах хрома можно отловить запросы, в заголовках коих есть эти самые ссылки. Собственно от этого и отталкивался, правда то, что получилось сделать ручками, автоматизировать не удалось. Может кто - нибудь знает, в js вообще предусмотрены методы для получения инфы о нетворке?