ラジコの Auth1 認証に続いて Auth2 認証をVisual Basic で行う場合のサンプルの話です。
Auth2でやることは、Auth1で受け取ったAuthtoken と計算したパーシャルキーをサーバーに送り返して認証を完了させること。
もし、エリアフリーで他エリア放送局番組を聞きたい場合は、この時、ラジコプレミアムログインステージで入手した radiko_session 情報も一緒に送ることになります。radiko_session が無い場合は、プレミアムログイン完了していても無料会員と同じ扱いになります。
以下が、auth2 のHTTPリクエストサンプルです。赤字の部分が、トークンとパーシャルキー。紫の部分は、Auth1と共通部分、青がAuth2 の URLです。この例は、無料会員、または未登録の場合です。
curl.exe -c cookie.txt -H "X-Radiko-AuthToken: 4zo46V1uLHCvwWmTn4XN5Q" -H "X-Radiko-PartialKey: YmNkMTUxMDczYzAzYjM1Mg==" -H "X-Radiko-User: dummy_user" -H "X-Radiko-Device: pc" -L https://radiko.jp/v2/api/auth2
次のようなレスポンスが返ってくるはずです。
HTTP/1.1 200 OK Server: nginx Date: Sat, 19 Nov 2022 12:22:38 GMT Content-Type: text/plain Connection: keep-alive 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, X-Radiko-SubStation Access-Control-Allow-Credentials: true
HTTPレスポンスが200であれば、その他には特に処理する情報はありません。
Auth1, Auth2 をまとめて処理するスクリプト。(無料ユーザー用)
Imports System.Text
Module auth
Sub Main(args As String())
'まず、Auth1ようのレスポンスを処理する文字列と入れ物を準備
' radiko.jp にアクセスするためのカギが含まれている固定文字列
Dim _authkey As String = "bcd151073c03b352e1ef2fd66c32209da9ca0afa"
' Auth1を行うとレスポンスに含まれる文字列名と、それを小文字で処理するための定義
Dim str_token As String = "X-Radiko-AuthToken:"
' l_ は lower という意味で、変数名の頭に付けています。中身は、x-radiko-authtoken:
Dim l_str_token As String = str_token.ToLower()
Dim str_length As String = "X-Radiko-KeyLength:"
Dim l_str_length As String = str_length.ToLower()
Dim str_offset As String = "X-Radiko-KeyOffset:"
Dim l_str_offset As String = str_offset.ToLower()
'最終的に Auth1 からトークンと、長さとオフセット情報が必要になるので、次の3つの入れ物を準備しておく
Dim x_token As String = ""
Dim x_length As Integer = 0
Dim x_offset As Integer = 0
Dim auth1_para1 As String = "curl.exe -s -c cookie.txt "
Dim auth1_para2 As String = "-H ""X-Radiko-App: pc_html5"" "
Dim auth1_para3 As String = "-H ""X-Radiko-App-Version: 0.0.1"" "
Dim auth1_para4 As String = "-H ""X-Radiko-User: dummy_user"" "
Dim auth1_para5 As String = "-H ""X-Radiko-Device: pc"" "
Dim auth1_para6 As String = "-L https://radiko.jp/v2/api/auth1"
Dim auth1_curl As String = auth1_para1 & auth1_para2 & auth1_para3 & auth1_para4 & auth1_para5 & auth1_para6
Dim p As New Process()
'Windows環境変数から ComSpec(cmd.exe)のパスを取得して、FileNameにセット
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
'出力を読み取れるようにする
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardInput = False
'ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = True
'コマンドラインを指定("/c"は実行後閉じるために必要)
p.StartInfo.Arguments = "/c" & auth1_curl
'デバッグ用ライン、どんなコマンドが発行されたかを表示して一行開ける。
Console.WriteLine(auth1_curl)
Console.WriteLine()
'起動
p.Start()
'コマンド実行結果を読み取る
Dim results = p.StandardOutput.ReadToEnd()
Console.WriteLine(results)
'ラジコから返ってくるレスポンスを取り込む配列を準備する
'改行コードまでを一つに文字列とするためにデリミターを vbCr に設定。vbCr はラジコ側の文字コードによります
'レスポンスを順番に配列に取り込みます。
Dim heads() As String = results.Split(vbCr)
'配列内の値を1個ずつチェックして、必要なヘッダーか不要なものかを判断します。不要なものは捨てる。
For Each head As String In heads
If head.ToLower.Contains(l_str_token) = True Then
'Auth1のトークンは、このあと何回も使うので、変数に取り込んで再利用する
x_token = head.Remove(0, 21)
Console.WriteLine("Authtoken: " & x_token)
ElseIf head.ToLower.Contains(l_str_length) = True Then
x_length = head.Remove(0, 21)
Console.WriteLine("KeyLength: " & x_length)
ElseIf head.ToLower.Contains(l_str_offset) = True Then
x_offset = head.Remove(0, 21)
Console.WriteLine("KeyOffset: " & x_offset)
End If
Next
'
Dim partial_key As String = Convert.ToBase64String(Encoding.UTF8.GetBytes(_authkey.Substring(x_offset, x_length)))
Console.WriteLine("PartialKey: " & partial_key)
Console.WriteLine()
'Auth1同様、curlコマンドから引き渡すパラメータをいったん分解して定義し、あとで組み立てるようにします。
'Auth1とパラメータが共通なオプションは、ここでは定義せず、Auth1で定義したものを再利用します。
Dim auth2_para1 As String = "curl.exe -c cookie.txt -H ""X-Radiko-AuthToken: " & x_token & """ "
Dim auth2_para2 As String = "-H ""X-Radiko-PartialKey: " & partial_key & """ "
Dim auth2_para4 As String = "-L https://radiko.jp/v2/api/auth2"
Dim auth2_curl As String = ""
auth2_curl = auth2_para1 & auth2_para2 & auth1_para4 & auth1_para5 & auth2_para4
p.StartInfo.Arguments = "/c" & auth2_curl
'トークン返信を起動
p.Start()
'出力を読み取る
results = p.StandardOutput.ReadToEnd()
Console.WriteLine(auth2_curl)
Console.WriteLine()
Console.WriteLine(results)
Console.WriteLine()
End Sub
End Module
このあとで、ffmpeg.exe 様に番組録音をお願いすることになります。