Используем «Яндекс Музыку» вне браузера

    Недавно мне захотелось поработать с «Яндекс Музыкой» не через браузер. Как выяснилось, у них нет открытого api, и дело оказалось не тривиальным. Да и ничего готового найти не удалось.

    Те, кому лень читать, могут сразу перейти к результату — python-yamusic.

    Анализируем работу



    Для начала я вооружился firebug'ом и проследил, куда идут запросы. Были найдены основные направления:
    • music.yandex.ru/fragment/search?text=поисковый запросс&type=тип&page=страница, где возможны 3 типа: tracks, albums и artists; остальные параметры и так понятны. Это поисковый запрос, из результата которого мы можем получить id песен, альбомов и артистов;
    • music.yandex.ru/fragment/artistid артиста/tracks — страница со всеми треками и альбомами исполнителя;
    • music.yandex.ru/fragment/albumid альбома — страница альбома;
    • storage.music.yandex.ru/getstorage dir трека/2.xml — xml с названием файла и длиной трека;
    • storage.music.yandex.ru/download-infostorage dir трека/filename трека — xml с данными для загрузки трека;
    • непонятный и всегда разный адрес трека.

    Полученные первыми тремя запросами данные легко отфильтровать при помощи Beautiful Soup, так как:
    • все треки лежат в div'ах с классом b-track со всеми данными в свойстве onclick(отсюда мы получаем его storage dir и id);
    • альбомы находятся в div'ах с классом b-albums;
    • исполнители в div'ах с классом b-artist-group.

    Мою реализацию парсера можно посмотреть в коде.

    Скачиваем трек



    Теперь кажется, что всё просто. Делаем запрос на storage.music.yandex.ru/getstorage dir трека/2.xml и получаем xml'ку вида:
    <?xml version="1.0" encoding="utf-8"?>
    <track filename="название файла, обычно 2.mp3" track-length="длина трека" />

    Теперь делаем запрос storage.music.yandex.ru/download-infostorage dir трека/filename трека и получаем ещё одну xml'ку:
    <download-info>
    <host>хост</host>
    <path>путь</path>
    <ts>параметр ts</ts>
    <region>регион</region>
    <s>параметр s</s>
    </download-info>

    Но, посмотрев запросы на скачку трека, стало понятно, что тут не все данные.
    Пролистав javascript, я нашёл функцию, которая из пути без первого символа и параметра s создаёт нужный нам ключ. Эту функцию было лень переписывать на python, поэтому она просто выполняется через QScript.
    Сейчас, имея все данные, можно составить url трека: http://хост/get-mp3/ключ/параметр tsпуть?track-id=id трека&\region=регион&from=service-search, но просто так скачать файл не удастся. Не долго думая, я решил попробовать делать всё в одной сессии — всё сразу получилось. Результатом вышла библиотека python-yamusic

    Использование библиотеки



    Это очень просто, для начала нужно инициировать Qt приложение и сделать все импорты:
    >>> from yamusic.app import Search, cursor
    >>> from PySide.QtCore import QCoreApplication
    >>> import sys
    >>> app = QCoreApplication(sys.argv)

    Для поиска есть:
    >>> cursor.search(Search.TYPE_ARTISTS, 'query')
    >>> cursor.search(Search.TYPE_ALBUMS, 'query')
    >>> cursor.search(Search.TYPE_TRACKS, 'query')

    Для получения данных из найденных объектов:
    >>> artist.get_albums()
    >>> artist.get_tracks()
    >>> album.get_tracks()

    И, собственно, для открытия трека:
    >>> track.open()


    PS &\region написано из-за ®ion
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

      0
      вначале посмотрел код, подумал, на кой черт вы туда QT прицепили. Потом хватило вежливости прочитать пост, и все стало ясно.

      > Пролистав javascript, я нашёл функцию, которая из пути без первого символа и параметра s создаёт нужный нам ключ. Эту функцию было лень переписывать на python, поэтому она просто выполняется через QScript.

      P.S. hack.py супер)
        0
        Ага =)
        Пробовал остальные биндинги к js, ничего адекватно не заработало.
          0
          не поделитесь именами этих биндингов? иногда возникают подобные задачи, а не всегда есть время гуглить. поделитесь с общественностью, если не жалко :)
        0
        фреймворк называется Qt, а
        QT — это расстояние от начала комплекса QRS до завершения зубца T
        +8
        Засекаем, как быстро они «поломают» вашу библиотеку. Всё таки они платят за возможность у себя разместить музыку. А вы, я думаю, своими действиями какое-нить соглашение, да нарушаете. Я думаю, вы ничего не нашли, потому что, если «палить систему», то это уж слишком нагло. Яндекс знает(ну должен знать), что их «доят», но пока наглость в пределах нормы, ничего не делают.
          +1
          Мне просто было интересно, как это можно сделать. Но скачивать или слушать музыку через эту библиотеку я особо-то и не собираюсь. А «доить» через неё будет проблематично, там с этим ключём костыль на костыле =)
            –14
            Сами дураки. Кто же mp3шки хранит в открытом виде?
            +1
            тоже начал писать программу типа вашей, но потом почитал соглашение:
            legal.yandex.ru/music_termsofuse/
            2.3. Все Материалы и Плеер предназначены исключительно для личного некоммерческого использования в рамках технических возможностей, предоставляемых Сервисом. Любое копирование, воспроизведение, переработка, распространение, доведение до всеобщего сведения либо иное использование Материалов, Плеера или Базы данных вне рамок возможностей, предоставляемых Сервисом, а также любое их использование в коммерческих целях запрещается.
            — Кстати в расширениях хрома был плагин скачивающий музыку с этого сервиса, но быстро пропал :)
              –3
              Грех ругать тех, кто помогает за "идею" развивать продукт. Тем более автор не использует ничего в коммерческих целях.
              Итого:
              1) Если подобные решения будут популярны, то необходимо будет задуматься над официальным решением данной задачи, т.к. рынок нужно удовлетворять.
              2) Если решение не будет популярным, они будут знать, что смысла развивать продукт в таком направлении нет.

              В любом случае затрат никаких, а анализ рынка будет намного лучше, чем тот, за который они бы заплатили. Поэтому никто не будет никого привлекать.
                0
                Мда, перед разработкой и не прочитал, в случае чего придётся тоже убирать.
                  +1
                  Не думаю, что убирать придется. Все-таки вы разместили код, а нарушение лицензионного соглашения происходит только если кто-то воспользуется вашим кодом для скачивания музыки или ее прослушивания.

                  Другое дело, что вы с сайта Яндекса взяли код JavaScript и разместили его под LGPL — на это вы права не имеете.
                    +2
                    Поправил, теперь код динамически подгружается.
                –1
                эх… кто бы для prostopleer сделал такое… вон у них и api есть :)
                  –1
                  А еще было бы круто, если бы Я.Музыка была не только СНГ… :"(

                  Only users with full accounts can post comments. Log in, please.