土豆视频真实地址解析

土豆的视频下载有以下几个特点:
地址动态生成,每次请求返回的地址都不一样。
长视频会被分割成多段短视频。
对视频下载有一些限制,下载地址只对与请求的浏览器相同的user-agent有效。这就意味着A用户用A浏览器获得的地址,只能用A浏览器下载,即使换个B浏览器也不行,更别说用其它工具了。

要解析土豆视频的下载地址,就必须找到iid。土豆有两种形式的播放地址,一种是形如

http://www.tudou.com/programs/view/QHFawBSeA4k/

的单一视频播放地址,另一种是形如

http://www.tudou.com/playlist/playindex.do?lid=11694367&iid=75610812

的豆单播放地址。

如果是第一种,直接查看源代码,可以找到
,iid = 75629467

如果是第二种,iid直接在url地址里,iid=75610812。

找到iid以后,把iid拼在

http://v2.tudou.com/v?vn=02&st=1%2C2&it=

后面,比如

http://v2.tudou.com/v?vn=02&st=1%2C2&it=75629467

访问该地址,返回的是一个xml格式的文件,里面就有视频下载地址和一些视频相关信息(根据情况自己进行url_decode)。

土豆视频的解析相比于优酷的解析,因为地址没有加密,显得更直接。但是在服务器端限制了请求用户和下载用户的user-agent,需要特别注意。可以利用切换用户user-agent的工具,改变自己的user-agent然后发送请求,得到具有针对性的下载地址。比如利用httpClient:1 httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, userAgent);

欢迎转载。本文采用 BY-NC-SA 协议进行授权,转载请保留以下内容,谢谢!
转载自3shi天下,原文地址:http://3shi.net/analyze-tudou-video-address/

yj0209 于 2011 年 05 月 10 日 15:21

请问,如果想分析56的视频,应该怎么做呢?
回复
3shi 于 2011 年 05 月 10 日 17:14

如果是以http://www.56.com/u80/v_NjAzNjM0MDU.html为例
只需访问http://vxml.56.com/json/NjAzNjM0MDU/
其中的rfiles:url就是下载地址
回复
yj0209 于 2011 年 05 月 10 日 17:40

太帅了,3shi大大真是好人
那个。。再问一个问题哈,怎么能自己找到这些规律呢,不然我再遇到新的网站就还是不知道怎么弄呢~
回复
3shi 于 2011 年 05 月 10 日 20:08

这个主要靠抓包工具来分析,大多数网站firebug已经够用了,遇到youku这样的加密算法,就要反编译它的swf文件,还有经验和运气也很重要
g 于 2011 年 05 月 11 日 04:40

可否寄PHP版本啊?

回复
tatters 于 2011 年 06 月 04 日 00:23

可否将土豆的视频地址解析程序php发给我一份呢,一直想找,但只有优酷的,没找到土豆的,太感谢了!
回复
3shi 于 2011 年 06 月 04 日 20:34

土豆网现在可以直接使用其官方的api获取(目前免费开放),http://api.tudou.com/apidoc/index.php/%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E6%9F%A5%E8%AF%A2
回复
ismouse 于 2011 年 06 月 05 日 12:19

请问3shi大神,土豆的视频我用IE能下载,用FireFox就下载不了,假设我下载知道了视频资源的真实地址videouri,接下来我要将视频流转存为本地的文件,这是用C#写的代码:
//获取资源代码
Uri httpurl = new Uri(videouri);
WebRequest request = WebRequest.Create(httpurl);
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
然后将获取的流存储到本地。
我猜firefox不能下载的原因是和user-agent有关吧。但是具体原因我不太清楚,请您解释一下吧,多谢大神!
回复
3shi 于 2011 年 06 月 05 日 14:20

如果你的videouri是由ie获得的,就只能由ie下载。在你上面代码里加上类似request.UserAgent = “xxx”;(把xxx换成你的ie浏览器的user-agent)就可以了。其实你最好用程序来获得videouri,在程序里可以任意指定user-agent,比如说你最终是想要用火狐下载,你就把ua指定为火狐的,那得到的videouri就是火狐专用的。
PS:不要叫大神了吧
回复
ismouse 于 2011 年 06 月 05 日 14:58

好的,俺以后不叫神了,3shi好歹您介绍一下自己呀,性别啊,年岁啊,也让大家以后称呼的时候不再迷茫。呵呵
回复
代码回音 于 2011 年 08 月 08 日 22:12

恩,多谢分析啊
回复
兔八哥 于 2011 年 08 月 14 日 17:21

3shi,你好,有一个问题我想请教一下。既然你上面已经说了土豆在服务器端限制了请求用户和下载用户的user-agent,有这么一种情况:用ie浏览器拿到了视频的地址后,我想直接通过播放器播放(播放器支持video的边下载边播放),由于土豆的服务器端做了限制,我无法播放。有没有什么方式可以拿到地址后就能下载?而不需要在我的播放器里做所说的指定user-agent?
回复
3shi 于 2011 年 08 月 15 日 08:24

这种情况的话应该是在请求的时候把浏览器的user-agent伪装成播放器的,这时候返回的下载地址就是播放器能直接下载的了。
回复
兔八哥 于 2011 年 08 月 15 日 13:57

搞定了,谢谢!
回复
皮皮 于 2012 年 08 月 18 日 23:32

请问PHP怎么伪造播放器的user_agent呢
回复
56dish 于 2012 年 09 月 03 日 16:48

3shi 土豆网user_agent 到底如何伪装成播放器的呢?另外,现在所有主流的网站,他们地址都是有时效的吗?
回复
5tu 于 2011 年 09 月 08 日 23:15

我有PHP 读取土豆网视频源码时,总是乱码,不知是什么原因,可以给个程序提示一下, 我试过用 USER-AGENT 还是不行,GBK转UTF8也不行,还是乱码, 如果是编码问题,网页中有英文,应该可以显示,但总是乱码,请帮想个主意啊

“��������������斫鐆遣8�鶞��?栏锥�� ��蓜�”暛渓Y纤3嗕圚B`蛘~剌筹雫叱`:葤L1��`��3A����蒇��,刹e俨l%呖����懥字��&fz:TWWUWUWw”
回复
5tu 于 2011 年 09 月 08 日 23:18

比如 HTTP://WWW.TUDOU.COM/ 首页 或者 http://www.tudou.com/programs/view/tBnA0_lMboI/
读到的都是乱码
回复
3shi 于 2011 年 09 月 09 日 20:53

不知道你的问题出在哪里,你把代码贴出来看看
回复
5tu 于 2011 年 09 月 10 日 09:24

如果 $pd_file=”http://movie.tudou.com/” 可以读取内容
如果 $pd_file=”http://tv.tudou.com/” 可以读取内容

如果 $pd_file=”http://www.tudou.com/” 读取后是乱码全是格子
如果 $pd_file=”http://www.tudou.com/programs/view/oIQV-U8wJ7o/” 读取后是乱码全是格子

程序很简单,我用ASP 也读不出来,主要是想截取IID的值,
回复
5tu 于 2011 年 09 月 10 日 09:25

$pd_file=”http://www.tudou.com/index.html”;
// header(“Content-type: text/html; charset=GBK”);
$file_handle = fopen(“$pd_file”, “r”);

while (!feof($file_handle)) {$line .= fgets($file_handle);}fclose($file_handle);
echo $line;
回复
5tu 于 2011 年 09 月 10 日 09:30

我想是不是 土豆在某些网页中做了限制或者验证, 希望大侠段程序测试一下,只要能读出IID就可以了,

我用了以上程序段后,发现某些网页可以文以读出,就是播放页面不行,还有首页不行,其它的可以读出,问题啊,一定是做了验证
回复
RixTox 于 2011 年 09 月 13 日 16:58

下面这段php提交url参数,可以是iid也可以使播放地址,echo一个下载地址
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(strstr($url,"tudou.com"))
{
$contents=file_get_contents($url);
$right=strpos($contents,',iid_code ')-1;
$left=strpos($contents,',iid = ')+7;
$length=$right-$left;
$url=substr($contents,$left,$length);
}
$url='http://v2.tudou.com/v?vn=02&st=1%2C2&it='.$url;
$contents=curl_get_contents($url);
//echo $contents;
$left=strpos($contents,'http://' ;
$right=strpos($contents,' {
if($_GET['s']==2)
{
$left=strpos($contents,'http://',$left+5);
$right=strpos($contents,'
回复
RixTox 于 2011 年 09 月 13 日 16:58

}
};
$length=$right-$left;
$rul=substr($contents,$left,$length);
$url=str_replace('&','&',$rul);
echo "$('#result').html('‘+\$putsongname+’.f4v‘);”;
//echo $url;
}
function curl_get_contents($url)
{
if(!function_exists(‘curl_init’))
{
return false;
}
else
{
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
$content = curl_exec($ch);
$errormsg = curl_error($ch);
curl_close($ch);
if($errormsg != ”)
{
echo $errormsg;
return false;
}
return $content;
}
}
?>
回复
RixTox 于 2011 年 09 月 13 日 17:01

下面这个是通过土豆视频地址获取名称和iid的
$TudouViewingURL=$_GET['url'];
$contents=file_get_contents($TudouViewingURL);
$right=strpos($contents,',iid_code ')-1;
$left=strpos($contents,',iid = ')+7;
$length=$right-$left;
$TudouViewingURL=substr($contents,$left,$length);
if(!isset($_GET['getname'])){}elseif($_GET['getname']==1){
//$filename=curl_get_contents("http://v2.tudou.com/v2/kili?safekey=YouNeverKnowThat&id=".$TudouViewingURL);
$right = strpos($contents,',desc = "')-2;
$left = strpos($contents,',kw = title = "')+15;
$length = $right-$left;
$filename = substr($contents,$left,$length);
$filename = trim($filename);
$filename = iconv('GB2312','UTF-8', $filename);
echo('if($("#songname").val()=="" || $("#songname").val()=="正在分析…"){$("#songname").val("'.$filename.'");};'."$('#tudouurl').val(\"$TudouViewingURL\");");
exit;
}
echo("$('#tudouurl').val(\"$TudouViewingURL\");");
function curl_get_contents($url)
{
if(!function_exists('curl_init'))
{
return false;
}
else
{
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
$content = curl_exec($ch);
$errormsg = curl_error($ch);
curl_close($ch);
if($errormsg != '')
{
echo $errormsg;
return false;
}
return $content;
}
}
function strToHex($string)
{
$hex="";
for ($i=0;$i $hex.=dechex(ord($string[$i]));
$hex=strtoupper($hex);
return $hex;
}
function hexToStr($hex)
{
$string="";
for ($i=0;$i
回复
rmblacker 于 2011 年 11 月 25 日 16:38

3shi你好:
从土豆获取的地址一般是
http://119.147.173.7/f4v/71/56057571.h264_1.f4v?key=8fbe1bc37e7476f82ea3d24ecdbd2a3f6ba9ac&playtype=1&tk=147806941315846464420287945&brt=2&bc=14&nt=0&du=69800&ispid=99&id=tudou&itemid=31843464&fi=63970089&sz=2587906
类似这种格式的,带一大堆参数,但如果使用网页播放器(我使用的是jwplayer)去播放的话,不能识别这种,只能识别”.f4v”这种格式,请问这方面问题怎么处理呢?
回复
3shi 于 2011 年 11 月 25 日 22:07

如果你的网址参数值带有“?”、“=”和“&”这三个字符,必须先转换再填写,如下:

“?”转换为“%3F”
“=”转换为“%3D”
“&”转换为“%26”

例如:原网址为:getplaylist.php?id=123&type=flv,转换后为:getplaylist.php%3Fid%3D123%26type%3Dflv。
回复
3shi 于 2011 年 11 月 25 日 22:18

忘了说了,这是jwplayer的参数配置
回复
rmblacker 于 2011 年 11 月 27 日 16:15

我试着这样去更改了地址,但是jwplayer还是加载不进来..有什么需要注意的小地方么,或者有没有相关文档的链接呢,麻烦了。
回复
3shi 于 2011 年 11 月 27 日 16:29

需要注意的就是解析出来的地址是有有效时间的,从解析成功以后大概几小时会失效,你看看会不会是有效期已经过了
Tt 于 2011 年 11 月 27 日 12:32

用fiorefox的插件DownloadHelper解析出的视频地址如http://113.107.112.6/f4v/65/97088265.h264_98.f4v?10000&key=ace2daf37613666f032f934ed0ccdde54f1393&playtype=1&tk=148527517256227750050785110&brt=99&bc=14&nt=0&du=248080&ispid=23&id=tudou&itemid=62690885&fi=97088265&sz=107062914
当时镶入JW播放器镶入博客,可以播放,但是过几个小时就不可以播放了,何解?可否解析出真实的播放地址,比如带后缀的?
回复
3shi 于 2011 年 11 月 27 日 16:25

解析出来的播放地址的确是有有效时间的,所以建议每次都去解析最新的地址
回复
rmblacker 于 2011 年 11 月 27 日 17:37

请你您是直接使用的这个地址么,那您是用的哪种嵌入方式呢,能分享一下么?
回复
Tt 于 2011 年 11 月 27 日 23:42

直接在WP写文章时候插入JW就成啊,URL地址直接填写解析出来这个在JW里发布就成。不知道您用的版本是什么,反正我是一直在追新。
回复
shelly 于 2011 年 12 月 08 日 14:47

http://tudou.letv.com/playlist/p/le/vfCM4L4-4zY/play.html

能请教一下这种地址要如何做解析吗?
取了源码里的iid也无效诶

麻烦了
回复
3shi 于 2011 年 12 月 10 日 19:45

土豆乐视合并后的产物。查看源代码后能找到partnerIds,这个id是乐视的标准id,用这个id查看我的另一篇文章《乐视视频真实地址解析》可以解析出来。
回复
shelly 于 2011 年 12 月 14 日 11:01

谢谢
回复
rabong 于 2011 年 12 月 13 日 16:42

使用浏览器输入http://v2.tudou.com/v?st=2&vn=02&it=75629467得出的视频动态地址是正确

我使用程序获取这个XML页面的动态地址时,得到的地址是不存的.我使用的是ASP程序获取.
为什么会是这样呢.3shi,急教啊!

以下是代码

Dim Id,Url,http,xml,link,i
Id = Trim(Request.Form(“id”))
If IsNull(Id) Or Not IsNumeric(Id) Then
Response.Write(“errorid”)
Response.End()
End If
Url = “http://v2.tudou.com/v?st=2&vn=02&it=75629467″
Set http=Server.CreateObject(“Microsoft.XMLHTTP”)
http.Open “GET”,Url,False
http.send
Set xml=Server.CreateObject(“Microsoft.XMLDOM”)
xml.Async=False
xml.ValidateOnParse=False
xml.Load(http.ResponseXML)
If xml.ReadyState>2 Then
Set item=xml.getElementsByTagName(“v”)
For i=0 To (item.Length-1)
Set link=item.Item(i).getElementsByTagName(“f”)
If link.item(i).Text “” Then
Response.Write(link.item(i).Text)
Response.End()
End If
Next
Else
Response.Write(“errorurl”)
Response.End()
End If
Set http=Nothing
Set xml=Nothing
回复
3shi 于 2011 年 12 月 13 日 20:58

应该是user-agent的问题,仔细看本文的最后一段。还有本篇的评论里也有不少讨论这个的。
回复
rabong 于 2011 年 12 月 14 日 10:05

搞定,谢谢3shi
回复
Archer 于 2011 年 12 月 14 日 10:30

你好 请教一个User-agent的问题:
request.UserAgent = “Mozilla/4.0 (compatible; MSIE 7.0; Win32)”;
这是我IE的user-agent, 但是解析出来的地址,复制到IE没办法下载。有一些不解。
地址是正确的。
回复
梦 于 2012 年 01 月 05 日 18:56

http://61.153.87.199/wwwFlv/flv/047/845/385/47845385.7fe58ff6843eba391ef746077527fd61bce6fa02_238_6.flv?key=84c92c265c7bbe0d9d3eaf4f057a92ea6aeca4&playtype=1&tk=151409854003128224180294361&brt=1&bc=10&nt=0&du=1435020&ispid=40&rc=200&inf=1&si=un&id=tudou&itemid=26495476&fi=61054542&sz=53395645
这是火狐生成的,我把我下载器的user-agent定义成火狐的,然后我下载的时候提示我错误,但是我用flvcd来生成火狐的地址下载就可以,麻烦您帮我看下,上面的地址我用火狐下载可以,但是自己写的就不行
回复
3shi 于 2012 年 01 月 08 日 20:43

你用的是什么下载器?是不是多线程下载?
回复
仙女龙 于 2012 年 02 月 03 日 14:02

大家这么多都对视频真实地址解析感兴趣呀~
作为同道中人,我虽不能像3shi那样给大家详细解答疑问,却可以给大家个参考资料:
http://hi.baidu.com/dlbtsoft/blog/item/5ca7deb5dab835648ad4b22f.html
一款视频真实地址解析软件的详细介绍
回复
ws 于 2012 年 02 月 22 日 20:38

3shi 问一下 为什么我解析的地址 输进去以后 不能显示下载 只显示了 pir 是怎么回事啊 谢谢
回复
3shi 于 2012 年 02 月 22 日 20:55

显示pir表示user-agent不对,注意文章最后一段。祝好运。
回复
仰望、 于 2012 年 05 月 26 日 21:09

很高兴能看到您这篇文章只是看的我有点晕,能发我份代码吗? 谢谢。
回复
仰望、 于 2012 年 05 月 26 日 21:10

很高兴能看到您这篇文章只是看的我有点晕,能发我份代码吗? 谢谢。
我已经发表成功了吗?
回复
皮皮 于 2012 年 08 月 18 日 20:58

各位有写好的PHP获取土豆视频地址在播放器中播放的例子吗

有话要说