Youku 视频绝对地址获取的方法详解
2015-01-24信息快讯网
本篇文章是对Youku 视频绝对地址获取的方法进行了详细的分析介绍,需要的朋友参考下
前一阵子为了研究 KnLiveCommentary 而进行了一系列的关于视频站点的研究。由于KnLiveCommentary需要能够获取充足的视频源进行测试,所以我们选取了 Youku(优酷)一个比较大的视频网站来进行测试。其实开始研究解析绝对地址也是为了研究Youku 的自带播放器,顺便去除广告什么的。后来我们就把Youku 的播放器用 ASV6 (ActionScript Viewer 6)“反编译”了一下,达到了惊人的效果。
Youku的视频采取了加密+动态的获取方式,视频地址需要访问网站动态获取,而结果则还需经过解密等操作。
$base_url = 'http://v.youku.com/player/getPlayList/VideoIDS/'; //获取视频信息的地址 基地址 $_VIDEO_ID = $_GET['vid']; //从GET里面把Video Id提取 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']); //把现在的浏览器User Agent传递给服务器 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 class decoder{ var $randomSeed = 0; var $cg_str=”"; function __construct($seed){ $this->randomSeed = $seed; } function ran(){ $this->randomSeed = (($this->randomSeed * 211)+30031)%65536; return ($this->randomSeed / 65536);// 根据旧的 Seed 计算新的Seed,并且返回一个Seed的比例位置 [0,1) } function cg_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 就停) } } function decode($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拉 } function decode_key($key1,$key2){ $key = hexdec($key1); //两个Key都是HEX $key = $key ^ -1520786011; //这个原来也是个8 位HEX,后来被我用计算器算了数值,因为这样方便PhP位运算 return $key2 . dechex($key); //合成最终 Key } }//解密类,用这个很方便$new = new decoder((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; //最后把地址输出
请注意,由于Youku 更换算法/格式上面的方法已经不能处理所有情况,我来描述下现在的流程:
1.访问http://v.youku.com/player/getPlayList/VideoIDS/[ID]
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
PHP获取youku视频真实flv文件地址的方法
根据ip调用新浪api获取城市名并转成拼音
php获取目标函数执行时间示例
php获取字段名示例分享
PHP代码优化之成员变量获取速度对比
PHP URL参数获取方式的四种例子
显示youtube视频缩略图和Vimeo视频缩略图代码分享
php获得用户ip地址的比较不错的方法
采用header定义为文件然后readfile下载(隐藏下载地址)
php缓冲 output_buffering和ob_start使用介绍
PHP中source #N问题的解决方法
php实现图形显示Ip地址的代码及注释
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
js和php邮箱地址验证的实现方法
PHP取整函数:ceil,floor,round,intval的区别详细解析
php取整函数ceil,floo,round的用法及介绍
解析获取优酷视频真实下载地址的PHP源代码
解析php 版获取重定向后的地址(代码)
解析php通过cookies获取远程网页的指定代码
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
解析PHP中的file_get_contents获取远程页面乱码的问题
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
php常用Output和ptions/Info函数集介绍
基于PHP输出缓存(output_buffering)的深入理解
php缓冲 output_buffering的使用详解
PHP转换IP地址到真实地址的方法详解
基于PHP CURL获取邮箱地址的详解
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
如何批量替换相对地址为绝对地址(利用bat批处理实现)
php笔记之:php函数range() round()和list()的使用说明