最近為了要下載youtube上的影片,想說雖然可以透過網路上提供的工具下載,但還是嫌有
點麻煩,不過其實在使用上已經很方便了!如下面的一個link:
http://www.youtube.com/watch?v=XXXX您只要在domain name的youtube前加上link,變成
http://www.linkyoutube.com/watch?v=XXXX就可以連到一個網頁幫您下載video!說真的很
方便,當然你也可以透過安裝Google Chrome的plugin來下載等等。
不過,身為資訊人還真的有好奇到該怎麼去用程式下載,後來google了一下,發現這一兩年
youtube將download video的link做了一些處理(如:encode、需額外多加參數等),現在雖然透
過videoID可以去request得到一個get_video_info(網路上很多範例),但重點來了,很多人提到
url_encoded_fmt_stream_map所帶出一長串值有下載的link,但實際看了一下發現超長,後來才
知道裡面包含了很多種format(表示有好幾種下載的video format),而我要下載的video就提供了
五種,如下:
這就是url_encoded_fmt_stream_map 帶出的value,但我有先經過Java URLDecoder處理,在
這邊列出一部分!
quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=43&fallback_host=tc.v16.cache3.googlevideo.com&type=video/webm; codecs=vp8.0_vorbis&signature=OOXXOOXXOOXX&itag=43,quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=18&fallback_host=tc.v8.cache6.googlevideo.com&type=video/mp4; codecs=avc1.42001E_mp4a.40.2&signature=OOXXOOXXOOXX&itag=18
請注意!當你每次request得到一份新的url_encoded_fmt_stream_map都會有不一樣的參數編排,
說真的確實有點麻煩,像上面的例子是以quality=開頭,我測試了一下發現一共有將近六種
編排
分別是:
fallback_host=XXXX.....,fallback_host=OOOO.....
url=XXXX....,url=OOOO....
sig=XXXX....,sig=OOOO....
itag=XXXX....,itag=OOOO....
quality=XXXX....,quality=OOOO....
type=XXXX....,type=OOOO....
請注意這些參數的開頭所代表的就是一個format的video下載資訊,另外一部的video會以逗號做
分隔,上面六種的模式都一樣。
上面的一長串value我標藍色的部分在url的地方所帶出的link就是有效的下載連結,但還需要
額外加上signature=ooxx。
重點來了,除了基本的參數名需要特別加上外(下面有提到),參數名sparams內的值有時會額
外多出一些參數,這個也必須在download url加上,否則光是基本的參數加上還是無法下載!
sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire%2Cpcm2fr
就曾出現pcm2fr的參數名,導致雖然串接了基本參數及signature但連結還是失效!!
如此轉貼在chrome就可以進行線上播放,但如果連結有問題就會沒內容,得到403的回應!
額外補充如下:
1. signature=ooxx原本是叫sig=ooxx,在這邊轉貼出來的我已先透過程式轉換了
2. 由於有將近六種的格式編排,建議將這些value挑一種format存進HashMap內,到時再重新
串起download url,要注意的基本參數名大概是下列這一些:
String names[] = {"ip", "sver", "ipbits", "mt", "mv", "ratebypass", "source", "ms"
, "itag", "fexp", "sparams", "expire" , "upn", "key", "id", "signature"};
最後得到的就會是:
http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&sver=3&ipbits=0&mt=1386166496&mv=m&ratebypass=yes&source=youtube&ms=au&itag=18&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&expire=1386189082&upn=VSm8Q2j_vT4&key=yt5&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&signature=OOXXOOXX
要注意參數的名稱一定要對,還有不要重複!
3. type=video/webm; codecs=vp8.0_vorbi,這一段的參數原本_是, ,也記得先將它replace掉,
以免影響逗點的分割!
大致上應該就是這一些,主要是針對url_encoded_fmt_stream_map做說明,但難免youtube會再
更改url的編排與編碼方式!又或者有我沒發現的新編排,至少目前應該是可行的!
點麻煩,不過其實在使用上已經很方便了!如下面的一個link:
http://www.youtube.com/watch?v=XXXX您只要在domain name的youtube前加上link,變成
http://www.linkyoutube.com/watch?v=XXXX就可以連到一個網頁幫您下載video!說真的很
方便,當然你也可以透過安裝Google Chrome的plugin來下載等等。
不過,身為資訊人還真的有好奇到該怎麼去用程式下載,後來google了一下,發現這一兩年
youtube將download video的link做了一些處理(如:encode、需額外多加參數等),現在雖然透
過videoID可以去request得到一個get_video_info(網路上很多範例),但重點來了,很多人提到
url_encoded_fmt_stream_map所帶出一長串值有下載的link,但實際看了一下發現超長,後來才
知道裡面包含了很多種format(表示有好幾種下載的video format),而我要下載的video就提供了
五種,如下:
這就是url_encoded_fmt_stream_map 帶出的value,但我有先經過Java URLDecoder處理,在
這邊列出一部分!
quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=43&fallback_host=tc.v16.cache3.googlevideo.com&type=video/webm; codecs=vp8.0_vorbis&signature=OOXXOOXXOOXX&itag=43,quality=medium&url=http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&mt=1386166496&upn=VSm8Q2j_vT4&source=youtube&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&mv=m&key=yt5&ipbits=0&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&sver=3&ratebypass=yes&expire=1386189082&ms=au&itag=18&fallback_host=tc.v8.cache6.googlevideo.com&type=video/mp4; codecs=avc1.42001E_mp4a.40.2&signature=OOXXOOXXOOXX&itag=18
請注意!當你每次request得到一份新的url_encoded_fmt_stream_map都會有不一樣的參數編排,
說真的確實有點麻煩,像上面的例子是以quality=開頭,我測試了一下發現一共有將近六種
編排
分別是:
fallback_host=XXXX.....,fallback_host=OOOO.....
url=XXXX....,url=OOOO....
sig=XXXX....,sig=OOOO....
itag=XXXX....,itag=OOOO....
quality=XXXX....,quality=OOOO....
type=XXXX....,type=OOOO....
請注意這些參數的開頭所代表的就是一個format的video下載資訊,另外一部的video會以逗號做
分隔,上面六種的模式都一樣。
上面的一長串value我標藍色的部分在url的地方所帶出的link就是有效的下載連結,但還需要
額外加上signature=ooxx。
重點來了,除了基本的參數名需要特別加上外(下面有提到),參數名sparams內的值有時會額
外多出一些參數,這個也必須在download url加上,否則光是基本的參數加上還是無法下載!
sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire%2Cpcm2fr
就曾出現pcm2fr的參數名,導致雖然串接了基本參數及signature但連結還是失效!!
如此轉貼在chrome就可以進行線上播放,但如果連結有問題就會沒內容,得到403的回應!
額外補充如下:
1. signature=ooxx原本是叫sig=ooxx,在這邊轉貼出來的我已先透過程式轉換了
2. 由於有將近六種的格式編排,建議將這些value挑一種format存進HashMap內,到時再重新
串起download url,要注意的基本參數名大概是下列這一些:
String names[] = {"ip", "sver", "ipbits", "mt", "mv", "ratebypass", "source", "ms"
, "itag", "fexp", "sparams", "expire" , "upn", "key", "id", "signature"};
最後得到的就會是:
http://r2---sn-8xxuphx-u2xe.googlevideo.com/videoplayback?ip=121.254.65.252&sver=3&ipbits=0&mt=1386166496&mv=m&ratebypass=yes&source=youtube&ms=au&itag=18&fexp=904000%2C916605%2C939917%2C916623%2C901448%2C936912%2C936910%2C923305%2C936913%2C907231&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&expire=1386189082&upn=VSm8Q2j_vT4&key=yt5&id=o-AOdYnGB2lhSCpBCXeLgt3kEuco0Gr_flneFJYVYLEfxV&signature=OOXXOOXX
要注意參數的名稱一定要對,還有不要重複!
3. type=video/webm; codecs=vp8.0_vorbi,這一段的參數原本_是, ,也記得先將它replace掉,
以免影響逗點的分割!
大致上應該就是這一些,主要是針對url_encoded_fmt_stream_map做說明,但難免youtube會再
更改url的編排與編碼方式!又或者有我沒發現的新編排,至少目前應該是可行的!
請問這個方式現在依然可行嗎?
回覆刪除您好, 小弟我上一陣子有使用,但發現有些影音檔是無法下載的,由於串出來的URL被視為無效的連結,因此並不是百分之百可以達到下載的目的!頂多60 ~ 70%,也許有些情況可能有漏考慮到!orz
刪除