読むのが面倒な人はすぐに結果-python-yamusicに行くことができます。
仕事を分析します
始めるために、私はファイアバグで武装し、リクエストの行き先を追跡しました。 主な方向性が見つかりました:
- music.yandex.ru/fragment/search?text=&type = type &page = pageの 検索クエリ 。3つのタイプが可能です。 トラック 、 アルバム 、 アーティスト 。 他のパラメーターは明確です。 これは検索クエリであり、その結果から曲、アルバム、アーティストのIDを取得できます。
- music.yandex.ru/fragment/artist アーティスト /トラックのID- アーティストのすべてのトラックとアルバムのページ。
- アルバムの music.yandex.ru/fragment/album id-アルバムページ。
- storage.music.yandex.ru/get storage dir track /2.xml-ファイル名とトラック長を含むxml。
- storage.music.yandex.ru/download-info storage dir track / track filename- トラックをロードするためのデータを含むxml。
- 理解できない、常に異なるトラックアドレス。
最初の3つのクエリで受信したデータは、 Beautiful Soupを使用して簡単にフィルタリングできます。
- すべてのトラックは、 onclickプロパティのすべてのデータを含むb-trackクラスのdivにあります(ここから、そのストレージdirとidを取得します )。
- アルバムはb-albumsクラスのdivにあります。
- クラスb-artist-groupを持つdivのアーティスト。
コードで私のパーサーの実装を見ることができます 。
ダウンロードトラック
今ではすべてがシンプルに思えます。 トラック /2.xmlのstorage.music.yandex.ru/get storage dirにリクエストを行い、次の形式のxmlを取得します。
<?xml version="1.0" encoding="utf-8"?>
<track filename=" , 2.mp3" track-length=" " />
ここで、 storage.music.yandex.ru / download-info storage dir track / filename trackというリクエストを作成し、別のxml'kuを取得します 。
<download-info>
<host></host>
<path></path>
<ts> ts</ts>
<region></region>
<s> s</s>
</download-info>
しかし、トラックのジャンプのリクエストを見て、すべてのデータがあるわけではないことが明らかになりました。
javascriptをスクロールして、最初の文字とパラメーターなしでパスから必要なキーを作成する関数を見つけました。 この関数は、Pythonで書き換えるのが面倒なので、QScriptを介して実行するだけです。
これで、すべてのデータを取得して、トラックのurlをコンパイルできます:http:// host / get-mp3 / key / parameter ts path ? Track -id = id of track &\ region = region &from = service-search成功します。 ためらうことなく、私は1つのセッションですべてを実行しようとすることに決めました-すべてがすぐにうまくいきました。 結果は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および\ ion