以前、radikoのタイムフリーを保存する方法を書きましたが、今回はエリアフリー対応版です。

基本的な手順は同じですが、異なるのは最初にログイン処理を行ってCookieをローカルに保存し、以降はそのCookieを送信する点です。
環境
OS: Mac OS High Sierra
必要なソフト:swftools、ffmpeg (Homebrewより導入)
事前準備
myplayer-release.swfのダウンロード
認証のための事前準備としてswfファイルをダウンロードする
$ curl -O http://radiko.jp/apps/js/flash/myplayer-release.swf
swfファイルから画像ファイルを取り出す
認証にキーとなる画像ファイルをswfextractで取り出す
$ swfextract myplayer-release.swf -b 12 -o authkey.png $ ls authkey.png authkey.png
実行
ログイン処理
エリアフリーの番組を保存する場合、この手順が必要になります。
最後のmailとpassにプレミア会員登録しているメールアドレスとパスワードを設定します。
$ curl -c cookie.txt 'https://radiko.jp/ap/member/login/login' \ -XPOST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Referer: http://radiko.jp/' \ -H 'Pragma: no-cache' \ -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30' \ -H 'X-Radiko-Device: pc' \ -H 'X-Radiko-App-Version: 4.0.0' \ -H 'X-Radiko-User: test-stream' \ -H 'X-Radiko-App: pc_ts' \ --data 'mail=aaaa@example.com&pass=password'
実行すると、cookie.txtにクッキーが保存されます。
以降のcurlコマンドではこのファイルを-bオプションで指定します。
認証1
認証1のURLにアクセスし、HTTPのレスポンスヘッダーから以下の3つの値を取得する
・X-Radiko-AuthToken
・X-Radiko-KeyLength
・X-Radiko-KeyOffset
$ curl -b cookie.txt 'https://radiko.jp/v2/api/auth1_fms' \ > -XPOST \ > -H 'Content-Type: application/x-www-form-urlencoded' \ > -H 'Referer: http://radiko.jp/' \ > -H 'Pragma: no-cache' \ > -H 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ > -H 'X-Radiko-Device: pc' \ > -H 'X-Radiko-App-Version: 4.0.0' \ > -H 'X-Radiko-User: test-stream' \ > -H 'X-Radiko-App: pc_ts' \ > --data $'\r\n' X-Radiko-AppType=pc X-Radiko-AppType2=pc X-Radiko-AuthToken=AJReLqXV-Oo4ymYpgRlhow X-Radiko-AuthWait=0 X-Radiko-Delay=15 X-Radiko-KeyLength=16 X-Radiko-KeyOffset=121394 please send a part of key
事前準備でダウンロードしたキーとなる画像ファイルから、X-Radiko-KeyOffsetがオフセット、X-Radiko-KeyLengthが長さとなるデータを抽出する。
UNIXのddコマンドを使って抽出する。なお、抽出したデータはBase64で文字列に変換する。
$ dd if=authkey.png ibs=1 skip=121394 count=16 | base64 16+0 records in 0+1 records out 16 bytes transferred in 0.000669 secs (23916 bytes/sec) kwMYHYGpTwcgn8OlMjBjyQ==
「kwMYHYGpTwcgn8OlMjBjyQ==」が認証2で使うParticalkeyとなる
認証2
認証2のURLに対して、AuthTokenとParticalkeyをPOSTする
curl -b cookie.txt 'https://radiko.jp/v2/api/auth2_fms' \ -XPOST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Referer: http://radiko.jp/' \ -H 'Pragma: no-cache' \ -H 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ -H 'X-Radiko-Device: pc' \ -H 'X-Radiko-Authtoken: AJReLqXV-Oo4ymYpgRlhow' \ -H 'X-Radiko-App-Version: 4.0.0' \ -H 'X-Radiko-User: test-stream' \ -H 'X-Radiko-Partialkey: kwMYHYGpTwcgn8OlMjBjyQ==' \ -H 'X-Radiko-App: pc_ts' JP13,東京都,tokyo Japan
応答として地域の情報が帰ってくると認証は成功。
プレイリストの取得と音声の保存
プレイリスト取得用のURL(https://radiko.jp/v2/api/ts/playlist.m3u8)に対して、クエリとして放送局IDと開始、終了時間を指定してするとプレイリストを取得できます。
なお、lというクエリには15を指定するらしいのですが、意味は不明です。
放送局IDについてはググると出てくると思います。
curl -b cookie.txt 'https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=MBS&l=15&ft=20181013222500&to=20181013235500' \ -XPOST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Referer: http://radiko.jp/' \ -H 'Pragma: no-cache' \ -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ -H 'X-Radiko-Authtoken: AJReLqXV-Oo4ymYpgRlhow' \ --data 'flash=1' #EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=52973,CODECS="mp4a.40.5" https://radiko.jp/v2/api/ts/chunklist/GTgzFQEx.m3u8
これをffmpegの引数として渡すことで、音声の保存が可能です。
なお、ffmpegの実行時はCookieを送信する必要はありません。
ffmpeg \ > -content_type 'application/x-www-form-urlencoded' \ > -headers 'Referer: http://radiko.jp/' \ > -headers 'Pragma: no-cache' \ > -headers 'X-Radiko-AuthToken: AJReLqXV-Oo4ymYpgRlhow' \ -user_agent 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' \ > -i 'https://radiko.jp/v2/api/ts/chunklist/GTgzFQEx.m3u8' \ > -vn -acodec copy -bsf aac_adtstoasc out.m4a
iTunes等で聴けるように、ffmpegのオプションでm4a形式で保存するようにしています。
まとめ
以上の手順によってradikoのエリアフリーを保存することが出来ます。
コメント