2009年4月4日からYouTubeの仕様が変更されたため、従来の方法ではブラウザ以外のプログラムからYouTubeにアクセスできなくなってしまいました。
ということで、自分なりにYouTubeの仕様を調べてわかったことをメモしておきたいと思います。
尚、以下の動画を検証用に使用しました。
「悪魔くん_主題歌」
http://www.youtube.com/watch?v=PkSVOlk3K2s&feature=sub
自分的にはカラーアニメ版の方がなじみ深いのですが、常習性のあるメロディーと歌詞にすっかりはまってしまいました。
<サーバ仕様>
(1)YouTubeサーバへの共通的なリクエスト手順
・HTTP/1.0でもHTTP/1.1のどちらでもリクエスト可能です。
・YouTubeのサーバはデータセンタでバーチャルホスト化されているはずなので、必ずHostヘッダを指定する必要があります。
また、HTTP/1.1の仕様で、HTTP/1.1で通信する場合は、Hostヘッダが必須です。
Hostヘッダを指定しない場合は、YouTubeのサーバはHTTPのステータスコード502を返し、エラーになります。
GET ~URL~ HTTP/1.1
User-Agent: Wget/1.11.4
Accept: */*
Host: ホスト名
Connection: Keep-Alive
例えば、以下のURLのデータを取得したい場合は、
http://www.youtube.com/get_video?video_id=PkSVOlk3K2s&t=vjVQa1PpcFPX1DPzlCM-MzbKg1P5YVQWQlvWgsb40ik=&el=detailpage&ps=&fmt=35
以下のhttpリクエストをYouTubeのサーバに送信します。
GET /get_video?video_id=PkSVOlk3K2s&t=vjVQa1PpcFPX1DPzlCM-MzbKg1P5YVQWQlvWgsb40ik=&el=detailpage&ps HTTP/1.1
User-Agent: Wget/1.11.4
Accept: */*
Host: www.youtube.com
Connection: Keep-Alive
(2)動画情報の取得
以下のURLをリクエストして取得した情報をスクレイピングすることで動画情報を取得することができます。
・http://www.youtube.com/watch?v=ビデオID
・http://www.youtube.com/get_video_info?video_id=ビデオID
(3)動画データの取得
・http://www.youtube.com/get_video?パラメータ群
-パラメータ:video_id
-パラメータ:t
トークンの取得方法は(2)動画情報の取得を参照のこと。
トークンには有効期間があるため、有効期限を過ぎると値が変わります。また、有効期限を過ぎたトークンを使用した時は、HTTP/1.0 410 Goneを返します。
私が試した限りでは、有効期間は数時間以内(感覚的には1時間以内)だと思います。
尚、トークンは、httpのアクセス毎に変わる、あるいは、クライアントのIP毎に変わると噂されていますが、恐らく関係ないと思います。
これは、複数のマシンから同じビデオID、トークンを指定しても問題なくアクセスできるためです。
-パラメータ:noflv
noflv=1が指定されている場合は、YouTubeのサーバは、HTTPのステータスコード204(No Content)を返し、動画データに関する情報を返しません。
(レスポンスヘッダのみでボディはありません)
noflv=1が指定されていない場合は、YouTubeのサーバは、HTTPのステータスコード303(See Other)で、動画データを取得できるURLにリダイレクトしてくれます。
よって、noflv=1を指定しなければ、従来通り、Perlなどの自作プログラムから動画データを取得することができます。
<YouTubeのFlash動画プレイヤー仕様>
(1)動画情報の取得
・http://www.youtube.com/watch?v=ビデオID
Google謹製のYouTubeのFlash動画プレイヤーは、上記ページのhtmlに埋め込まれていて、動画プレイヤーに指定されているパラメータから動画情報を取得するようになりました。
具体的には、JavaScript中のvar swfArgsに指定されているfmt_url_mapから、動画データを取得可能なURLを取得できます。
従来は、以下のURLをリクエストして動画データを取得していました。
http://www.youtube.com/get_video?video_id=ビデオID&t=トークン
最新のYouTubeのFlash動画プレイヤーは、noflv=1を指定してリクエストするようになりました。
http://www.youtube.com/get_video?video_id=ビデオID&t=トークン&noflv=1
これは、YouTubeの動画プレイヤーが、http://www.youtube.com/get_video?video_id=ビデオID~で動画データを取得しなくなったとを意味していると考えられます。
http://www.youtube.com/get_video?video_id=PkSVOlk3K2s&t=vjVQa1PpcFPX1DPzlCM-MzbKg1P5YVQWQlvWgsb40ik=&el=detailpage&ps=&fmt=35&noflv=1
ピンバック:Android Marketのハック事情:Vendingアプリを使わずにAndroid Marketのフリーのアプリをダウンロードする方法(未検証) « 突然消失するかもしれないブログ