ラジコの録音、東京の放送を取得する一案(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で諦める、と言った形です。