Переносим коллекцию из vk в lastfm

Переносим коллекцию из vk в lastfm Утилиты, Перенос, Python, Музыка вк, Lastfm, Длиннопост

Недавно у меня появилась потребность перенести всю мою коллекцию треков из вк. (1252 треков в ручную я переносить не хотел) в Yandex.Music и last.fm. С Яндексом нет никаких проблем у них есть прекрасный инструмент как раз для этой цели. Напомню на всякий случай https://music.yandex.ru/import
Проблемой стало, то, что вк нынче не дает работать с музыкой. Потому, выбор стоял между: либо использовать чьи-то готовые реализации (библиотека vk-api на Python), либо попробовать написать собственную реализацию. Что и было сделано в конечном счете (ссылка в конце поста).
Я пишу в основном для себя, на языке Python. Для различных оптимизационных задач.
Первым делом понимаем, что добраться до заветных аудиозаписей человека можно только зайдя на vk.com
Бежим на vk.com и сразу понимаем, что основным запросом является пост запрос на https://login.vk.com/ с данными в виде логин/пароль/lg_h/ip_h/captcha и кучей всего еще.
Вк выдает капчу, если ты не логинишься 5 раз подряд с одного айпишника, поэтому этот пункт пропустим, еще остаются проблемы с двухфакторной авторизацией, но я надеюсь реализовать ее в следующей версии (если руки конечно дотянутся).
Обновляя несколько раз страничку, понимаем, что lg_h генерируется каждый раз. ip_h меняется как только меняется ip.
Оба значения довольно легко выудить с страницы логина: https://login.vk.com/

Переносим коллекцию из vk в lastfm Утилиты, Перенос, Python, Музыка вк, Lastfm, Длиннопост

Для этой задачи я использовал библиотеку requests и регулярное выражение "%s" value="(.{18})"
Форматируем строку и получаем значения. Закидываем все в запрос вместе с паролем и логином. И... Авторизация прошла успешно!
Об этом нам говорит строка в ответе 'onLoginDone', вместе с именем пользователя и его owner_id. Сразу сохраняем второе значение, так как оно нам еще понадобится для получения списка музыки.
Идем на страницу музыки и опять ловим запросы которые идут на сервер. В этот раз это post на https://vk.com/al_audio.php, причем вызывается он два раза. В первый раз с параметром offset = 0 второй раз c 30. Первый раз выдает 30 треков в формате xml с json и кусками страниц. Второй раз все остальные в таком-же формате. Получаем нужный нам json с помощью регулярки <!><!json>(.+?)<!> и загружаем его. Осталось почистить мусор и записать все в файл, хотя некоторые данные, например ссылки на не активированные треки могут быть довольно полезны.

Переносим коллекцию из vk в lastfm Утилиты, Перенос, Python, Музыка вк, Lastfm, Длиннопост

Следующей фазой станет перенос полученного json'а в LastFM. Благо на это дело у LastFM есть удобное api на python pyLast.

Переносим коллекцию из vk в lastfm Утилиты, Перенос, Python, Музыка вк, Lastfm, Длиннопост

Для тех, кто хочет просто перенести свои треки из вк в ластфм или не знаком с python, я подготовил изолированную среду для выполнения скрипта. Удалил все лишнее, оставил только жизненно необходимое. Вам достаточно нажать кнопку run.bat и все должно заработать.
Контакты по всем багам/предложениям/вопросам/критике указаны в readme файлах.
https://yadi.sk/d/Si9exRHZrt_NiA
Всем удачи в перенесении своих музыкальных коллекций.