#setlinebreak(on) &size(30){ここの記述はradikoの仕様変更のため古いものになりました。}; &size(24){新仕様対応については[[GetRadiko2.sh]]をごらんください。}; *GetRadiko.sh [#s96361b9] ここではRadiko用スクリプトを説明していきます。 [[GetAsf.sh]]と同じように無駄なコードを含みます。 #sh("bash"){{ #!/bin/sh export PATH=$PATH:/home/users/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin export LD_LIBRARY_PATH=/home/users/lib export PERL5LIB="/home/users/lib/perl5/lib/perl5:/home/users/lib/perl5/lib/perl5/perl5/i386-freebsd-64int" POSTURL="http://www8.puny.jp/uploader/upload/" if [ $# -eq 6 ]; then OUTFILEPREFIX=$1 RECTIMEMIN=$2 CHANNEL=$3 else echo "usage : $0 OUTFILEPREFIX RECTIMEMIN CHANNEL" exit 1 fi OUTFILEPREFIX=$1 RECTIMEMIN=$2 CHANNEL=$3 RTMPDUMP=/home/users/bin/rtmpdump FFMPEG=/home/users/ffmpeg OUTFILEBASEPATH=/home/users/REC OUTFILENAME=${OUTFILEBASEPATH}/`date '+%Y-%m-%d-%H%M'`-${OUTFILEPREFIX} AUAUDIR=`date '+%Y-%m'` FLVFILEEXT=".flv" AACFILEEXT=".aac" auau=`date '+%m%d'` #sleep 30 MARGINTIMEMIN=60 #RECTIME=`expr ${RECTIMEMIN} + ${MARGINTIMEMIN} \* 2 \* 15` RECTIME=`expr ${RECTIMEMIN} + ${MARGINTIMEMIN}` cd ${OUTFILEBASEPATH} playerurl=http://radiko.jp/player/swf/player_2.0.1.00.swf playerfile=/home/users/bin/player.swf keyfile=/home/users/bin/authkey.png # }} 引数のチェックといろいろな初期設定、変数の準備をします。 続いて認証作業を行います。 #sh("bash;first-line:51;highlight:[54,86,110,111,112,113,114,127]"){{ # get player # if [ ! -f $playerfile ]; then wget -q \ --tries=13 \ --retry-connrefused \ --waitretry=4 \ --timeout=10 \ -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 5 $playerfile -o $keyfile if [ ! -f $keyfile ]; then echo "failed get keydata" exit 1 fi fi if [ -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL} fi # # access auth1_fms # 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=10 \ --retry-connrefused \ --waitretry=5 \ --timeout=10 \ -O auth1_fms_${OUTFILEPREFIX}_${CHANNEL} \ https://radiko.jp/v2/api/auth1_fms if [ $? -ne 0 ]; then echo "failed auth1 process" exit 1 fi # # get partial key # authtoken=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-authtoken: ([\w-]+)/i)'` offset=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radiko-keyoffset: (\d+)/i)'` length=`cat auth1_fms_${OUTFILEPREFIX}_${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" rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL} if [ -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} fi # # access auth2_fms # 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 \ --retry-connrefused \ --waitretry=5 \ --tries=10 \ --timeout=10 \ -O auth2_fms_${OUTFILEPREFIX}_${CHANNEL} \ https://radiko.jp/v2/api/auth2_fms if [ $? -ne 0 -o ! -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then echo "failed auth2 process" exit 1 fi #echo "authentication success" areaid=`cat auth2_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/^([^,]+),/i)'` #echo "areaid: $areaid" rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} # }} 54行目でプレーヤのflashファイルを得ます。 71行目のswfextractはプレーヤflashファイルからバイナリデータ5番を取り出しているようです。 86行目は認証に必要なデータを取得するものです。 その応答内容から110~114行目で authtoken : 今回のパスフレーズ offset : オフセット length : 長さ を得てさらに swfextractで取り出したバイナリの先頭offset目からlength分のデータを抜き取りbase64エンコードしてアスキー文字列partialkeyに変換します。authtokenとpartialkeyを使って127行目で認証アクセスを行います。 うまくいけばエリアIDが帰ってきます。東京とか大阪とか接続元IPアドレスから識別されるアレです。これでauthtokenが認証されてこれを使ってストリームサーバに接続ができるようになります。このauthtokenは1時間有効だという話がありますが、定かではありません。 #sh("bash;:first-line:157;highlight:[162,198]"){{ # rtmpdump # RETRYCOUNT=0 while : do ${RTMPDUMP} -q \ -r "rtmpe://radiko.smartstream.ne.jp" \ --playpath "simul-stream" \ --app "${CHANNEL}/_defInst_" \ -W $playerurl \ -C S:"" -C S:"" -C S:"" -C S:$authtoken \ --live \ --flv ${OUTFILENAME}${FLVFILEEXT} \ --stop ${RECTIME} if [ $? -ne 1 -o `wc -c ${OUTFILENAME}${FLVFILEEXT} | awk '{print $1}'` -ge 10240 ]; then break elif [ ${RETRYCOUNT} -ge 5 ]; then echo "failed rtmpdump" exit 1 else RETRYCOUNT=`expr ${RETRYCOUNT} + 1` fi done rm -f $playerfile $keyfile # # # tmpa=${OUTFILENAME}${FLVFILEEXT} com=$4; dlpass=$5; rmpass=$6; tmpfile=/tmp/rrr.$$ filename=`basename $tmpa` upfile=${OUTFILENAME}-${CHANNEL}.zip cd /home/users/REC #zip -q -P $dlpass $upfile $filename gpg --options /home/users/.gnupg/opt.txt $filename #curl -s \ # -F "file=@$upfile;type=application/x-zip-compressed" \ # -F "comment=$com-$auau" \ # -F "download_pass=$dlpass" \ # -F "remove_pass=$rmpass" \ # -F 'code_pat=京' \ # --retry 5 \ # --retry-delay 10 \ # $POSTURL > $tmpfile # #INFO=/home/users/000/`basename $upfile`; #echo $POSTURL > $INFO #GetId.pl $tmpfile > $INFO.info # # POSTURL=`echo $POSTURL | sed 's/\/upload\//\/download\//'` # ID=`cat $INFO.info` # TW.pl "[`basename $upfile`] is uploaded. $POSTURL$ID.zip" >/dev/null #mv $upfile $filename.zip #rm -f $tmpfile DB=/home/users/.gnupg/Sessionkeys.db key=`gpg -o /dev/null --batch --show-session-key $filename.gpg 2>&1| perl -ne 'print $1 if (/gpg: session key:\s+.(\w+:\w+)/)'` outasffile=`basename $filename` sqlite3 $DB "insert into sKey values('$outasffile.gpg', '$key');" Update-crk.sh $OUTFILEBASEPATH/$outasffile.gpg curl -s \ -T "$filename.gpg" \ -u 'xxxxx:passpass' \ --retry 10 \ --retry-delay 10 \ --connect-timeout 120 \ --ftp-create-dirs \ ftp://ftp.4shared.com/Public/Radio/${AUAUDIR}/ >/dev/null TW.pl "[$outasffile.gpg] is uploaded." >/dev/null rm -f $filename.zip $filename.gpg exit 0; }} 162行目で実際にrtmpdumpで接続しています。リトライは5回します。 198行目でgpgでの暗号化をおこない、あとは[[GetAsf.sh]]と同じ処理が続きます。