Кратко: описание способа массовой загрузки аудиозаписей из Вконтакте, с сортировкой по альбомам.
Good news, everyone. Вконтакте закрыл свободный доступ к API аудиозаписей, и теперь скрипт не работает.
История
Я слушаю музыку онлайн, для чего использую Вконтакте как музыкальный каталог, в котором можно сохранять и сортировать аудиотреки по альбомам. С помощью специальных плагинов для браузера (использую VK Audiopad), для этого даже не нужно заходить на сайт. Удобно.
Со временем, у меня накопилось больше 65-ти альбомов, в которых находятся свыше 4000 записей.
Недавно я заметил, что альбомы ВК начали «сыпаться» и из них пропадают треки: либо вообще из Моих записей (видимо, дело в лицензировании), либо просто теряют привязку к альбому. Терять коллекцию стало жалко, и я решил по-быстрому дописать свой старый скрипт-многопоточный загрузчик, которым раньше выкачивал себе аудио из ВК.
В итоге получился вполне удобный скрипт под названием VkSoundOyabun, которым я выкачал 24Гб музыки за пару часов. Скрипт можно добавить в cron, и обновлять коллекцию на жёстком диске, если вы часто добавляете и сортируете музыку в ВК по альбомам.
О скрипте
Скрипт написан на Python 3 и использует vk_api, который является обёрткой для официального VK API. Скрипт поддерживает 2 типа команд: загрузку списка альбомов со всеми треками, и скачивание самих треков на основе списка, полученного первой командой. Треки сортируются по альбомам, из названий удаляются (почти все, см. ниже) все нехорошие символы, с которыми виндовс не захочет работать на разделе в NTFS.
Параметры авторизации пользователя и список альбомов хранятся в формате INI, который я выбрал как наиболее простой и читаемый для конечного [неподготовленного] пользователя, по сравнению с XML, YAML и JSON.
Слово «оябун» в названии означает босса якудзы (википедия), потому что банзай, вот почему.
Скрипт запускается под Linux и Windows.
Использование
Подробно установка описана в README, основные моменты ниже.
Установка
- Скрипт зависит от модуля vk_api:1pip install vk_api
- Скачиваем скрипт или клонируем проект гитом:1git clone https://github.com/8kto/VkSoundOyabun.git
В полученном каталоге есть сам скрипт, файл справки README.md, а также файл конфигурации config.ini.distr, который нужно переименовать и заполнить.
Безопасность
Скрипту требуются логин и пароль пользователя, под которыми будут выполняться запросы к VK API.
Для этого заполним файл config.ini примерно следующим:
1 2 3 4 | [USER] id=12345678 pass=base64string login=myemail@example.org |
Как получить свой ID, описано в README, с логином всё понятно, а вот пароль следует указать в виде base64-строки.
![ID Вконтакте](http://old.ivlev.blog/wp-content/uploads/2016/10/vkid.png)
ID Вконтакте
Понятно, что это не хэш, и по полученной строке легко можно восстановить исходный пароль, но, по крайней мере, это предохранит от утечки данных, «подсмотренных из-за плеча» (не забудьте удалить файл после работы со скриптом). Закодировать пароль можно онлайн-сервисами, например здесь, или из командной строки (Linux):
1 2 3 4 5 6 7 | # Кодировать строку в base64 echo mypass | base64 # или python -c 'import base64; print((base64.b64encode( b"mypass")))' # Не забудьте очистить историю: history -r (или выполняйте команды с пробелом в начале строки) # Также укажем права на файл (полные права только у владельца): chmod 700 config.ini |
Кодировкой файла и base64-строки должна быть utf-8.
Готово, с полученным файлом можно приступать к работе.
Получение списка треков с сортировкой по альбомам
После получения списка всех альбомов, скрипт запрашивает список аудиозаписей отдельно для каждого альбома, при этом веб-сервис Вконтакте может пресекать слишком высокое количество обращений к API с помощью капчи.
Параметры по умолчанию подобраны так, чтобы гарантированно скачать весь список без падений, однако опции скрипта (--help
) дают простор для экспериментов.
1 2 3 | # Загрузка списка треков в файл my-albums.ini с отпимальными параметрами, # без падений скачивает список из >4к треков (>50 альбомов) ./oyabun.py parse config.ini my-albums.ini --verbose |
Скачивание файлов
Полученный с помощью предыдущей команды файл содержит всю необходимую информацию для загрузки треков.
1 2 | # Загрузка файлов в директорию ./downloads с параметрами по умолчанию ./oyabun.py download my-albums.ini ./downloads --verbose |
- По умолчанию, количество потоков на скачивание каждого альбома: 5 (опция
-t
). - Опция
-d
скроет информацию о том, какие файлы пропущены при скачивании. Полезно при повторных запусках. - Треки скачиваются без падений в несколько потоков, поэтому опции
--pause
и--each
для данной команды не реализованы.
Примечания
- У ссылок на треки есть срок годности, а также привязка по IP, так что имеет смысл периодически обновлять файл с альбомами.
- Названия треков и альбомов проходят через обработку: вырезаются все символы, которые не подходят для имён файлов на NTFS.
- После использования скрипта на почту может прийти сообщение В Ваш аккаунт выполнен вход через …, это связано с реализацией vk_api (для авторизации в ВК используется симуляция действий пользователя). Это нормальное поведение.
Как обычно, правки кода принимаются и рассматриваются (пользуйтесь гитхабом).
Установка и запуск под Windows
Подготовка окружения
- Если в системе ещё не установлен Python, скачиваем установщик 3-й версии с официального сайта.
Установка простая, не забудьте отметить опции добавления интерпретатора в переменнуюPATH
(Add Python to PATH) и установку менеджера пакетов pip.
Проверить установку можно запустив командную строку (быстрые клавишиWin+R
, cmd), и напечатав в терминале1python -h
Здесь и далее команды выполняются в терминале Windows (cmd.exe).
Если нет никаких ошибок, всё прошло успешно. Если есть, значит путь к интерпретатору вPATH
ещё не стал известен системе, и требуется перезагрузка. - Обновляем менеджер пакетов и загружаем модуль vk_api:12python -m pip install --upgrade pippython -m pip install vk_api
Если возникают ошибки, скорее всего, требуется запустить cmd.exe с правами администратора.
Запуск
- Скачайте проект с гитхаба и распакуйте архив.
В терминале перейдите в директорию скрипта:1cd /d D:\bin\VkSoundOyabun-master\ - Для корректной работы скрипта с консолью требуется установить переменные окружения, указывающие на использование кодировки UTF-8:12chcp 65001set PYTHONIOENCODING=utf-8
При некорректном выводе символов укажите использование шрифта Lucida console в конфигурации терминала (контекстное меню на заголовке). - Проверьте работу скрипта, выполнив команду1python oyabun.py --help
Если ошибок нет, то всё отлично, скрипт готов к работе.12python oyabun.py parse config.ini my-albums.ini --verbosepython oyabun.py download my-albums.ini .\downloads --verbose
Примечания
- Под виндовс не работает прерывание скрипта с помощью клавиатуры (
Ctrl+C
), подойдёт решение с командамиtasklist
иtaskkill
. - Скрипт пропускает названия с символами Юникода вроде ॐ, к которым, скорее всего, не будет доступа (хотя файл/директория будут созданы), так что стоит проверить названия альбомов на экзотические символы. Под линуксом таких проблем не возникает.
На скриншоте показан вывод в cmder, улучшенный аналог cmd для виндовс. В нём удобно делать подобные штуки:
1 2 | tasklist | grep python ; получить процессы, которые запущены питоном taskkill /pid 123 ; завершить процесс, используя PID из предыдущей команды |
Обратите внимание, как в первой строке виндовая команда работает с грепом из мира линукс.
Также cmder поддерживает удобные хоткеи, как линуксовых терминалах: очистить экран Ctrl+L
(вместо cls
), выйти из терминала Ctrl+D
(вместо exit
), и прочие, вроде подстановки аргументов Alt+.
и так далее. Ещё в cmder есть вкладки, что очень удобно.