LoginSignup
2
1

More than 1 year has passed since last update.

TOKYO FMのjet streamをphpで録音したい。

Last updated at Posted at 2022-07-22

初めに

私は、ある時から東京FMで深夜12:00〜1:00で放送されるジェットストリームというラジオ番組にハマってしまい、毎日聞くことがことが日課になっています。
そこで、どんな音楽が今日流れていたのか、などを昼に確認したかったので、phpで東京FMを録音するスクリプトを作ってみました。
注意!・このスクリプトはradikoのシステムにアクセスをします。ddos攻撃的なことになりかねませんので、最低1分間、実行間隔を空けてください。

欲しい機能

  • ラジオを録音する
  • できれば東京FM以外も録音できるように。

案1・受信

ラジオを受信することを考えてみはしたのですが、さすがに無理だと思い、断念。

案2・php以外で?(ラズパイとか)

予算の関係で、断念。

案3・HLSを受信するか・・・

これはいけそうな気がする。やってみよう。

どこで配信しているのか探してみる。

まずは東京FMのホームページを開いてみます。
するとメニューに「ポッドキャスト」という項目がある。
「使えるかも?」と思って、みてみたけどjet streamはないみたい。
まあ、これでやったら東京FMしか聞けなくなっちゃうからどっちにしろやめるだろうけど。

と、がっかりしていると、東京FMのホームページの下の方にこんなことが書かれていました。
2E7E4D4A-ED86-4343-A4AF-BBD0A1384D9E.jpeg
ひらめいた!radikoを使えばいいんだ。

radikoのHLSを探してみる。

radikoのHLSを探してみましょう。
開発者ツールのネットワークから、m3p8を探して...
ありました。
さあ、アクセスしてみましょう。

ガーン😨

アクセスはしてみたものの、黒い画面が表示されるだけ。
D5949312-629C-428B-A4B3-6783D062EAC3.jpeg

どうやらアクセストークンとか色々必要らしいです。
どうしよう・・・

検索してみたら。

どうしよう・・・と思って、検索していたらこんな神サイトを見つけました。
https://blog.bluedeer.net/archives/216
radiko録音(ダウンロード)への道 その1
「途中まで僕のやろうとしてることと一緒やないかい!」

言われた通りに実装してみる。

<pre>
<?php
ini_set('display_errors', 'On');
?>
<?php
global $auth_t;
global $pry;
$headers = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    'X-Radiko-App: pc_html5',
    'X-Radiko-App-Version: 0.0.1',
    'X-Radiko-Device: pc',
    'X-Radiko-User: dummy_user',
    );

$url = 'https://radiko.jp/v2/api/auth1';
$ch = curl_init(); // はじめ
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$html = curl_exec($ch);
$html = mb_convert_encoding($html, 'UTF-8', 'EUC-JP');
//var_dump($html);
$html0 = explode("\n", $html);
var_dump($html0);
$auth_t = $html0[8];
$auth_1 = $html0[11];
$auth_2 = $html0[12];
$auth_1 = str_replace('X-Radiko-KeyLength: ', '', $auth_1);
$auth_2 = str_replace('X-Radiko-KeyOffset: ', '', $auth_2);
curl_close($ch); //終了
?>
<?php
$auth = 'bcd151073c03b352e1ef2fd66c32209da9ca0afa';
$pry = base64_encode(mb_substr($auth, ($auth_2), $auth_1));
echo "\n";
$headers2 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );
var_dump($headers2);

$url2 = 'https://radiko.jp/v2/api/auth2';
$ch2 = curl_init(); // はじめ
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers2);

$html2 = curl_exec($ch2);
$html2 = mb_convert_encoding($html2, 'UTF-8', 'EUC-JP');
var_dump($html2);
curl_close($ch2); //終了

$headers3 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

//$url3 = "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=FMT&l=15&ft=1658404794&to=1658404794";
//$url3 = "https://radiko.jp/v2/station/stream_smh_multi/FMT.xml";
//$url3 = "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/playlist.m3u8";
$url3 = 'http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/chunklist_w1377524876.m3u8';
echo $url3;
$ch3 = curl_init(); // はじめ
curl_setopt($ch3, CURLOPT_URL, $url3);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch3, CURLOPT_HTTPHEADER, $headers3);

$html3 = curl_exec($ch3);
$html3 = mb_convert_encoding($html3, 'UTF-8', 'EUC-JP');
var_dump($html3);
curl_close($ch3); //終了


$html4 = explode("\n", $html3);
echo '=========';
var_dump($html4);

function save($media)
{
    global $auth_t;
    global $pry;
    $headers4 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

//$url3 = "https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=FMT&l=15&ft=1658404794&to=1658404794";
//$url3 = "https://radiko.jp/v2/station/stream_smh_multi/FMT.xml";
//$url3 = "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/playlist.m3u8";
$url4 = $media;
    echo $url4;
    $ch4 = curl_init(); // はじめ
curl_setopt($ch4, CURLOPT_URL, $url4);
    curl_setopt($ch4, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch4, CURLOPT_HEADER, true); // ヘッダも出力したい場合
//ヘッダー追加オプション
curl_setopt($ch4, CURLOPT_HTTPHEADER, $headers4);

    $html5 = curl_exec($ch4);

    $okokokokok = curl_close($ch4); //終了

echo $media;
    echo '<BR>';
    $name = explode('/', rtrim($media));
    var_dump($okokokokok);
/*$fh = fopen("./radio/".$name[6], "w");
fwrite($fh,$okokokokok);
fclose($fh);*/
var_dump(file_put_contents($name[6], $okokokokok));
}

function download_image1($image_url, $image_file)
{
    $name = explode('/', rtrim($image_url));
    $image_file = $name[6];

    $fp = fopen('./radio/'.$image_file, 'w+');              // open file handle

global $auth_t;
    global $pry;
    $headers4 = array(
    'HTTP/1.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding:gzip ,deflate',
    'Accept-Language:ja,en-us;q=0.7,en;q=0.3',
    'Connection:keep-alive',
    'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0',
    $auth_t,
    'X-Radiko-PartialKey: '.$pry,
    'X-Radiko-User: dummy_user',
    'X-Radiko-Device: pc',
    );

    $ch = curl_init($image_url);
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want
    curl_setopt($ch, CURLOPT_FILE, $fp);          // output to file
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);      // some large value to allow curl to run for a long time
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
    curl_setopt($ch4, CURLOPT_HTTPHEADER, $headers4);
    // curl_setopt($ch, CURLOPT_VERBOSE, true);   // Enable this line to see debug prints
    curl_exec($ch);

    curl_close($ch);                              // closing curl handle
    fclose($fp);                                  // closing file handle
}
$coco = count($html4);

download_image1($html4[74], 'local_image1.jpg');
download_image1($html4[76], 'local_image1.jpg');
download_image1($html4[78], 'local_image1.jpg');
download_image1($html4[80], 'local_image1.jpg');
download_image1($html4[82], 'local_image1.jpg');
download_image1($html4[84], 'local_image1.jpg');
download_image1($html4[86], 'local_image1.jpg');
download_image1($html4[88], 'local_image1.jpg');
download_image1($html4[90], 'local_image1.jpg');
download_image1($html4[92], 'local_image1.jpg');
download_image1($html4[94], 'local_image1.jpg');
download_image1($html4[96], 'local_image1.jpg');

?>
</pre>

めっちゃ頑張りました。特に最後の関数(笑)

こんな感じで出力がされる

デバッグのためにvar_dump()で出力してます。

array(17) {
  [0]=>
  string(16) "HTTP/1.1 200 OK
"
  [1]=>
  string(14) "Server: nginx
"
  [2]=>
  string(36) "Date: Fri, 22 Jul 2022 08:50:44 GMT
"
  [3]=>
  string(25) "Content-Type: text/plain
"
  [4]=>
  string(27) "Transfer-Encoding: chunked
"
  [5]=>
  string(23) "Connection: keep-alive
"
  [6]=>
  string(21) "X-Radiko-AppType: pc
"
  [7]=>
  string(22) "X-Radiko-AppType2: pc
"
  [8]=>
  string(43) "X-Radiko-AuthToken: i-nRmKY62ZYAdEAWgZQW2w
"
  [9]=>
  string(21) "X-Radiko-AuthWait: 0
"
  [10]=>
  string(19) "X-Radiko-Delay: 15
"
  [11]=>
  string(23) "X-Radiko-KeyLength: 16
"
  [12]=>
  string(22) "X-Radiko-KeyOffset: 0
"
  [13]=>
  string(185) "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
"
  [14]=>
  string(39) "Access-Control-Allow-Credentials: true
"
  [15]=>
  string(1) "
"
  [16]=>
  string(25) "please send a part of key"
}



array(10) {
  [0]=>
  string(8) "HTTP/1.0"
  [1]=>
  string(71) "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  [2]=>
  string(29) "Accept-Encoding:gzip ,deflate"
  [3]=>
  string(39) "Accept-Language:ja,en-us;q=0.7,en;q=0.3"
  [4]=>
  string(21) "Connection:keep-alive"
  [5]=>
  string(92) "User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0"
  [6]=>
  string(43) "X-Radiko-AuthToken: i-nRmKY62ZYAdEAWgZQW2w
"
  [7]=>
  string(45) "X-Radiko-PartialKey: YmNkMTUxMDczYzAzYjM1Mg=="
  [8]=>
  string(25) "X-Radiko-User: dummy_user"
  [9]=>
  string(19) "X-Radiko-Device: pc"
}
string(402) "HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Jul 2022 08:50:44 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
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

JP13,?延根??tokyo Japan
"
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/chunklist_w1377524876.m3u8string(5437) "HTTP/1.1 200 OK
Accept-Ranges: bytes
Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
Server: WowzaStreamingEngine/4.8.5.05
Cache-Control: max-age=1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
Connection: Keep-Alive
Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range, X-Radiko-AuthToken, X-Radiko-AreaId
Date: Fri, 22 Jul 2022 08:50:44 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 4866

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:804518
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804518.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804519.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804520.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804521.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804522.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804523.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804524.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804525.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804526.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804527.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804528.aac
#EXTINF:5.12,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804529.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804530.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804531.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804532.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804533.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804534.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804535.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804536.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804537.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804538.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804539.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804540.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804541.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804542.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804543.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804544.aac
#EXTINF:5.12,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804545.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804546.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804547.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804548.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804549.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804550.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804551.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804552.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804553.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804554.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804555.aac
#EXTINF:4.992,
http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804556.aac
"
=========array(98) {
  [0]=>
  string(16) "HTTP/1.1 200 OK
"
  [1]=>
  string(21) "Accept-Ranges: bytes
"
  [2]=>
  string(74) "Access-Control-Expose-Headers: Date, Server, Content-Type, Content-Length
"
  [3]=>
  string(38) "Server: WowzaStreamingEngine/4.8.5.05
"
  [4]=>
  string(25) "Cache-Control: max-age=1
"
  [5]=>
  string(31) "Access-Control-Allow-Origin: *
"
  [6]=>
  string(39) "Access-Control-Allow-Credentials: true
"
  [7]=>
  string(55) "Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
"
  [8]=>
  string(23) "Connection: Keep-Alive
"
  [9]=>
  string(133) "Access-Control-Allow-Headers: Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range, X-Radiko-AuthToken, X-Radiko-AreaId
"
  [10]=>
  string(36) "Date: Fri, 22 Jul 2022 08:50:44 GMT
"
  [11]=>
  string(44) "Content-Type: application/vnd.apple.mpegurl
"
  [12]=>
  string(21) "Content-Length: 4866
"
  [13]=>
  string(1) "
"
  [14]=>
  string(7) "#EXTM3U"
  [15]=>
  string(16) "#EXT-X-VERSION:3"
  [16]=>
  string(23) "#EXT-X-TARGETDURATION:6"
  [17]=>
  string(28) "#EXT-X-MEDIA-SEQUENCE:804518"
  [18]=>
  string(31) "#EXT-X-DISCONTINUITY-SEQUENCE:0"
  [19]=>
  string(14) "#EXTINF:4.992,"
  [20]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804518.aac"
  [21]=>
  string(14) "#EXTINF:4.992,"
  [22]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804519.aac"
  [23]=>
  string(14) "#EXTINF:4.992,"
  [24]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804520.aac"
  [25]=>
  string(14) "#EXTINF:4.992,"
  [26]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804521.aac"
  [27]=>
  string(14) "#EXTINF:4.992,"
  [28]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804522.aac"
  [29]=>
  string(14) "#EXTINF:4.992,"
  [30]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804523.aac"
  [31]=>
  string(14) "#EXTINF:4.992,"
  [32]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804524.aac"
  [33]=>
  string(14) "#EXTINF:4.992,"
  [34]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804525.aac"
  [35]=>
  string(14) "#EXTINF:4.992,"
  [36]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804526.aac"
  [37]=>
  string(14) "#EXTINF:4.992,"
  [38]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804527.aac"
  [39]=>
  string(14) "#EXTINF:4.992,"
  [40]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804528.aac"
  [41]=>
  string(13) "#EXTINF:5.12,"
  [42]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804529.aac"
  [43]=>
  string(14) "#EXTINF:4.992,"
  [44]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804530.aac"
  [45]=>
  string(14) "#EXTINF:4.992,"
  [46]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804531.aac"
  [47]=>
  string(14) "#EXTINF:4.992,"
  [48]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804532.aac"
  [49]=>
  string(14) "#EXTINF:4.992,"
  [50]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804533.aac"
  [51]=>
  string(14) "#EXTINF:4.992,"
  [52]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804534.aac"
  [53]=>
  string(14) "#EXTINF:4.992,"
  [54]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804535.aac"
  [55]=>
  string(14) "#EXTINF:4.992,"
  [56]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804536.aac"
  [57]=>
  string(14) "#EXTINF:4.992,"
  [58]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804537.aac"
  [59]=>
  string(14) "#EXTINF:4.992,"
  [60]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804538.aac"
  [61]=>
  string(14) "#EXTINF:4.992,"
  [62]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804539.aac"
  [63]=>
  string(14) "#EXTINF:4.992,"
  [64]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804540.aac"
  [65]=>
  string(14) "#EXTINF:4.992,"
  [66]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804541.aac"
  [67]=>
  string(14) "#EXTINF:4.992,"
  [68]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804542.aac"
  [69]=>
  string(14) "#EXTINF:4.992,"
  [70]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804543.aac"
  [71]=>
  string(14) "#EXTINF:4.992,"
  [72]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804544.aac"
  [73]=>
  string(13) "#EXTINF:5.12,"
  [74]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804545.aac"
  [75]=>
  string(14) "#EXTINF:4.992,"
  [76]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804546.aac"
  [77]=>
  string(14) "#EXTINF:4.992,"
  [78]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804547.aac"
  [79]=>
  string(14) "#EXTINF:4.992,"
  [80]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804548.aac"
  [81]=>
  string(14) "#EXTINF:4.992,"
  [82]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804549.aac"
  [83]=>
  string(14) "#EXTINF:4.992,"
  [84]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804550.aac"
  [85]=>
  string(14) "#EXTINF:4.992,"
  [86]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804551.aac"
  [87]=>
  string(14) "#EXTINF:4.992,"
  [88]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804552.aac"
  [89]=>
  string(14) "#EXTINF:4.992,"
  [90]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804553.aac"
  [91]=>
  string(14) "#EXTINF:4.992,"
  [92]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804554.aac"
  [93]=>
  string(14) "#EXTINF:4.992,"
  [94]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804555.aac"
  [95]=>
  string(14) "#EXTINF:4.992,"
  [96]=>
  string(106) "http://f-radiko.smartstream.ne.jp/FMT/_definst_/simul-stream.stream/media-ueq6anegr_w1377524876_804556.aac"
  [97]=>
  string(0) ""
}

果たして録音できたのか?!

4BA8FC7C-AC7C-41C5-9AC9-3B7FCBAE263E.jpeg
ジャジャーン!
ちゃんと録音できてます。😁
一回の実行で1分間分保存されますので、10分なら1分毎に10回、GASとかでトリガー設定して動かしてください。
コロンがあればそちらでも構いません。一応、GASのコードも書いておきます。

function main() {
  // これにトリガーを設定してください。
  var url = "https://google.com";
  var response = UrlFetchApp.fetch(url);
  Logger.log(response.getContentText());
}

注意!・このスクリプトはradikoのシステムにアクセスをします。ddos攻撃的なことになりかねませんので、最低1分間、実行間隔を空けてください。

欠点

ただこれ、5秒くらいの音声がわかれて1分分保存されているんです。
これじゃあいちいち開かないといけないから面倒臭い。
どうにか連続して再生しましょう。

javascriptのaudioオブジェクトで連続再生。

関数は以下のサイトのものをほぼそのまま使わせてもらってます。
https://gist.github.com/yoshiiz/6134482f8fd72063e7221b7b82d27e67

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta http-equiv="content-language" content="ja">
	<meta name="robots" content="noindex,nofollow">
	<meta charset="UTF-8">
	<title>タイトル</title>
	<style type="text/css">
		font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', 'メイリオ', meiryo, sans-serif;
	</style>
</head>
<body>
    <?php
    $result = glob('./radio/*');
    echo "<script>";
    echo "var mList = new Array();";
    foreach($result as $file){
    	echo "mList.push('".$file."');\n";
    }
    echo "</script>";
    echo "<pre>";
    var_dump($result);
    echo "</pre>";
    ?>
    <button onclick="stop()">停止</button>
    <button onclick="play()" id="play">再生</button>
    
    <script type="text/javascript">
    'use strict';
    
    var playlist = mList;
    
    var audio = document.createElement('audio');
    document.body.appendChild(audio);
    audio.style.width = '100%';
    audio.style.height = 'auto';
    audio.controls = true;
    audio.volume = 0.2;
    
    audio.src = playlist[0];
    audio.play();
    
    var index = 0;
    audio.addEventListener('ended', function(){
      index++;
      if (index < playlist.length) {
        audio.src = playlist[index];
        audio.play();
      }
      else {
        audio.src = playlist[0];
        audio.play();
        index = 0;
      }
    });
    </script>
    <audio id='audio'></audio>
</body>
</html>

欠点は一つ一つのファイルの間がぶつ切れになってしまうことですかね・・・
まあそこは大目にみてください。

まとめ

  • phpのみでラジオを録音(厳密に言えば違うが...)することができた。
  • radikoのシステムはめんどくさい。

もし、コードに問題点・改善点(ありすぎると思うけど...)があればコメントとかから教えていただけると嬉しいです。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1