radikoのauthtokenを取得しよう

日本全国のラジオを聴けるradikoですが、ffmpegなどでダウンロードする場合、X-Radiko-AuthTokenが必要になります。
ここではそのトークンをphpで取得する方法を解説します。

m3u8エンドポイント:[https://tf-f-rpaa-radiko.smartstream.ne.jp/tf/playlist.m3u8?end_at={endtime}&endless=0&ft={starttime}&l=60&lsid=&start_at={starttime}&station_id={sid}&to={endtime}&type=b]
sid:放送局ID
starttime:開始日時:yyyyMMddHHmmss:例 20230401000000
endtime:終了日時:yyyyMMddHHmmss:例 20230401010000

auth1
  1. $header = array(
  2.     'X-Radiko-App: pc_html5',
  3.     'X-Radiko-App-Version: 0.0.1',
  4.     'X-Radiko-User: dummy_user',
  5.     'X-Radiko-Device: pc',
  6.     'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
  7. );
  8. $apiurl = 'https://radiko.jp/v2/api/auth1';
  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_URL, $apiurl);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  12. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  13. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  14. curl_setopt($ch, CURLOPT_HEADER, true);
  15. $fulldata = curl_exec($ch);
  16. $curlInfo = curl_getinfo($ch);
  17. $resheader = substr($fulldata,0,$curlInfo["header_size"]);
  18. $filedata = substr($fulldata,$curlInfo["header_size"]);
  19. $tmpHeader = explode("\r\n", trim($resheader));
  20. curl_close($ch);
  21. $responseHeaders = [];
  22. array_shift($tmpHeader);
  23. foreach ($tmpHeader as $header) {
  24.     $pos = strpos($header, ":");
  25.     if ($pos !== false) {
  26.         $key = substr($header, 0, $pos);
  27.         $value = trim(substr($header, $pos + 1));
  28.         $responseHeaders[$key] = $value;
  29.     }
  30. }
  31. $length = $responseHeaders["x-radiko-keylength"];
  32. $baye = $responseHeaders["x-radiko-keyoffset"];
  33. $pkey1 = substr('bcd151073c03b352e1ef2fd66c32209da9ca0afa',$baye);
  34. $pkey2 = substr($pkey1,0,$length);
  35. $pkey = $pkey2 ;
  36. $pakey = base64_encode($pkey);
  37. $auth = $responseHeaders["x-radiko-authtoken"];

auth2
  1. $header = array(
  2.     'X-Radiko-App: pc_html5',
  3.     'X-Radiko-App-Version: 0.0.1',
  4.     'X-Radiko-User: dummy_user',
  5.     'X-Radiko-AuthToken: '.$auth,
  6.     'X-Radiko-PartialKey: '.$pakey,
  7.     'X-Radiko-User: dummy_user',
  8.     'X-Radiko-Device: pc',
  9.     'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
  10. );
  11. $apiurl = 'https://radiko.jp/v2/api/auth2';
  12. $ch = curl_init();
  13. curl_setopt($ch, CURLOPT_URL, $apiurl);
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  15. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  16. $res = curl_exec($ch);
  17. $curlInfo = curl_getinfo($ch);
  18. curl_close($ch);

auth2の$resに”JP13,東京都,tokyo Japan”のように都道府県が返ってきたら成功です。
$authがAuthTokenになるので、X-Radiko-AuthTokenに指定しましょう。

※この方法はipアドレスに基づく都道府県のみ取得できます。
緯度経度を指定して全国の都道府県を取得する方法もありますが、かなりグレーなので説明しません。

コメント

タイトルとURLをコピーしました