ラジコ:Auth1認証をVisual Basic .Net で行うサンプル

今回はラジコ認証 Auth1 を Visual Basic で行うサンプル。

以前のメモでラジコプレミアムの認証についてメモを残しましたが、今回はその中の Auth1 段階の処理を行うサンプルを Visual Basic で書いてみました。

Auth1 プログラムの目的は、二つ。

  1. AuthToken を得ること
  2. パーシャルキーを組み立てるための情報(X-Radiko-KeyLength と X-Radiko-KeyOffset)

を得ることです。

所定の、プロトコルで、Auth1用のURLをアクセスすると、次のようなレスポンスが返されます。

具体的には、4つの X-Radiko-xxxx というヘッダー情報を使って、「https://radiko.jp/v2/api/auth1」をアクセスすること。

curl.exe -s -c cookie.txt 
-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" 
-I -L https://radiko.jp/v2/api/auth1

サーバーからのレスポンスが以下。

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 19 Nov 2022 08:32:11 GMT
Content-Type: text/plain
Connection: keep-alive
X-Radiko-AppType: pc
X-Radiko-AppType2: pc
X-Radiko-AuthToken: 4dhLDABgWMcmGl3OM-iTqQ
X-Radiko-AuthWait: 0
X-Radiko-Delay: 15
X-Radiko-KeyLength: 16
X-Radiko-KeyOffset: 3
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

この中で必要なのは、赤で記述した3行。
X-Radiko-Authtoken は特に加工することなくこの後で再利用します。
X-Radiko-KeyLength と X-Radiko-KeyOffset と 固定文字「bcd151073c03b352e1ef2fd66c32209da9ca0afa」からパーシャルキーを計算します。具体的には、固定文字列の、KeyLength 番目の文字からプラスKeyOffset分の文字列を取り出し、base64 エンコードしたものがパーシャルキーとなります。そして、Auth2 の通信で認証のために使用します。

その流れをVisual Basic で書いたものが以下のリスト。

Imports System.Text

Module auth1
    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 = "-I -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)

    End Sub
End Module

実行結果

Authtoken: 4dhLDABgWMcmGl3OM-iTqQ
KeyLength: 16
KeyOffset: 3
PartialKey: MTUxMDczYzAzYjM1MmUxZQ==

こんな感じ。

このあとで必要なものが、Authtoken と PartialKey。

Auth1 は、ラジコプレミアムの人、無料会員の人、未登録の人、いずれでもこのまま使用できます。

コメントを残す