Skip to content

Instantly share code, notes, and snippets.

@fizvlad
Forked from abler98/vk-audio-downloader.js
Last active December 27, 2022 16:09
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save fizvlad/4c2eb98b5fb12a6a975d27b0bfcd9fcf to your computer and use it in GitHub Desktop.
Save fizvlad/4c2eb98b5fb12a6a975d27b0bfcd9fcf to your computer and use it in GitHub Desktop.
<UPD> Нерабочий </UPD> Скрипт для скачивания музыки VK
/*
Инструкция по использованию:
- Заходим в раздел с аудиозаписями
- Листаем в самый низ (Чтобы прогрузились все аудиозаписи) (Можно зажать клавишу 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);
@fizvlad
Copy link
Author

fizvlad commented Apr 22, 2018

22.04.2018
Working fine

@fizvlad
Copy link
Author

fizvlad commented Apr 26, 2018

Добавлена возможность скачивать N последних записей

@egoarka
Copy link

egoarka commented May 15, 2018

гуд, помог
а кому лень качать все, то просто включаем желаемый трек -> f12 -> getAudioPlayer()._impl._currentAudioEl.src

@fizvlad
Copy link
Author

fizvlad commented May 16, 2018

16.05.2018
fix

@yangirekun
Copy link

yangirekun commented May 23, 2018

Было интересно, спасибо. Пытаясь родить аналог, как - то не додумался заюзать ими же написанный метод для получения ссылки на проигрываемый трек. Я так понимаю, это часть API, которую они скрыли?))
__
В девтулзах хрома можно отловить запросы, в заголовках коих есть эти самые ссылки. Собственно от этого и отталкивался, правда то, что получилось сделать ручками, автоматизировать не удалось. Может кто - нибудь знает, в js вообще предусмотрены методы для получения инфы о нетворке?

@fizvlad
Copy link
Author

fizvlad commented May 27, 2018

@yangirekun

часть API, которую они скрыли

Ага. API, которое использует страница с аудиозаписями

в js вообще предусмотрены методы для получения инфы о нетворке?

Можно попробовать подменить request-функцию. Как-то так:

XMLHttpRequest_ = XMLHttpRequest;
XMLHttpRequest = function(){var re = new XMLHttpRequest_(); console.log(re); return re};

Оттуда уже можно пробовать достать ссылку

@fizvlad
Copy link
Author

fizvlad commented May 31, 2018

31.05.18 .trim() названия и исполнителя

@fizvlad
Copy link
Author

fizvlad commented Jun 18, 2018

18.06.18 Теперь, если открыт какой-либо плейлист, аудиозаписи будут скачиваться из него

@fizvlad
Copy link
Author

fizvlad commented Jul 19, 2018

@gangbanghoe вряд ли есть такая возможность

@artslob
Copy link

artslob commented Aug 18, 2018

Я бы поправил опечатки: в названии переменных VK_DOWLOADER_DOWNLOAD_LATEST и VK_DOWLOADER_PLAYER_TIMEOUT не хватает 'N'

@fizvlad
Copy link
Author

fizvlad commented Aug 23, 2018

@artslob спасибо!

Copy link

ghost commented Sep 10, 2018

Эпичный говнокод.

@fizvlad
Copy link
Author

fizvlad commented Sep 10, 2018

@jadigar :(
Ты ведь понимаешь, что твой комментарий бессмыслен без какого-либо конкретного замечания?

@Vasilesk
Copy link

@jadigar чем же говнокод, если не считать мелкие косяки уровня подряд идущих jQuery(audios[i])?
Код читаемый и понятный, задачу свою выполняет, кастомизируется тоже легко

@JUSSKiE
Copy link

JUSSKiE commented Sep 26, 2018

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?

@fizvlad
Copy link
Author

fizvlad commented Sep 26, 2018

@JUSSKiE That would be great :)

@panikajo
Copy link

panikajo commented Sep 26, 2018

@fizvlad
Сделайте пожалуйста при вставке кода, кнопки скачать Альбом или возле каждой аудио записи скачать по кнопке.

@JUSSKiE
Copy link

JUSSKiE commented Sep 27, 2018

@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...

@JUSSKiE
Copy link

JUSSKiE commented Sep 27, 2018

For anyone that cares, this script is working for me now: https://greasyfork.org/en/scripts/38614-vk-media-downloader

@fizvlad
Copy link
Author

fizvlad commented Sep 28, 2018

@JUSSKiE I am familiar with TamperMonkey, so I can try to creat some GUI

@JUSSKiE
Copy link

JUSSKiE commented Sep 28, 2018

@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.

@artslob
Copy link

artslob commented Oct 9, 2018

@fizvlad
Copy link
Author

fizvlad commented Nov 10, 2018

10.11.18 Пофикшен баг, из-за которого скачивались аудиозаписи внутри выпадающего списка уведомлений

@elnurxf
Copy link

elnurxf commented Jan 8, 2019

Есть для этих целей репозиторий на PHP для скачивания с vk.com тут https://github.com/elnurxf/vk.audio

@fizvlad
Copy link
Author

fizvlad commented Mar 23, 2019

Хитрый ВК поменял работу getAudioPlayer()._impl._currentAudioEl.src, поэтому скрипт пока мёртв :[

@TheWhatis
Copy link

TheWhatis commented Feb 22, 2021

У кого ошибки типа:
"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...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment