作者Kej (be me)
看板PHP
标题Re: [问题] 如何解析youtube的网址
时间Sun Dec 9 21:59:45 2007
※ 引述《kenshieh (Not always blank)》之铭言:
: ※ 引述《lottemarines (一平)》之铭言:
: : 作者: lottemarines (一平) 看板: Google
: : 标题: [问题] 如何解析youtube的网址
: : 时间: Sat Dec 8 16:36:05 2007
: : 使用这个网站的话
: : http://kej.tw/flvretriever/
: : 就可以下载 youtube的影片
网址有点眼熟..................... XD
: : 原先网址是: http://tw.youtube.com/watch?v=j75Kl7_ERdM
: : 可以解析成:http://lax-v239.lax.youtube.com/get_video?video_id=j75Kl7_ERdM
: : 小弟猜测:j75Kl7_ERdM 这段跟:lax-v239.lax 有某种关系
: : 另一例:
: : https://www.youtube.com/watch?v=em-ZhJDjayM
: : http://ash-v250.ash.youtube.com/get_video?video_id=em-ZhJDjayM
: : 小弟猜测:em-ZhJDjayM 这段跟:ash-v250.ash 有某种关系
: : 我想知道要怎样做才可以像上面那个网站那样写出一个解析下载影片网址的程式
: : 有强者可以解答吗?
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: 220.133.102.122
※ 编辑: Kej 来自: 220.133.102.122 (12/09 22:03)
1F:推 GcB:推 12/10 16:17
2F:推 wunming:原作者出现了~~推 12/11 19:45
3F:推 buubuu :如果不挡连线 youtube的server大概会爆掉吧XD 09/06 12:45