Написал небольшой скрипт-качалку для сервиса Яндекс.Музыка.
Скрипт позволяет скачивать как отдельные композиции, так и альбомы или плейлисты целиком. Интерфейс консольный и выглядит следующим образом:
В процессе работы:
Скрипт использует сторонние модули (умеет определять их отсутствие и сообщать об этом) и портированный с JavaScript на Perl алгоритм хэширования Яндекса (находится в отдельном файле YaHash.pm), он необходим для скачивания трека.
В общем пользуйтесь.
Скачать: ya-music
GitHub: yandex-music-download
Update (23.01.15): Вышло обновление. Версия на GitHub тоже была обновлена.
Update (27.01.15): Добавлен прогресс бар, исправлена ошибка скачивания, если трек был удален с Яндекса: скачать.
Update (30.01.15): Что-то часто мелочи меняться стали. На данный момент актуальная версия на GitHub.
Update (21.04.20): Обновил README: добавил информацию по использованию для типичных систем и прочую атрибутику приличного оформления. Все как обычно на GitHub.
Огромное спасибо за удобный скрипт!
в текущем варианте очень не хватает опции -u для скачивания по веб-адресу трека/альбома/плейлиста. В таком варианте собранный PAR-ом скрипт можно будет удобно прикручивать к клик-меню по ссылке в браузере (что я уже сделал для старой Оперы http://forum.ru-board.com/topic.cgi?forum=5&topic=33748&start=4860)
Был замечен небольшой глюк скачивания некоторых альбомов-синглов, например тут https://music.yandex.ru/album/2473524 все файлы идут с одинаковыми именами и трут друг друга. Было бы полезно добавлять (к названию файла и в тэг) серый текст из названия при его наличии.
Из мелочей также не хватает записи в тэг номера трека и жанра (он в альбоме идет рядом с годом, причем лучше парсить не русский текст, а ссылку, содержащую англ. название).
Еще, вот такая конструкция
binmode STDOUT, ':encoding('.TARGET_ENC.')';
нормально работает в скрипте, но не хочет задавать кодировку при печати в STDOUT в упакованном PAR-ом exe (Cannot find encoding "cp1251"), причем, добавление use PerlIO::encoding не помогает. Однако при прямом указании кодировки binmode(STDOUT, ":encoding(cp1251)") все работает. Если сложно "красиво" подключить cp1251 для PAR, то это место лучше сделать через if else с прямым указанием кодировок.
Обновил.
https://github.com/kaimi.io/yandex-music-download/commit/635ebc8bfeca31be49655597ec0639c0975c8a9e
Огромное спасибо!
Пересобрал exe (доступен по предыдущей ссылке), для него изменил в шаблонах URL_*_REGEX "music\.yandex\.ru" на "music\.yandex\.[a-z]+" т.к. оказалось, что существуют локальные версии Яндекса (качать скрипт все равно будет с .ru, но URL скушает).
Для тех, кто будет собирать PAR-ом для винды, уточню, что в начале скрипта надо добавлять в явном виде использование модулей:
use Win32API::File;
use Win32::Console::ANSI;
use Digest::MD5;
use File::Copy;
use File::Temp;
use MP3::Tag;
use JSON::PP;
use Getopt::Long::Descriptive;
use Term::ANSIColor;
use LWP::UserAgent;
use HTTP::Cookies;
use HTML::Entities;
При попытке скачать плейлист просто ничего не происходит.
C:\Users\admin\Desktop>ya.pl -u https://music.yandex.ua/users/ya.playlist/playlists/1018
И через секунду такое: C:\Users\admin\Desktop>
Опять яндекс защита?
Виндопроблемы скорее
Одиночный трек скачивает ок. Плейлист пока не удалось.
В таком варианте получается:
C:\Users\admin\Desktop>ya.pl -p 1018 -k ya-playlist
[INFO] Fetching playlist info: 1018 [ya-playlist]
[INFO] Playlist title: Топ 100: Регги
[INFO] Tracks total: 100
[ERROR] Can't get track list info
Какая версия Windows, какая локаль у системы, что выводит chcp набранный в свежей консоли, скрипт с github последний?
Win 8.1
локаль
CurrentCulture : ru-RU
CurrentUICulture : ru-RU
C:\Users\admin\Desktop>chcp
Active code page: 866
скрипт последний
>>При попытке скачать плейлист просто ничего не происходит.
Потому что в ссылке на плейлист домен указан music.yandex.ua, скрипт работает для music.yandex.ru
>>Топ 100: Регги
Какой шрифт у консоли стоит? В свойствах окна консоли посмотреть можно, вкладка Font/Шрифт. На англоязычной Windows, например, по-умолчанию стоит Raster Fonts, которые не отображают корректно UTF-8, выбор в свойствах, например, Lucida Console решает проблему.
>>Can't get track list info
Не наблюдаю у себя такого на Strawberry Perl 5.22.0.1. Может быть проблема связана с https, можно проверить, достаточно после 472 строки:
my $request = $ua->get(YANDEX_BASE.sprintf(PLAYLIST_INFO_MASK, $opt{kind}, $playlist_id));
написать
print $request->as_string;exit;
и посмотреть, что скрипт выдаст. Также могу предложить поставить модуль Mozilla::CA, возможно проблема решится.
>>Какой шрифт у консоли стоит?
Сменил, отображается. Но это проблемой и не было, и в таком состоянии альбомы качает.
>>...написать print $request->as_string;exit; и посмотреть, что скрипт выдаст.
Написал, получил на выходе огромную простыню html кода страницы.
Установил модуль Mozilla::CA. Переустановил перл (был Active). В результате альбомы и треки как качались, так и качаются. URL и плейлисты нет. Перед скачиванием менял домен на ru - не помогло.
Огромное спасибо за помощь, но думаю нет смысла дальше разбираться. Если с такой проблемой только я один, то значит это что-то в системе. Треки и альбомы качает, проживу как-нибудь без плейлистов :).
Еще могу предложить поставить Fiddler web proxy или Charles web proxy, запустить, указать в параметрах скрипта локальный прокси, попытаться скачать плейлист и скинуть мне лог. Возможно дело в редиректах.
Стала появляться ошибка при скачивании альбомов с тегом -a, треки при этом скачиваются:
Use of uninitialized value $data in substr at ya.pl line 678.
У меня вообще капчу требовать стал сайт. Буду думать, как поступить...
Можно пример такого альбома?
Блин, действительно теперь яндекс блочит постоянное скачивание...
Ошибка была на этом альбоме помоему 3008672
Может таймаут сделать больше между закачками, чтобы не блочили?
Добавил опциональную задержку
Спасибо!!!
А как скачать такое 5дисковое издание целиком -a 2506304 ?
А какие проблемы? У меня скрипт выдает, что там 64 трека в сумме и видимо все их скачивать будет.
У меня только 39 скачал. Кстати всё-равно скачивание на последней версии не работает постоянно, дает ~ один альбом скачать: [ERROR] Can't get track list info
А после 39 что написал? Яндекс видимо блокирует
Яндекс вообще звери - выводят капчу, даже если просто быстро переключать треки по какому-нибудь плейлисту у них на сайте.
У меня там вообще в несколько потоков качалось с кучей запросов к API, теперь придётся всё жестко резать в один поток - будет медленно качать.
Что ж, достойная защита с их стороны :)
Защита своеобразная, можно сервис распознавания капч прикрутить.
Ясное дело, что можно ИИ сделать для скачивания музыки, но стоит ли оно того? Тут вопрос в соотношении затрат и выгод, получаемых с этой музыки.
Чем больше различных ограничений и защит, тем дороже стоит делать подобные качалки. Раз Яндекс прикрутили капчу, значит для них это имеет финансовое обоснование, поэтому они тратят деньги на разработку защиты.
deezer.com вообще шифруют содержимое самих аудиофайлов - если просто скачать трек через инструменты разработчика браузера и открыть в проигрывателе - там будет испорченный по звучанию трек. На их сайте стоит специальный flash проигрыватель, который на лету дешифрует треки и воспроизводит их. Вот до чего может дойти :)
Привет! Твоя качалка замечательная была, я ради нее перл специально поставил и скачал нужные модули=) Но она перестала работать - выдает [ERROR] Can't get track list info, хотя перед этим получилось скачать несколько треков. Реально проблема в капче? Планируется что-то делать в этом направлении? Очень жалко если все заглохнет - качалок с яндекса больше не смог найти. Я бы может даже попробовал помочь если нужна помощь, правда на перле я не большой кодер - на JAVA пишу)
Проблема в капче. Планирую посмотреть, как идет работа с сервисом через мобильное приложение, может там нет капчи.
Добавил работу через мобильное апи, вроде капча не беспокоит
Спасибо!
Но мой совет: пропишите паузу по дефолту секунд в 10-15 (с малосодержательным сообщением типа "Waiting for a track to start..."), иначе из-за наплыва любителей много и быстро покачать они вскоре еще что нибудь нехорошее придумают.
Еще вот тут
https://music.yandex.ru/album/25331/track/253716
почему то жанр криво считывается (в тег прописывается conjazz а в ссылке из альбома https://music.yandex.ru/genre/modern-jazz)
Добавил. Жанр берется из json-объекта с информацией о треке. А это просто адаптированные читабельные названия, которые не являются стандартом.
Хотя в ID3v2 жанра conjazz вроде бы тоже нет по стандарту.
Кстати, там у них сейчас актуальное API 2.0 по которому они отдают ссылки на треки с битрейтом 320 Кбит/с
Привет. Установил последнюю версию активперл.
Указываю perl ya.pl -u https://music.yandex.kz/users/пользватель/playlists/3
выходит Please, install this modules: Getopt::Long::Descriptive и ничего не происходит, а такого пакета для установки нет. getopt-long установлены
Попробуй более старую версию ActivePerl, попробуй Strawberry Perl, на крайняк через CPAN поставь
Отдельно треки скачиваются, а вот плейлист не скачивается.
Для этого подписка не нужна надеюсь?
попробовал перекинуть треки на другой публчичный плейлист так же не скачивается, пишет [ERROR] Can't get track list info
пробую через strawberry-perl-5.20.2.1-32bit-portable, через cpan установлены не достающие модули.
Этот трек скачивается https://music.yandex.kz/album/3144162/track/26428981
А этот уже нет https://music.yandex.kz/album/978899/track/9277551
выходит [ERROR] Can't get track list info
У меня оба трека нормально скачиваются
Плейлисты у меня нормально качаются. Версия скрипта надеюсь последняя с github?
Да с гитхаба. Подскажите какая у вас версия perl?
сейчас у меня Strawberry Perl 5.20.2.1-32bit
5.18.2, это не связано с версией. Скорее всего блокировка или что-нибудь вроде того. Можно попробовать с --debug запустить, может что-то дельное напишет.
https://github.com/kaimi.io/yandex-music-download/issues/2
Запускаю скрипт в linux, просит доставить модули
root@kali:~/Downloads/ya-music# perl ya.pl
Please, install this modules: Mozilla::CA, MP3::Tag, Getopt::Long::Descriptive
Подскажите пожалуйста, что это за модули? и как они правильно называется?
Искал в репо по этим словам - не нашел
http://search.cpan.org/~abh/Mozilla-CA-20160104/lib/Mozilla/CA.pm
http://search.cpan.org/~ilyaz/MP3-Tag-1.13/lib/MP3/Tag.pm
http://search.cpan.org/~rjbs/Getopt-Long-Descriptive-0.099/lib/Getopt/Long/Descriptive.pm
Я не знаю, как они называются в линуксовых репозиториях, тем более это может от зависеть от конкретной сборки. Через cpan скорее всего поставится.
спасибо за быстрый ответ
буду разбираться
Или могу предложить вместо скрипта воспользоваться, например, https://github.com/egoroof/yandex-music-fisher
Все получилось, но есть один нюанс..
пробую запустить скрипт примером из help
Скачивает только 1 трек, так и должно быть?
root@kali:~/Downloads/ya-music# perl ya.pl -u https://music.yandex.ru/album/215688/track/1710808
[INFO] Fetching album info: 215688
[INFO] Album title: A Night At The Opera
[INFO] Tracks total: 18
[INFO] Filtering single track: 1710808 [215688]
[INFO] Trying to fetch track: Queen - Bohemian Rhapsody (2011 Remaster)
[OK] Temporary saved track at ./CN5Fi9tItb
[INFO] MP3 tags added for ./CN5Fi9tItb
[INFO] ./CN5Fi9tItb -> ./Queen - Bohemian Rhapsody (2011 Remaster).mp3
[OK] Done!
Попытался натравить на свой плейлист - избранное, вылетел с:
[INFO] Fetching playlist info: 3 [****usr login***]
[ERROR] Can't get track list info
кажется разобрался,
в первом случае была ссылка на конкретный трек
во втором плейлист "не публичный"
ps я хочу закинуть этот скрипт в сетевое хранилище, чтоб он мониторил нужный плейлист и при добавлении нового трека качал все треки
отличная работа!
pss
недостающие пакеты для linux
Mozilla::CA
sudo apt-get install perl-modules
sudo cpan -i Mozilla::CA
MP3::Tag
sudo apt-get install libmp3-tag-perl
Getopt::Long::Descriptive
sudo apt-get install libgetopt-long-descriptive-perl
Под полноценной системой работает отлично, решил упаковать все в Docker
Запарился собирать недостающие компоненты, но в итоге скрипт запустился
К сожалению, не отрабатывает правильно. похоже чего то не хватает.
root@ya:/tmp/ya# perl /tmp/ya/ya.pl -u https://music.yandex.ru/users/ya.playlist/playlists/1257 --debug
[INFO] Fetching playlist info: 1257 [ya.playlist]
[DEBUG] main::get_playlist_tracks_info(604): Request failed
[ERROR] Can't get track list info
Могу предложить пустить трафик через локальный прокси (вроде Charles Web Debugging Proxy), который покажет, что происходит в этом месте.
Либо самостоятельно взять и добавить на той строке print $request->as_string; и посмотреть, в чем дело.
Спасибо!! отличная работа, скрипт делает свое дело
Проблема была в LWP::Protocol::https
недостающий пакет для linux sudo apt-get install liblwp-protocol-https-perl
что в итоге удалось сделать:
после добавления трека в определенный плейлист, он скачивается и загружается в папку на яндекс.диске 8-)
все реализовано на виртуализации в Docker на дисковом хранилище Synology, скрипт запускается каждые 15 мин.
можно ли добавить автоматическое создание папки для скачивания, если в параметрах задана несуществующая папка?
Не уверен, что это нужно, могу предложить изменить соответствующий фрагмент скрипта для себя, например, следующим образом:
Самая последняя версия у меня не устанавливается на Хром. Пишет нет файла манифеста. После попытки установить предыдущую и обновить её расширение таки появилось, но объясните это нормально...
1. Песни из плейлиста скачиваются по одной штуке! Каждый раз вылетает окно с просьбой сохранить один трек, как если бы их скачивать самому по одной штуке.
2. Никак не указать папку для сохранения заранее. Только для каждой песни отдельно. А это неудобно ведь новые окна появляются очень быстро.
Вопрос такой - Это действительно так задумано или у меня все не так установилось?
О чем речь вообще? Пост про скрипт на перле, а не про расширение для хрома.
Здравствуйте!
Проблема с последней версией:
e:\yandex-music-download-master\src>perl ya.pl -a 3277262
Missing right curly or square bracket at ya.pl line 299, at end of line
syntax error at ya.pl line 299, at EOF
Execution of ya.pl aborted due to compilation errors.
У меня нормально запускается и на win и на nix
А есть возможность выложить прошлую версию где-то, пожалуйста?
Прошлую это какую? На github любую версию скачать можно
Спасибо, вот эта https://github.com/kaimi.io/yandex-music-download/tree/ac3f3dacaf80c4e8881682348b74b709a3c1e07a от 26 января эту ошибку не выдает. Пока останусь на этой.
Может стоит перл обновить? На 5.18 и 5.22 проблем нет
Привет!
Не качает, например, при попытке скачать плейлист получаю ошибку и всё ничего не качается(
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching playlist info: **** [uid-vmvnskay]
[INFO] Playlist title: Медленные
[INFO] Tracks total: 2
[INFO] Trying to fetch track: Chris De Burgh - The Lady In Red (Album Version)
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Celine Dion - My Heart Will Go On (из фильма «Титаник»)
[ERROR] Can't get track url
[OK] Done!
Запусти с аргументом --debug, покажи лог и залей куда-нибудь файл, который создастся в папке со скриптом
Сюда залил: https://cloud.mail.ru/public/4Jj4/Jke2CXMdZ
Лог работы:
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching playlist info: **** [uid-vmvnskay]
[INFO] Playlist title: Медленные
[INFO] Tracks total: 2
[INFO] Trying to fetch track: Chris De Burgh - The Lady In Red (Album Version)
[DEBUG] main::get_track_url(480): Request failed
[DEBUG] main::log_response(1047): Response stored at log_1459300723
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Celine Dion - My Heart Will Go On (из фильма «Титаник»)
[DEBUG] main::get_track_url(480): Request failed
[DEBUG] main::log_response(1047): Response stored at log_1459300728
[ERROR] Can't get track url
[OK] Done!
С --mobile=0 скачивает, но быстро в капчу процесс упрется. Почему не качает через мобильное API - не знаю, на других плейлистах нормально работает, а на ваших - нет.
Спасибо, понятно, возможно, потому-что я в этот аккаунт через привязку к gmail вхожу.
Hi
May I ask you to build .exe file or .apk file to yandex downloader ? I dont know how to work by ya.pl file . please help me.
thanks
Just use https://github.com/egoroof/yandex-music-fisher
https://music.yandex.ru/users/music.partners/playlists/1632
почему то качает выборочно - не все треки
В чем может быть дело?
root@ya2:/# /tmp/music/start.sh
[INFO] Fetching playlist info: 1632 [music.partners]
[INFO] Playlist title: Летнее путешествие: музыка в дорогу
[INFO] 24
[INFO] Trying to fetch track: Jake Owen - Beachin'
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Bryce Vine - Sour Patch Kids
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: George Ezra - Budapest
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Lyte Funkie Ones - Summer Girls
[OK] Temporary saved track at /tmp/music/1/bcA32_5OFL
[INFO] MP3 tags added for /tmp/music/1/bcA32_5OFL
[INFO] /tmp/music/1/bcA32_5OFL -> /tmp/music/1/Lyte Funkie Ones - Summer Girls.mp3
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Galantis - No Money
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Kenny Chesney - Summertime
[OK] Temporary saved track at /tmp/music/1/Ko589cgXZs
[INFO] MP3 tags added for /tmp/music/1/Ko589cgXZs
[INFO] /tmp/music/1/Ko589cgXZs -> /tmp/music/1/Kenny Chesney - Summertime.mp3
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Twenty One Pilots - Ride
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
Судя по логу - какая-то старая версия скрипта. Как себя ведет последний вариант с github?
Скажите пожалуйста что нужно сделать чтобы скачать музыку в hq а не 192.
Через мобильное апи он по идее выбирает максимально доступный битрейт.
если что подписка есть
а мобильное апи получается сейчас как бы стоит по умолчанию,то есть если я взял ваш перловский файл,и пытался качать через него то он уже пытался скачать в максимально доступном качестве?(если что простите за тупые вопросы я далек от этого всего...)
По идее да. Другое дело скрипт не пытается авторизоваться на сайте, может подписчикам доступно больше вариантов.
а есть возможность как то прикрутить авторизацию к этому скрипту?
Конечно, код открыт, документация по Perl тоже - изучайте, прикручивайте.
Сделайте плейлист публичным.
Ошибка при переходе по ссылке на скрипт. Можно инструкцию более менее подробную для чайников? Пожалуйста
Пардон. Поправил ссылку. Прямо совсем подробной инструкции нет, но может это поможет https://kaimi.io/?p=976
C недавнего времени не качает.
C:\Users\User\Desktop\ya-music>ya.pl -a 3328950 -t 28782912
[INFO] Fetching track info: 28782912 [3328950]
[ERROR] Can't get track list info
C:\Users\User\Desktop\ya-music>
Выглядит как не последняя версия. Скрипт был скачан с github? Там актуальная версия лежит.
Не знаю может и удобный скрипт,но переводит на англоязычный сайт. Совершенно ничего непонятно! С помощью гугл переводчикак еще более менее скачал, так и сама прога на английском. Ничего не понятно, пожалуйста переведите на норм язык)
Тогда лучше пользоваться расширением для хрома https://chrome.google.com/webstore/detail/yandex-music-fisher/gkdpmbjlfgjbnleinnojgpgoljaokbni?hl=ru
Система FreeBSD, все модули по списку установлены.
Установлен perl 5.20.3
perl -v
This is perl 5, version 20, subversion 3 (v5.20.3) built for amd64-freebsd-thread-multi
Если запускать скрипт:
perl ya.pl -u https://.....
то выдает:
Use of uninitialized value $_ in substitution (s///) at ya.pl line 102.
Use of uninitialized value $missing_modules[0] in join or string at ya.pl line 109.
Please, install this modules:
А если запускать:
./ya.pl -u https://.....
выдает
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: use: not found
: not found
./ya.pl: NL: not found
./ya.pl: TIMEOUT: not found
: No such file or directorylla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0,
: No such file or directoryik/2.1.0 (Linux; U; Android 5.0; Google Nexus 4 - 5.0.0 - API 21 - 768x1280 Build/LRX21M),
: No such file or directorys://music.yandex.ru,
: No such file or directorys://api.music.yandex.net,
./ya.pl: MD5_SALT: not found
./ya.pl: 19: Syntax error: "(" unexpected
Система FreeBSD, все модули по списку установлены.
Что не так?
Перекачай с Github и попробуй снова
Hello!
I installed Chrome Extension. The download format was 192kps.
How to download 320kps or Flac?
I'm waiting for the answer.
Thanks.
You can't without subscription, furthermore I have nothing to do with this extension
This app was listed on this page. However, thank you for answering.
Do you write custom scripts?
How can I order?
your email?
Not really, moved from software development to penetration testing
Не работает :(
# perl ya.pl --album=4885921 --track=38276358
[INFO] Fetching track info: 38276358 [4885921]
[ERROR] Can't get track list info
С флагом --debug запусти и содержимое лог-файла покажи
здрасти
как можно с вами связаться, хочу заказать у вас скрипт, если вы не заняты конечно?
Не занимаюсь разработкой на заказ
Привет!
kaimi,
Как бы скачать песни в 320 kbs?
Подписка есть.
Через обычный параметр -u получаю 192 kbs.
Через добавление --mobile=0 получаю ошибку https://cloud.mail.ru/public/7QDp/ncwV3W611
Через добавление --mobile=1 и др. тоже 192 kbs.
Попробовал через плагин для скачивания видео, получаю 320 kbs, но для плейлистов больших это не вариант)
Посмотри обновление на github. Теперь возможно, но придется предварительно значение заголовка Authorization с мобильного приложения стянуть.
Эх, знать бы, как его вытянуть. Где-то можно почитать про это?
Нужно на телефоне настроить работу через прокси и на компьютере запустить какой-нибудь умеющий в mitm прокси. Типа Charles, Fiddler, Burp Suite. После этого поставить приложение Яндекс.Музыка и зайти в него своим аккаунтом с подпиской.
Не хочет мобильное приложение смотреть на доверяемые root сертификаты Charles в системе и не получается увидеть запросы от приложения. Если мобильным Chrome обращаюсь к api мобильному, сертификат используется, но там сразу редирект идет на обычный api(
На iOS такой проблемы нет. На android можно прошить сертификат в системное хранилище вроде как
Да, я добавил в пользовательское хранилище на Android, но что-то приложению всё равно.
На iOS появляется окно про проблемы с проверкой сертификата и дальше нормально
Получилось на более старом Android и телефоне, на Android 7 не захотел работать сертификат. В --auth нужно ставить значение из поля OAuth Authentication, которое на 39 символов?
Попытался скачать один трэк получил такую ошибку, значит это нормально?
[DEBUG] main::get_track_url(545): Can't find track with proper format & bitrate
[ERROR] Can't get track url
Вот прямо все что идет после двоеточия в хедере Auhtenication. Т.е. OAuth .....
Да, не хочет скачивать, мол не находит подходящих трэков по параметрам
perl ya.pl -u https://music.yandex.ru/users/********/playlists/**** --bitrate=320 --mobile=1 --auth=************************************************ --debug
Заработало, БОЛЬШОЕ СПАСИБО!!! :-)
P.S. Не хватало, как раз OAuth
Спустя столько лет уже появилась практически полная обёртка над их закрытым API - https://github.com/MarshalX/yandex-music-api
где то с конца мая перестали скачиваться треки.
поставил последнюю версию ya.pl - требует из cookie Session_id. Что оно из себя должно представлять (формат)? Т.к. что бы не подставить - скачивается только 30 секунд.
Если в браузере авторизоваться на сервисе Yandex.Music, открыть консоль разработчика (вкладку сетевые запросы) и перейти на титульную страницу сервиса, то в заголовке Cookie будет строка Session_id={буквы-цифры}. Необходимо ее подставить вместе с Session_id.
У меня вот такая строка запуска скрипта:
C:/Perl64/_work_r/temp_ymdm/ya.pl -u https://music.yandex.ru/album/69160 --cookie Session_ID=3:1597249297.5.0.1584898084797:Ewn_kQ:4d.1|985285702.0.2|221329.48938.fEYxf5Niav1GPUVcBGk8kavUZ8E
Результат: "С:" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
Если заключить в " кавычки, то скачивание происходит, но только 30 сек.
Что делаю не так?
Для начала обновиться с github и попробовать скачать еще раз.
Обновил, версия от 15.08.2020!
Эффект тот же. Скрипт не понимает значение cookie в котором присутствует вертикальная палка "|"! Отсюда ошибка: "С:" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Т.е. скачивание скрипт производит для случая отсутствия авторизации, отсюда и 30 сек. от трека.
Скрипт роли не играет, это стандартное поведение терминала ОС. Вариант с кавычками должен работать.
Увы. С кавычками не происходит авторизация и скрипту позволяется скачать только 30 сек. от трека!
А если добавить аргумент --mobile 0 , то что-то меняется?
Запускаю:
C:/Perl64/_work_r/temp_ymdm/ya.pl -u https://music.yandex.ru/album/69160 --mobile 0 --cookie Session_ID="3:1597510103.5.0.1584898084797:Ewn_kQ:4d.1|985285702.0.2|221473.327792.nqNCg9IG8XOWQkigvcQ5aETFbJw"
Эффект нулевой! По прежнему не проходит авторизация на music.yandex.ru
Нулевой, т.к. это должно выглядеть как:
C:/Perl64/_work_r/temp_ymdm/ya.pl -u https://music.yandex.ru/album/69160 --mobile 0 --cookie "Session_ID=3:1597510103.5.0.1584898084797:Ewn_kQ:4d.1|985285702.0.2|221473.327792.nqNCg9IG8XOWQkigvcQ5aETFbJw"
сделал как Вы рекомендовали, но ничего не изменилось. Попробовал в ForeFox зайти на https://music.yandex.ru/album/69160 и авторизоваться на Yandex, после этого с помощью "Open Cookie Manager" прочитать значение Session_ID и подставить как рекомендовано. Но увы авторизация всё равно не проходит... Прошу меня извинить за назойливость, но я не понимаю, что не так.
Через браузер полные версии треков играются?
Если не авторизоваться (без регитрации), то через браузер проигрывается 30 сек. трека, при этом в cookie отсутствует значение переменной Session_ID. После авторизации в браузере трек проигрывается полностью и значение cookie Session_ID появляется.
Тогда должно работать. Могу еще предложить записать трафик скрипта, используя Charles Proxy/Burp Suite/Fiddler и аргумент
--proxy
Похоже Yandex-Music работают над пресечение скачивания музыки: слушать - слушайте, а скачивать - не моги!
Высылаю последний результат скачивания:
C:\Users\Valery\Music\Music_Yandex\33>C:/Perl64/_work_r/temp_ymdm/ya.pl -u https://music.yandex.ru/album/69160 --mobile 0 --c
ookie "Session_ID=3:1597856179.5.0.1597856179307:vwr_kQ:87.1|985285702.0.2|221665.750748.As-ujmEWvS5B85ESSDSLlZRrJ4A"
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 69160
[INFO] Album title: Hits Unlimited
[INFO] Tracks total: 11
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[ERROR] Track with non-existent path (deleted?). Skipping...
[OK] Done!
Обновил на github, может теперь нормально будет.
обновил с github, ошибки "[ERROR] Track with non-existent path (deleted?). Skipping..." ушли, но всё равно скачивается только 30 сек. от трека. Может авторизацию необходимо производить в скрипте явно, а не через cookie?
Я тестировал на паре учетных записей с подпиской и без - не наблюдаю такой проблемы.
Может быть скачивание ведется не с русского IP и в этом случае какие-то нюансы.
Здравствуйте, Сергей!
Хочу задать глупый вопрос. А с моим Session_ID Вы у себя можете запустить скрипт или нет и посмотреть что к чему? Я уже "голову сломал" - ничего не помогает...
Могу попробовать
Доброго дня, Сергей!
Что для этого необходимо?
Если что, то
"Session_ID=3:1598813539.5.0.1597856179307:vwr_kQ:87.1|985285702.0.2|222197.501085.CGH9lwrMTNzJy2Qq37JJy-GkzxI"
Написать в мессенджер видимо, т.к. я не знаю, сколько живет сессия, и скорее всего она истечет к моменту, когда я посмотрю
"Open Coocie Manager " пишет, что "Expiry date" для этой переменной: 19/Jan/2038 08:14:07.
Session_id
3:1598813539.5.0.1597856179307:vwr_kQ:87.1|985285702.0.2|222197.501085.CGH9lwrMTNzJy2Qq37JJy-GkzxI
sessionid2
3:1598813539.5.0.1597856179307:vwr_kQ:87.1|985285702.0.2|222197.760600.PaMxu9pJPBfQEAW9HscQ-rkZddw
а по виду эта переменная та, что нужно или я не ту нашёл?
К сожалению, я ни одним из мессенджеров не пользуюсь.
Может есть возможность запустить скрипт с аргументами
--debug
и--proxy
, далее в качестве локального прокси взять скажем Charles, записать трафик при попытке скачивания, сохранить и прислать мне?смоими куками норм качает.
Здравствуйте, Сергей!
Естественно имеется возможность запустить скрипт с аргументами --debug и --proxy. Только есть одна "закавыка": у меня нет вообще опыта работы с прокси сервером Charles. Поэтому, если у Вас есть возможность, пришлите мне инструкцию как всё сделать и я Вам обязательно вышлю результат.
1. Скачать и установить https://www.charlesproxy.com/
2. Запустить, убедиться, что в разделе Proxy Settings в настройках в разделе Decrypt SSL настроено отображение содержимого SSL-трафика для всех хостов (можно добавить запись со значениями * в разделе host и * в разделе port)
3. Запустить скрипт с флагами
--debug
и--proxy 127.0.0.1:8888
, и попробовать скачать какой-то трек4. Убедиться, что запросы залогировались в Charles в основном окне
5. Экспортировать сессию через меню File в формате XML или Trace text file (https://www.charlesproxy.com/documentation/using-charles/export/)
Вроде как получилось, но как прислать файл? Он получился 800 К и в окно комментарий не помещается.
Загрузить его на https://mega.nz или https://www.sendspace.com/
Вот, где лежит файл:
https://mega.nz/file/2eoGkI4K#v_VHB7QG0CEgjDJKY6mpPWo1nie9ERshQk_oQdhtKQs
Посмотрел. В записи видно, что Cookie подставлен с именем
Session_ID
, а если посмотреть, как этот Cookie выглядит в запросе в браузере, то имя будетSession_id
. Регистр важен.Здравствуйте, Сергей!
Исправил регистр, заработало. НО нарисовалась новая проблема: какого бы исполнителя не выбрать, при скачивании названия треков идут его, а вот содержимое одно и тоже: Rick Astley - Never Gonna Give You Up - 3.33. Если подставить Session_id с ошибкой, т.е. как бы без авторизации, то всё равно Rick Astley - Never Gonna Give You Up но время трека 0.30. Это у меня глюк на компе или где?
Ещё раз здравствуйте, Сергей!
Скачал последнюю версию скрипта от 09.09.2020. Всё работает как нужно.
Большое спасибо Вам за потраченное на меня время.
Привет скрип работает, большое спасибо! Несколько треков пропускает :
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: FREE FLOW FLAVA - Inner Force
[OK] Temporary saved track at /Users/admin/Downloads/ceU0rnMckV
[INFO] MP3 tags added for /Users/admin/Downloads/ceU0rnMckV
[INFO] /Users/admin/Downloads/ceU0rnMckV -> /Users/admin/Downloads/FREE FLOW FLAVA - Inner Force.mp3
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: FREE FLOW FLAVA - Odayaka
[ERROR] Failed to download track
[INFO] Waiting for 5 seconds
Можно ли с радио использовать?
С радио не пробовал, если речь именно о потоковом радио, то думаю нет.
Есть ссылка на плейлист или альбом, где треки пропускаются?
И хорошо бы аргументы запуска скрипта еще привести.
ссори за плохой коммент :
perl ya.pl -u https://music.yandex.ru/album/12115632 --mobile 0 --cookie "Session_ID=3:1601554106.5.0.1590667456578:H8tmUw:23.1|72473611.0.2|223719.692363.LMWKqMBW30EIA4sUlOUi38sOlNw" -d /Users/admin/Downloads
Я бы хотел тот трек что играет в данный момент иметь возможность скачать. Сценарий когда играет радио и мне нравиться трек но лень искать его где то)
У меня получалось доставать его из ресурсов с очень странным названием и вроде там base64 формат. Вообщем если есть какие идеи буду рад совету.
По поводу пропуска треков - странно, с российского IP скачивается полностью альбом без проблем.
По поводу радио, дергать скрипт, чтобы скачать трек, который играет прямо сейчас - даже не уверен, что есть такое API.
Может стоит посмотреть MellowPlayer или расширение для браузера вроде https://chrome.google.com/webstore/detail/yandexmusic-downloader-we/gioigmdoacmpohhpbkmmlbbppiongloh?hl=ru
Здравствуйте, Сергей!
Снова обращаюсь к Вам с проблемой. Скрипт обновил до версии от 15.01.21 г.
При скачивании в списке на яндексе из 18 треков скачивается 15. На последние 3 ругается типа:
C:\Users\Valery\Music\Music_Yandex\Parov Stelar\Voodoo Sonic The Album>C:/Perl64/_work_r/temp_ymdm/ya.pl -u https://musi
c.yandex.ru/album/12604145/track/58683055 --mobile 0 --cookie "Session_id=3:1607578157.5.0.1599647154690:effWsg:14.1|985
285702.0.2|227069.261251.N1ISbR6o-vf_aoKS9UueXBqrHZ0"
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 12604145
[ERROR] Can't get track list info
C:\Users\Valery\Music\Music_Yandex\Parov Stelar\Voodoo Sonic The Album>pause track/72933310
Press any key to continue . . .
Могу порекомендовать попробовать сменить IP-адрес. Проблем со скачиванием сейчас нет, но может быть какая-то блокировка из-за относительно частых скачиваний.
Да, Сергей, сегодня скачалось без проблем. Видно вчера, что то наложилось и не скачивалось. Прошу прощенья, что побеспокоил - просто надо было подождать и попробовать позже. Спасибо, и всего наилучшего!!!
Добрый день. Отличный скрипт, раньше работал как часы, но в последнее время ничего не могу скачать. Версия последняя, запускаю примерно так:
perl c:\myperl\ya.pl -u https://music.yandex.ru/album/15350795 --mobile 0 --cookie "Session_id=3:1621469785.5.0.1620575449938:hqeg:24.1|163843709.0.2|234801.888445.in47tf2ont60dqrf_ss"
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 15350795
[INFO] Album title: Yoga Music
[INFO] Tracks total: 43
[INFO] Trying to fetch track: Tibetan Bowls, Meditation Music Collective - Yoga Music
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
[INFO] Trying to fetch track: Tibetan Bowls, Meditation Music Collective - Yogic Bells
[ERROR] Can't get track url
[INFO] Waiting for 5 seconds
Terminating on signal SIGINT(2)
Пробовал с другим рабочим Session_id - тоже самое :( IP-адрес российский. В чём может быть затык?
Скрипт не работает сейчас? Как только не пробовал качать - всегда ошибка [ERROR] Can't get track url
Добрый день, нужно скрипт запустить с дополнительным аргументом --debug и прислать файл, который появится в текущей директории (с именем log_*).
В общем по разному пробовал: и через -u, и через -a и -t, с кавычками и без, результат всегда одинаковый:
400 URL must be absolute
Content-Type: text/plain
Client-Date: Mon, 24 May 2021 18:08:08 GMT
Client-Warning: Internal response
400 URL must be absolute
А в консоли что при этом пишется с --debug?
perl c:\myperl\ya.pl -u https://music.yandex.ru/album/4345731/track/35027298 --cookie "Session_id=3:1621758282.5.0.1609631111049:8cNdAg:1.1|76355093.0.2|234961.370409.hTriH1VMqGR865ZC9Rn5UIuk2bs" --debug
Use of uninitialized value in concatenation (.) or string at c:\myperl\ya.pl line 1127.
[DEBUG] (310): Yandex Music Downloader v1.1
[DEBUG] main::print_perl_info(1225): OS: MSWin32; Path: c:\myperl\perl\bin\perl.exe; Version: v5.30.0
[INFO] Checking Yandex.Music availability
[OK] Yandex.Music is available
[INFO] Fetching album info: 4345731
[INFO] Album title: California
[INFO] Tracks total: 28
[INFO] Filtering single track: 35027298 [4345731]
[INFO] Trying to fetch track: blink-182 - Good Old Days
[DEBUG] main::get_track_url(637): Request failed
[DEBUG] main::log_response(1215): Response stored at log_1622008974
[ERROR] Can't get track url
[OK] Done!
Версия не самая последняя, судя по логу. Обновитесь с https://github.com/kaimi-io/yandex-music-download
Да, действительно была не самая последняя версия, качал из раздела релизов Гитхаба, а там версия 1.1 от 07.09.2020...Скачал ya.pl из источников, и всё заработало, спасибо!
Сейчас вот что выдаёт:
[INFO] Checking Yandex.Music availability
[ERROR] Yandex.Music is not available
Версия последняя с Гита.
Обновил на гите версию.
Временно убрал проверку доступности, пока нет понимания, работает ли теперь при входе музыка из любой страны.
Нет в планах добавить скачивание в формате aac?
В принципе можно добавить поддержку, это не сложно, посмотрю.
Веб-версия не выдает файлы в aac формате, как я понимаю, хотя в js-коде Яндекса есть фичи, связанные с возможностью смены формата.
Мобильное api по-умолчанию выдавало в нем. Вариант скачивания через него подходит? Там немного сложнее извлечь необходимый токен для скрипта.
Проверил одну идею.
AAC можно получить заменив /m на /a в DOWNLOAD_INFO_MASK.
Я пробовал этот вариант, но мне почему-то возвращало 204 No Content. Сейчас работает?
А есть возможность при скачивании сознавать директорию - Исполнитель - Альбом - Год?
В данный момент нет, но реализовать не сложно, посмотрю.
Добавил поддержку возможности задания дополнительного пути с использованием тегов (исполнитель, альбом, год).
Приветствую. Актуален ли скрипт? Честно сказать, как-то не стабильно он работает - то скачивает, то нет. Версия новая. Ошибку, кт выдает [ERROR] Can't get track list info. Делаю так
ya.pl -u https://music.yandex.ru/album/2625671/track/22860218 --mobile 0 --cookie "Session_id=3:1649938955.5.0.1649938955551:zbzZPg:23.1.2:1|34529943.0.2|3:250907.72684.YbrR_2kLiaGjlFmWQ_UPHTDuzHU". Если не трудно, проверьте и напишите, пжл, как надо правильно. Из плэйлиста на 15 песен скачал всего две.
На какой версии такое поведение: 1.3 из releases на github или просто был репозиторий клонирован?
Если первый вариант, то стоит попробовать склонировать репозиторий, т.к. там было небольшое изменение.
Если второй, то необходим вывод с флагом --debug и файл, который создается при работе в этом режиме.