ラジコの録音、東京の放送を取得する一案(3 トークンだけ取得
トークンを取得するだけのスクリプトを作ります。
最終的にちゃんと取得できているかを確認するためのrtmpdumpコマンドをエコー(表示)しています。
#!/bin/sh # TBS:TBSラジオ # QRR:文化放送 # LFR:ニッポン放送 # NSB:ラジオNIKKEI # INT:INTER FM # FMT:TOKYO FM # FMJ:J-WAVE # JORF:ラジオ日本 # BAYFM78:bayfm78 # NACK5:NACK5 # YFM:FMヨコハマ if [ $# -eq 1 ]; then CHANNEL=$1 else echo "usage : $0 CHANNEL" exit 1 fi CHANNEL=$1 RTMPDUMP=/usr/local/bin/rtmpdump FFMPEG=/usr/bin/ffmpeg MP3PATH=/home/mlin/html/mp3/ OUTFILEBASEPATH=./ OUTFILENAME=${OUTFILEBASEPATH}/`date +%Y-%m-%d` FLVFILEEXT=".flv" AACFILEEXT=".aac" MP3FILEEXT=".mp3" MARGINTIMEMIN=1 # RECTIME=`expr ${RECTIMEMIN} \* 60 + ${MARGINTIMEMIN} \* 2 \* 30` # 30sec wait # echo "===== `date` Wait 30sec. =====" # for f1 in 0 # do # for f2 in 9 8 7 6 5 4 3 2 1 0 # do # echo -n "$f1$f2\r" # sleep 1 # done # done #開始時刻 START=`date +%s` cd ${OUTFILEBASEPATH} playerurl=http://radiko.jp/player/swf/player_3.0.0.01.swf playerfile=./player.swf keyfile=./authkey.png # # get player # if [ ! -f $playerfile ]; then wget -q -O $playerfile $playerurl if [ $? -ne 0 ]; then echo "failed get player" exit 1 fi fi # # get keydata (need swftools) # if [ ! -f $keyfile ]; then swfextract -b 14 $playerfile -o $keyfile if [ ! -f $keyfile ]; then echo "failed get keydata" exit 1 fi fi if [ -f auth1_fms_${CHANNEL} ]; then rm -f auth1_fms_${CHANNEL} fi # # access auth1_fms # for var in 3 5 7 9 10 0 do wget -q \ --header="pragma: no-cache" \ --header="X-Radiko-App: pc_1" \ --header="X-Radiko-App-Version: 2.0.1" \ --header="X-Radiko-User: test-stream" \ --header="X-Radiko-Device: pc" \ --post-data='\r\n' \ --no-check-certificate \ --save-headers \ --tries=5 \ --timeout=5 \ -O auth1_fms_${CHANNEL} \ https://radiko.jp/v2/api/auth1_fms if [ $? -ne 0 ]; then if [ $var -ne 0 ]; then # echo "failed auth1 process [$var sec sleep...retry]" sleep $var else # echo "[[[[ Failed auth1 process --- `date` --- ]]]]" exit; fi else # echo "sucsess auth1 process" break; fi done # # get partial key # authtoken=`cat auth1_fms_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)'` offset=`cat auth1_fms_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)'` length=`cat auth1_fms_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-keylength: (\d+)/i)'` partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64` # echo "authtoken: ${authtoken} \noffset: ${offset} length: ${length} \npartialkey: $partialkey" echo ${authtoken} rm -f auth1_fms_${CHANNEL} if [ -f auth2_fms_${CHANNEL} ]; then rm -f auth2_fms_${CHANNEL} fi # # access auth2_fms # for var in 3 5 7 9 10 0 do wget -q \ --header="pragma: no-cache" \ --header="X-Radiko-App: pc_1" \ --header="X-Radiko-App-Version: 2.0.1" \ --header="X-Radiko-User: test-stream" \ --header="X-Radiko-Device: pc" \ --header="X-Radiko-Authtoken: ${authtoken}" \ --header="X-Radiko-Partialkey: ${partialkey}" \ --post-data='\r\n' \ --no-check-certificate \ --tries=5 \ --timeout=5 \ -O auth2_fms_${CHANNEL} \ https://radiko.jp/v2/api/auth2_fms if [ $? -ne 0 -o ! -f auth2_fms_${CHANNEL} ]; then if [ $var -ne 0 ]; then echo "failed auth2 process [$var sec sleep...retry]" sleep $var else echo "[[[[ Failed auth2 process --- `date` --- ]]]]" exit; fi else echo "sucsess auth2 process" break; fi done echo "authentication success" areaid=`cat auth2_fms_${CHANNEL} | perl -ne 'print $1 if(/^([^,]+),/i)'` echo "areaid: $areaid" rm -f auth2_fms_${CHANNEL} echo rtmpdump -v \ -r "rtmpe://f-radiko.smartstream.ne.jp" \ --playpath "simul-stream.stream" \ --app "${CHANNEL}/_definst_" \ -W $playerurl \ -C S:"" -C S:"" -C S:"" -C S:$authtoken \ --live \ --flv ./test2.flv \ --stop 30 exit
少し工夫した部分は
for var in 3 5 7 9 10 0
の部分ですね。
トークンを得る際にエラーが出る場合を考慮して5回やり直します。
3.5.7と数値が書いてあるのは、その秒数スリープさせるためです、
連続でエラーになった場合には徐々に待ち時間を長くしています。
最後の0で諦める、と言った形です。
ディスカッション
コメント一覧
まだ、コメントがありません