z-music.org
z-music.org
このサイトでは、曲を見つけて、聞いてダウンロードする機会があります。
目標は
sed
、
awk
、および
grep
の「紳士のセット」を使用して音楽を検索する
bash
スクリプトを作成することです。 さて、加えて少しカールしたり、味見したりします。
少しz-music.orgを調べたところ、次のことが明らかになりました。
- 検索は
z-music.org/search/
ます。 GETパラメーターとして、クエリテキストq
、リクエストタイプ(AJAX)action
および検索結果のページ番号を渡すことができます - データ
"id=<SONG_ID>"
とともにPOSTリクエストをz-music.org/bitrate/
送信することで、曲のビットレートを知ることができます - 曲をダウンロードするための直接リンクは
m1.z-music.org/t/<SONG_ID>_<HASH>
ようにm1.z-music.org/t/<SONG_ID>_<HASH>
ます。<HASH>
はz-music.org/theme/new/js/lang.js
のスクリプトで見つかりました
スクリプトの作成を開始できます。 サーバー要求には
curl
を使用しますが、
wget
使用を妨げるものは何もありません。
curl -s
代わりに
wget -q -O -
curl -F
、
curl -F
代わりに
wget --post-data
最初に、
hsh
変数に
<HASH>
を書き込みます。
hsh=$(curl -s http://z-music.org/theme/new/js/lang.js | sed -n 's/^var hsh="\([^"]*\)";$/\1/p')
変数
$query
および
$page
には、クエリテキストと結果のページ番号が含まれます。 サーバーにリクエストを送信します。
curl -s "http://z-music.org/search/?page=$page&action=ajax&q=$query"
HTMLを入手してください。 曲に関する情報は、
<a class="info" data-aid="SONG_ID"...>SONG_NAME</a>
という形式の行にあります。 タブで区切られた
<SONG_ID>
と
<SONG_NAME>
を
<SONG_ID>
します。
sed -n 's/^\s*<a class="info" data-aid="\([^"]*\)"[^>]*>\([^<]*\)<\/a>\s*$/\1\t\2/p'
<SONG_ID>
知って
<SONG_ID>
ば、ビットレートのリクエストを送信できます。 JSONが戻ってきます。 ビットレート値自体を抽出するために、
cut
ユーティリティを使用します。 変更のため。
curl -sF "id=$songid" http://z-music.org/bitrate/ | cut -d'"' -f8
曲をダウンロードするためのリンクは次のようになります
m1.z-music.org/t/${songid}_${hsh}/
/
m1.z-music.org/t/${songid}_${hsh}/
/
m1.z-music.org/t/${songid}_${hsh}/
これらすべてを1つのスクリプトに結合することが残っています。 彼に「ページごと」に曲を検索させ、ビットレートが事前に指定されたものと一致する曲のみに関する情報を表示させます。
#!/bin/bash case $# in 1) query=$1 bitrate=320 ;; 2) query=$1 bitrate=$2 ;; *) echo -e 'Usage:\n\tzmusic "song name"\nor:\n\tzmusic "song name" 256\nwhere 256 is bitrate' exit ;; esac hsh=$(curl -s http://z-music.org/theme/new/js/lang.js | sed -n 's/^var hsh="\([^"]*\)";$/\1/p') # infinite loop incrementing search page for (( page=1; page>0; page++ )) do result=$( \ curl -s "http://z-music.org/search/?page=$page&action=ajax&q=$query" | \ sed -n 's/^\s*<a class="info" data-aid="\([^"]*\)"[^>]*>\([^<]*\)<\/a>\s*$/\1\t\2/p' | \ awk -v hsh=$hsh -F"\t" ' \ { \ system("curl -sF \"id=" $1 "\" http://z-music.org/bitrate/ | cut -d\"\\\"\" -f8"); \ print "http://m1.z-music.org/t/" $1 "_" hsh "/"; \ print $2 "\n"; \ }') # stop the script if nothing found on this page if [ -z "$result" ]; then exit; fi # output songs with $bitrate only while read -r res; do echo -e $res; done <<< "$result" | grep -A2 "$bitrate" echo -e "-- end of page $page --\n" done
habrahabrについて何かを見つけようとしています。
$ zmusic "Habr" "256 \ | 320" 320 http://m1.z-music.org/t/-3ev4fnuc23h_2b49895762/ Habr-中毒性の歌 - 320 http://m1.z-music.org/t/-3ev4fnubytf_2b49895762/ HaBr-Nedomassaraks - 320 http://m1.z-music.org/t/-3ev4fnuc1d3_2b49895762/ HaBr-Travel [ハリネズミとペトルッチョのカバー] - 320 http://m1.z-music.org/t/-3ev4fntmcfl_2b49895762/ HaBr-エレベーターに乗らない(新しいシングル) -ページ1の終わり-