Python: загрузка альбомов ВКонтакте

Кратко: описание способа массовой загрузки аудиозаписей из Вконтакте, с сортировкой по альбомам.

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, основные моменты ниже.

Установка

  1. Скрипт зависит от модуля vk_api:
  2. Скачиваем скрипт или клонируем проект гитом:

В полученном каталоге есть сам скрипт, файл справки README.md, а также файл конфигурации config.ini.distr, который нужно переименовать и заполнить.

Безопасность

Скрипту требуются логин и пароль пользователя, под которыми будут выполняться запросы к VK API.
Для этого заполним файл config.ini примерно следующим:

Как получить свой ID, описано в README, с логином всё понятно, а вот пароль следует указать в виде base64-строки.

ID Вконтакте

ID Вконтакте

Понятно, что это не хэш, и по полученной строке легко можно восстановить исходный пароль, но, по крайней мере, это предохранит от утечки данных, «подсмотренных из-за плеча» (не забудьте удалить файл после работы со скриптом). Закодировать пароль можно онлайн-сервисами, например здесь, или из командной строки (Linux):

Кодировкой файла и base64-строки должна быть utf-8.
Готово, с полученным файлом можно приступать к работе.

Получение списка треков с сортировкой по альбомам

После получения списка всех альбомов, скрипт запрашивает список аудиозаписей отдельно для каждого альбома, при этом веб-сервис Вконтакте может пресекать слишком высокое количество обращений к API с помощью капчи.
Параметры по умолчанию подобраны так, чтобы гарантированно скачать весь список без падений, однако опции скрипта (--help) дают простор для экспериментов.

Скачивание файлов

Полученный с помощью предыдущей команды файл содержит всю необходимую информацию для загрузки треков.

  • По умолчанию, количество потоков на скачивание каждого альбома: 5 (опция -t).
  • Опция -d скроет информацию о том, какие файлы пропущены при скачивании. Полезно при повторных запусках.
  • Треки скачиваются без падений в несколько потоков, поэтому опции --pause и --each для данной команды не реализованы.

Примечания

  • У ссылок на треки есть срок годности, а также привязка по IP, так что имеет смысл периодически обновлять файл с альбомами.
  • Названия треков и альбомов проходят через обработку: вырезаются все символы, которые не подходят для имён файлов на NTFS.
  • После использования скрипта на почту может прийти сообщение В Ваш аккаунт выполнен вход через …, это связано с реализацией vk_api (для авторизации в ВК используется симуляция действий пользователя). Это нормальное поведение.

Как обычно, правки кода принимаются и рассматриваются (пользуйтесь гитхабом).

Установка и запуск под Windows

Подготовка окружения

  1. Если в системе ещё не установлен Python, скачиваем установщик 3-й версии с официального сайта.
    Установка простая, не забудьте отметить опции добавления интерпретатора в переменную PATH (Add Python to PATH) и установку менеджера пакетов pip.
    Проверить установку можно запустив командную строку (быстрые клавиши Win+R, cmd), и напечатав в терминале

    Здесь и далее команды выполняются в терминале Windows (cmd.exe).
    Если нет никаких ошибок, всё прошло успешно. Если есть, значит путь к интерпретатору в PATH ещё не стал известен системе, и требуется перезагрузка.
  2. Обновляем менеджер пакетов и загружаем модуль vk_api:

    Если возникают ошибки, скорее всего, требуется запустить cmd.exe с правами администратора.

Запуск

  1. Скачайте проект с гитхаба и распакуйте архив.
    В терминале перейдите в директорию скрипта:
  2. Для корректной работы скрипта с консолью требуется установить переменные окружения, указывающие на использование кодировки UTF-8:

    При некорректном выводе символов укажите использование шрифта Lucida console в конфигурации терминала (контекстное меню на заголовке).
  3. Проверьте работу скрипта, выполнив команду

    Если ошибок нет, то всё отлично, скрипт готов к работе.
Вывод скрипта в консоль cmder

Вывод скрипта в консоль cmder

Примечания

  • Под виндовс не работает прерывание скрипта с помощью клавиатуры (Ctrl+C), подойдёт решение с командами tasklist и taskkill.
  • Скрипт пропускает названия с символами Юникода вроде ॐ, к которым, скорее всего, не будет доступа (хотя файл/директория будут созданы), так что стоит проверить названия альбомов на экзотические символы. Под линуксом таких проблем не возникает.

На скриншоте показан вывод в cmder, улучшенный аналог cmd для виндовс. В нём удобно делать подобные штуки:

Обратите внимание, как в первой строке виндовая команда работает с грепом из мира линукс.
Также cmder поддерживает удобные хоткеи, как линуксовых терминалах: очистить экран Ctrl+L (вместо cls), выйти из терминала Ctrl+D (вместо exit), и прочие, вроде подстановки аргументов Alt+. и так далее. Ещё в cmder есть вкладки, что очень удобно.