ユーザの思いとYoutubeの中の人の思いは、いつの日も交わることのない平行線です。
ユーザ側はYoutubeサイトを解析して動画ファイルの実体のありかを見つけ出し、Youtube側はサイトの仕組みを定期的に変更しています。
2月頃に解析してファイルのURLを特定出来たのですが、久しぶりに見てみるとまた仕組みが変更になっていました。
さて、いたちごっこの始まりです。
DOMやSAXなどを使って、<script>タグの中から以下が含まれる部分を探し出します。
※ちなみに2月に見たときとはこの変数名が変わっていました。
var ytplayer = ytplayer
これはソース上に一箇所しか表示されないので、すぐ特定出来ます。
該当の場所は以下のような感じで始まります。
<script>var ytplayer = ytplayer || {};ytplayer.config = {"url": "https:
この「ytplayer.config」の中には、以下のように様々な値がJSON形式で入っています。
- url
- url_v9as2
- attrs
- params
- url_v8
- args
- html5
- assets
- min_version
- sts
必要なのは「args」で、またこの中に100個近い値が入っていて、その内以下二つの値を利用します。
- url_encoded_fmt_stream_map
- title
「url_encoded_fmt_stream_map」の中には画質の数だけカンマ区切りでURLエンコードされたデータが入っています。
url=http://r9---sn-ogueynes.c.youtube.com/videoplayback?upn=IAD3bFZV614&mv=m&source=youtube&expire=1364660261&sparams=algorithm%2Cburst%2Ccp%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2Cexpire&algorithm=throttle-factor&cp=U0hVSVZRTl9LS0NONV9OS1JDOkQxNGtBcURXM0pG&id=215b73e77a669a55&sver=3&ms=au&burst=40&mt=1364634922&fexp=919112%2C910071%2C914073%2C916626%2C901449%2C932000%2C906383%2C902000%2C919512%2C929903%2C931202%2C900821%2C900823%2C931203%2C931401%2C908529%2C930807%2C919373%2C930803%2C906836%2C920201%2C929602%2C930101%2C930603%2C900824%2C910223&newshard=yes&factor=1.25&key=yt1&ip=114.185.103.241&itag=17&ipbits=8\u0026type=video/3gpp; codecs="mp4v.20.3, mp4a.40.2"\u0026sig=72F456D7BB44FD11E2FEEFF93BB7E299458D267B.B502EFA76F6358C09848C82085C4EEA0551AC8BA\u0026fallback_host=tc.v8.cache2.c.youtube.com\u0026quality=small\u0026itag=17
データ一つ一つを見ていくと、キーと値が「=」で対になった以下の値が、「\u0026」(&をアスキーコードの16進数であらわしたもの)で区切られています。
- url
- type
- sig
- fallback_host
- quality
- itag
「\u0026」で分割してキーと値に分けた後、「url」の値をデコードして「?」より前と後ろで分割します。
前はコレ。
http://r9---sn-ogueynes.c.youtube.com/videoplayback?
後ろには、キーと値が「=」で対になった以下の値が、「&」で区切られています。
これは全部使いますので、「&」で分割してキーと値に分けます。
- upn
- mv
- source
- expire
- sparams
- algorithm
- cp
- id
- sver
- ms
- burst
- mt
- fexp
- newshard
- factor
- key
- ip
- itag
- ipbits
これに「args」に入っていた「title」を加えます。
「title」はダウンロードした際のファイル名になるので、値はそのままでも個別に指定しても良いです。
「url_encoded_fmt_stream_map」の中にあった「sig」をキーを「signature」に変更して加えます。
キーでソートします。
あとは出来上がったキーと値の組み合わせを、以下のように「url」前半部分につなげてアクセスするだけでダウンロード出来ます。
http://URL?キー=値&キー=値&キー=値&キー=値
いたちごっこは終わらない。。