作者iwhiori (玉米)
看板PHP
标题Re: [问题] 如何解析youtube的网址
时间Tue Feb 28 02:15:11 2012
最近我在做解析 youtube 网址并且下载这件事情...
(然後加上 ffmpeg 转出 ogg 音乐)
也参考了 Kej 的网站
稍微了解之後,我写了一份整理在我的网志
http://magicallove.twbbs.org/wordpress/?p=989
video_id 的取得很简单,我没有另外纪录
等我搞定下载问题会补上去吧XD
目前我解析出来之後遇到一个挺麻烦的问题
这个问题也让我联想到 Kej 的网站之所以要大家先下载一份文字档,再透过 js 解析。
这似乎有点关联!!
问题状况是,我解析出来的网址都没有办法直接使用 curl 下载
第一次使用 curl "link" > webm 输出到档案都会 20秒 timeout
但是紧接着再下一次 curl "link" > webm 就可以运作了
这什麽道理= =a
等我明天睡醒
试试看,再我的伺服器上面让它先去 curl get_video_info
但是为什麽 Kej 的网站可以第一次另存新档就成功?
是因为已经有先下载过那份文字档,等价於我 curl 失败的那次吗!
0.0
嗯,越写越开心,忍不住试了一下
好像果真如我猜测一般~
如果明天顺利的话!
我想个办法看看能不能把这个功能开发成为一个堪用的 api 给大家呼叫~~~
※ 引述《Kej (be me)》之铭言:
: ※ 引述《kenshieh (Not always blank)》之铭言:
: 网址有点眼熟..................... XD
: j75Kl7_ERdM 跟 lax-v239.lax 以及 em-ZhJDjayM 跟 ash-v250.ash
: 之间应该没有什麽关系,而只是单纯的 server hostname 罢了
: 你可以用 firebug 观察 flv 档案的 url,会发现多 reload 个几次
: hostname 是会变的(应该是影片的 server 有好几台)
: : 懒人做法( 不确定是不是全都可以用, 但随手试二三个都行 ):
: : // $source == '网页内容'
: : $pattern = '/watch_fullscreen\?video_id=([\w-]+)&l=\d+&t=([\w-]+)';
: : if (preg_match('#$pattern#s", $source, $m))
: : {
: : echo "GetTube: http://tw.youtube.com/get_video?video_id={$m[1]}&t={$m[2]}";
: : }
: 基本上要取得 youtube 的影片位址,最主要的参数就是 video_id 跟 t
: 像上面那样的作法是很 OK 的,我一开始也是这样的方式做的
: 可是当时间久了或量变大了之後,问题就来了
: 不晓得 youtube 是会侦测你今天总共 request 了几次还是会记录传输量
: 总之当程式抓网页抓到一个一定的量的时候,youtube 就会把你的连线挡了
: 过了一段时间之後才会再开放让你连线
: 当初我就一天到晚被挡,後来只好找 open proxy
: 後来我发现了一个方法,不需要找 proxy 也不会被 youtube 挡:
: 以 https://www.youtube.com/watch?v=em-ZhJDjayM 为例
: 我们可以知道他 embed 的标签里
: 影片的 src 会是 https://www.youtube.com/v/em-ZhJDjayM
: 而这个 url 会做 redirect
: 最後的网址就像下面这样:(三行连起来)
: https://www.youtube.com/swf/l.swf?video_id=em-ZhJDjayM&
: eurl=&iurl=http%3A//img.youtube.com/vi/em-ZhJDjayM/default.jpg&
: t=OEgsToPDskLvttI1e7cLfmL15TOMbN24&rel=1&border=0
: 所以程式就可以改成这样:
: (1). 抓原始 url 里的参数 v
: (2). 重新组合成 https://www.youtube.com/v/xxxxxxxxxxx 的格式
: (3). 用 fsockopen 读取 (2),取得 header 的 Location 的 url
: (4). 从 (3) 得到的 url 中,parse 出参数 t
: (5). 组合成 https://www.youtube.com/get_video?video_id=$video_id&t=$t 的格式
: 基本上只要做到这个步骤就可以抓的到档案了,但是你还可以更进一步:
: (6). 用 fsockopen 读取 (5),取得 header 的 Location 的 url
: 从 (6) 这步骤得到的 url 就会是像
: http://ash-v250.ash.youtube.com/get_video?video_id=em-ZhJDjayM
: 这样子的 url
: that's all~!!
: 只要 fsockopen parse_url parse_str 就好
: 不用捞网页(省流量!),也不用做 regular expression (省脑力!)
: 不会被 youtube 挡,也不会因为 open proxy 关了你的站就死翘翘了(我挂了好几次orz)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.50.51.128
1F:推 grassboy2:印象中youtube影片实体url会因client端ip不同而不同… 02/28 03:37
2F:→ grassboy2:所以如果要开成api,就相当於每面对一个api call 02/28 03:38
3F:→ grassboy2:就必需从原po的主机抓下来影片後,再传给api client 02/28 03:39
4F:→ grassboy2:感觉流量会吃很大喔~~但也可能是我记错啦XDD 02/28 03:40
5F:→ iwhiori:对!抓下来的网址参数的确有ip这栏 02/28 09:19
6F:→ iwhiori:我机器放140.116 如果能成功做成!那我很乐意大家来吃频宽 02/28 09:19
7F:推 kusoayan:推一下 02/28 11:23
8F:推 shadowjohn:推一个,建议可以参考 youtube-dl (python)有现成的了 02/28 18:09
9F:→ iwhiori:哦感谢楼上 我去找找 03/17 12:55
10F:→ iwhiori:python youtube-dl 03/19 11:44
11F:→ iwhiori:wokrs !! 太伟大了! 03/19 11:44