ラジコ:radiko.jp の認証とプログラム処理についてのmemo

先月(2022/10)から、約1か月かけて radiko.jpを無料アクセス、ラジコプレミアムログインする方法に関して調査し、実験し、スクリプトを組めるようになりました。

参考にしたサイトは、前のページに記述した通り。

現時点(2022年11月)で radiko.jp に関して調査して大変になるのが、正しい情報がわからないってことです。

ラジコは当初、Adobe Flashプラグインで受信する仕組みでした。ラジコプレミアムやラジコタイムフリーが始まり、Flashストリームによる配信が終わり、現在は HTML Live Stream(HLS)による配信に切り替わっています。

こういう歴史があるためラジコ録音スクリプトを作ろうとWeb検索すると、過去情報にもかなりの確率でヒットしてしまいます。過去情報が役に立たないとは言いません。番組情報取得方法など、変わっていない点もありますからね。しかし、廃止されたプロトコルを学んでもプログラムには役に立ちません。検索でヒットした情報が利用可能なのかどうか?ということを知るのが今現在の難しい点です。

今回、前述の非常に参考になる三つのサイトを見つけることが出来たのはラッキーでした。

以下、ラジコタイムフリーから録音するための認証についてメモします。

まずは、大きな流れから。

認証は全部で3回、そしてプレイリストに従って録音するコマンド発行、最後に終了処理という5段階の手続きです。
以下、1-3 の手続きは、curl または wget コマンドを使って行うのが便利です。Windows10の場合は、curl が標準で入っているので、curl.exe コマンドを使用するのが便利でしょう。4番目は curl でプログラムするのは骨が折れるので、ffmpeg.exe をインストールして処理します。

  1. 最初がラジコプレミアムログイン用の認証ですが、無料会員や未ログインで使用するユーザーには不要な手続きなので省略可能。
    この作業で重要なのは、「https://radiko.jp/v4/api/member/login」へアカウント情報を送り、セッションID(radiko_session)が含まれたレスポンスを受け取ること。会員登録があるユーザーにのみ帰ってきます。
    無料会員もログインできますが、エリアフリーは無効。
    会員アカウントが未登録や退会済みの場合は、HTTPレスポンス 400 となります。つまりエラー。
  2. 次が Auth1。HTTPで規定のヘッダー情報を「https://radiko.jp/v2/api/auth1」へ送ることにより、
    • AuthToken(文字列)
    • Key長 (数値)
    • Keyオフセット (数値)
      を受け取ります。無料ユーザーは、1を省略してこのプロトコルから始めればいい。
      成功すると、HTTP レスポンス 200 で終わります。AuthToken は、このあと、ラジコと通信する時に常に必要となるトークンとなります。
    • そうそう、日本国内のIPアドレスからアクセスしていない、海外からのアクセスと誤判定された場合、多分、HTTPレスポンス はエラー400 になると思います。(試せないので推測のみ。)
  3. 続いて、Auth2。無料ユーザーとラジコプレミアムユーザーで異なる通信パラメータとなります。
    まず、固定のauthkey文字列(これは、ラジコホームページに記述されている公開データ)から、Auth1手続きで返ってきた、Key長番目 ~ +オフセット番目の文字列を切り出します。
    さらに、その値をbase64変換し、パーシャルキーにします。
    HTTP通信で、AuthToken、パーシャルキー、固定ヘッダー情報を「https://radiko.jp/v2/api/auth2」に送って、HTTPレスポンス200が返ってくると、無料ユーザー用の認証が完了。
    プレミアム会員の場合は、「https://radiko.jp/v2/api/auth2」ではなく、「https://radiko.jp/v2/api/auth2?radiko_session=<1で返ってきたセッションID>」をアクセスします。
    どちらのURLでもHTTPレスポンス200が返ってくるはずで、ラジコプレミアムログインに成功しているのか無料ユーザーとして判断されているかはわかりません。エラーになったらやり直し。
  4. ここまで成功していれば、あとは番組をダウンロードするだけ。
    ffmpeg コマンドの使い方は、上記の curl を使う場合とほぼ同じ(コマンド名が異なるだけ)で、Auth1 で返ってきたAuthToken をHTTPヘッダーにして、「https://radiko.jp/v2/api/ts/playlist.m3u8」をアクセスします。番組情報は、m3u8の後ろに ? をくっつけてCGIパラメーターとして & でパラメータをつなぐ形で、station_id=TBS&l=15&ft=ダウンロード開始時刻&to=ダウンロード終了時刻 のように渡します。
    更に、ffmpegオプションで、送られてくる番組データを保存するファイル形式とファイル名を与えると、ffmpeg さんが、エラー処理を含めて作業してくれるので録音の終了を待ちます。
  5. ラジコプレミアムからのログオフ作業、プログラム終了処理。
    この作業を忘れると、ログインしっぱなしと判断されて、一ユーザーあたりのMaxを越えると、エリアフリーにアクセスできなくなったり、Windowsのリソースをつかみ続けたりしますので終了処理もお忘れなく。

という流れになりますが、この手順は uru さんの、rec_radiko_ts にちゃんと組み込まれているので、シェルが使える環境なら、自分で何とかしようとせず、rec_radiko_ts を利用させてもらうのがおすすめ。

私の場合は、この処理をVisual Basicで書くことにしたので、大変でした。
Visual Basicの間違いやすい点は、変数と型の宣言場所。行き当たりばったりで定義してもそこそこ動くので、後々プログラムサイズが大きくなった時に大変になりました。最初からちゃんと仕様書を書いてから作業しないと。。。。。

具体的な処理プログラムに関しては、現在公開中の RadikoPad_cmd.exe をちゃんと作り直してからにしたいと思います。

コメントを残す