Youku视频绝对地址获取的方法详解
2023-06-13 09:15:02 时间
前一阵子为了研究KnLiveCommentary而进行了一系列的关于视频站点的研究。由于KnLiveCommentary需要能够获取充足的视频源进行测试,所以我们选取了Youku(优酷)一个比较大的视频网站来进行测试。
其实开始研究解析绝对地址也是为了研究Youku的自带播放器,顺便去除广告什么的。后来我们就把Youku的播放器用ASV6(ActionScriptViewer6)“反编译”了一下,达到了惊人的效果。
Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。
复制代码代码如下:
其实开始研究解析绝对地址也是为了研究Youku的自带播放器,顺便去除广告什么的。后来我们就把Youku的播放器用ASV6(ActionScriptViewer6)“反编译”了一下,达到了惊人的效果。
Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。
$base_url="http://v.youku.com/player/getPlayList/VideoIDS/";//获取视频信息的地址基地址
$_VIDEO_ID=$_GET["vid"]; //从GET里面把VideoId提取
if($_VIDEO_ID=="")
$_VIDEO_ID="XMjY0ODE1MDA0";//我比较懒,测试的时候就固定了一个
$ch=curl_init();//开启cURL对象
curl_setopt($ch,CURLOPT_URL,$base_url.$_VIDEO_ID); //获取这个视频的信息的地址
curl_setopt($ch,CURLOPT_HEADER,1); //要HEADER
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_REFERER,"http://v.youku.com/v_show/id_".$_VIDEO_ID); //给一个假的"REFERER"
curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER["HTTP_USER_AGENT"]);//把现在的浏览器UserAgent传递给服务器
curl_setopt($ch,CURLOPT_NOBODY,0);
$content=curl_exec($ch); //执行!!!
curl_close($ch);/*下面解析*/
preg_match(‘~”seed”\s*:\s*(\d+)\s*,~iUs",$content,$seed);
preg_match(‘~\{\s*”(flv|mp4)”\s*:\s*”(.*)”\s*\}~iUs",$content,$encoded);
preg_match(‘~”key1″\s*:\s*”(.*)”\s*,~iUs",$content,$key1);
preg_match(‘~”key2″\s*:\s*”(.*)”\s*,~iUs",$content,$key2);
//从返回的JSON串中提取必要信息seed,encoded_url,key1,key2
classdecoder{
var$randomSeed=0;
var$cg_str=”";
function__construct($seed){
$this->randomSeed=$seed;
}
functionran(){
$this->randomSeed=(($this->randomSeed*211)+30031)%65536;
return($this->randomSeed/65536);//根据旧的Seed计算新的Seed,并且返回一个Seed的比例位置[0,1)
}
functioncg_hun(){ //估计这个叫“CG混”,反正ASV解的函数就是这个名字
$this->cg_str="";
$sttext="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890"; //默认字符串(最大)
$len=strlen($sttext); //获取其长度
for($i=0;$i<$len;$i++){
$cuch=(int)($this->ran()*strlen($sttext)); //获取字符串Seed比例位置的字符下标
$this->cg_str.=$sttext[$cuch]; //把字母读出来
$sttext=str_replace($sttext[$cuch],”,$sttext); //删掉这个读出来的字母(到0就停)
}
}
functiondecode($string){
$output=”";
$this->cg_hun();
$expl=explode(‘*",$string); //把1*23*34*45*56*这个字符串打散
for($i=0;$i<count($expl)-1;$i++){
$output.=$this->cg_str[(int)$expl[$i]]; //获取数字位代表的cg_hun打乱字符串字符,自此解密完成
}
return$output; //OK拉
}
functiondecode_key($key1,$key2){
$key=hexdec($key1); //两个Key都是HEX
$key=$key^-1520786011;//这个原来也是个8位HEX,后来被我用计算器算了数值,因为这样方便PhP位运算
return$key2.dechex($key);//合成最终Key
}
}//解密类,用这个很方便$new=newdecoder((int)$seed[1]);
$fileid=$new->decode($encoded[2]);
$key=$new->decode_key($key1[1],$key2[1]);
//把数据喂进去,计算//地址载构成
$s7=substr($fileid,10,strlen($fileid));
$s5=substr($fileid,0,8);
$s6=substr($fileid,6,2);
//拆开$s4="00′;//注意这是一个HEX值,即00表示视频第一个分段,01第二个0f第十五个…依此类推$sid=time().mt_rand(10,99)."1000′.mt_rand(30,80)."00′;//获取一个随机的SID,给服务器(其实不会被检查)
$d_ADDR=‘http://f.youku.com/player/getFlvPath/sid/‘.$sid.‘_".$s4.‘/st/".$encoded[1].‘/fileid/".$file_id;
echo$d_ADDR.‘?K=".$key;
//最后把地址输出
2.获得文件,同时解析”streamfileids”:{“flv”:”加密地址”,”mp4″:”加密地址”,”等等等”:”加密地址”
3.按照上面的方法破解加密地址
4.获取分段数目和K
{“mp4″:[{“no”:”0“,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce“},{“no”:”1“,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce“},
……
5.合成地址,不过每个分段的K都采用上面获得的新K
相关文章
- 本地Linux配置ip地址的方法
- 关于File类概念及方法的一些介绍
- MyEclipse10.6 安装SVN插件方法及插件下载地址
- mysql启动后自动停止_宝塔mysql总是自动停止解决方法总汇
- PostgreSQL实现交叉表(行列转换)的5种方法示例
- Linux下修改Oracle监听地址的方法
- python 获取mac地址的两种方法详解编程语言
- Linux系统中查看IP地址的简单方法(linuxip地址查看)
- 地址修改Linux系统下网卡MAC地址修改方法(linux网卡mac)
- 地址更改Oracle服务器IP地址的方法详解(oracle服务器ip)
- Linux下查看本机IP地址方法总结(linux查本机ip地址)
- Linux中恢复上一条命令的方法(linux撤销上一命令)
- 探索Linux下查看本机IP地址的方法(linux查看本机地址)
- Linux查看本机IP地址的方法(linux查看本机地址)
- Linux下简单补全文件名的方法(linux补全文件名)
- 地址Linux下查看IPv6地址的方法(linux查看ipv6)
- 用js控制css的不错的方法
- undefinedreferenceto`SetPduPowerConsumptionCnt'错误的解决方法
- IE浏览器中图片onload事件无效的解决方法
- 针对Sqlserver大数据量插入速度慢或丢失数据的解决方法
- C#实现生成mac地址与IP地址注册码的两种方法