radikoがJSになってた
swftoolsいらない可能性があるので追いかける。
auth1 /auth2
従来通り、auth1 / auth2 に投げるのは変化なし。
auth1 で auth_token を貰ってきて auth2 で auth_token で署名をもらうイメージ
auth1 にリクエストを投げて、次の値を取る。
< X-Radiko-AuthToken: m_9ub1okKzi1vctuMS0NNg < X-Radiko-KeyLength: 16 < X-Radiko-KeyOffset: 6
auth_token がセッションキー
だいたいこんな感じだった。
/// auth 1 の値を持っておいて var auth_token var auth_key = "bcd151073c03b352e1ef2fd66c32209da9ca0afa" // 現状は固定 var key_length var key_offset x = str2Buffer( auth_key ) y = new Uint8Array(b, key_offset,key_length ) for (var r = y, a = "", i = 0; i < r.length; i++){ a += String.fromCharCode(r[i]); } partial_key = btoa(a) ///auth2へ
str2Buffer = (e) => { return new Uint8Array([].map.call(e, function(e) { return e.charCodeAt(0) })).buffer }
メッチャバイト列に戻してるけどそれいるのか
auth2 のリクエスト
fetch("https://" + location.host + "/v2/api/auth1", { headers: { "X-Radiko-App": this._appId, // pc_html5固定 "X-Radiko-App-Version": "0.0.1", "X-Radiko-User": "dummy_user", "X-Radiko-Device": this._device //'pc' 固定 }, method: "get", credentials: "include" }).
auth1 は curl で直叩き出来る
curl -v \ -H 'X-Radiko-App: pc_html5' \ -H 'X-Radiko-App-Version: 0.0.1' \ -H 'X-Radiko-User: dummy_user' \ -H 'X-Radiko-Device: pc' \ https://radiko.jp/v2/api/auth1 * Trying 203.211.199.120... * TCP_NODELAY set * Connected to radiko.jp (203.211.199.120) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * Server certificate: radiko.jp * Server certificate: RapidSSL SHA256 CA * Server certificate: GeoTrust Global CA > GET /v2/api/auth1 HTTP/1.1 > Host: radiko.jp > User-Agent: curl/7.56.1 > Accept: */* > X-Radiko-App: pc_html5 > X-Radiko-App-Version: 0.0.1 > X-Radiko-User: dummy_user > X-Radiko-Device: pc > < HTTP/1.1 200 OK < Server: nginx < Date: Wed, 08 Nov 2017 18:06:18 GMT < Content-Type: text/plain < Transfer-Encoding: chunked < Connection: keep-alive < X-Radiko-AppType: pc < X-Radiko-AppType2: pc < X-Radiko-AuthToken: iTzjvyV51b5KGS6i4yaLsA < X-Radiko-AuthWait: 0 < X-Radiko-Delay: 15 < X-Radiko-KeyLength: 16 < X-Radiko-KeyOffset: 0 < Access-Control-Expose-Headers: X-Radiko-AuthToken, X-Radiko-Partialkey, X-Radiko-AppType, X-Radiko-AuthWait, X-Radiko-Delay, X-Radiko-KeyLength, X-Radiko-KeyOffset < Access-Control-Allow-Credentials: true
auth2
auth2 のリクエスト
fetch("https://" + location.host + "/v2/api/auth2", { headers: { "X-Radiko-AuthToken": this._token, "X-Radiko-Partialkey": this._partialKey, "X-Radiko-User": "dummy_user", "X-Radiko-Device": this._device // 'pc' 固定 }, method: "get", credentials: "include"
なんでわざわざJSにはUInt8ArrayやArrayBufferのバイナリ処理が入ってるのかよくわからない。元が文字列なら、str.split('')で良いんだし。わざわざバイナリ処理にしてるってことは、将来的に auth_key を画像とかバイナリとか暗号化データにするつもりなんだろうかね
auth_key の文字列をレスポンスのoffset と length 分だけ切り取ってbase64するだけなので以前に比べると楽になってるんじゃなかろうか。たぶんcurl と bashだけで簡単にかける。眠いのでまた明日。