前一阵子为了研究 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
有个叫找东西网的地方可以破解这些加密的,不知道是怎么办到的
新的优酷地址改变,之前的都不能用了 大神有新的方法吗?
并没有。。。现在换得太频繁,懒得去研究了。。
$this->randomSeed = (($this->randomSeed * 211)+30031)%65536;
return ($this->randomSeed / 65536);// 根据旧的 Seed 计算新的Seed,并且返回一个Seed的比例位置 [0,1)
这个方法好像不能用了,请问怎样知道最新的方法啊?
现在变了,最近没时间破。。。
可以破解 下载优酷视频吗。量大!可以合作哦!!要真正的技术和实力。谢谢,
有关优酷下载的话有别的工具比较好,比如https://github.com/soimort/you-get 等。基本可以直接使用
优酷-加-密-视频我搞了很长时间了弄不出来,请教你们高手一下啊。 万分感谢
破解优酷加密视频。望合作。
求优酷加密视屏破解,望合作。
有PHP代码吗 我有服务器 QQ8859616
您好,我请问有提供API接口的吗?我没有服务器,有的话联系我Q1241818518谢谢!
这个。。。我也没服务器。。。在需要的地方把算法加进去就可。或者调用B站的API现在貌似也可以返回视频URL
你好,请问能帮我获取一个加密的优酷视频地址吗?非常着急啊 ,你写的这个,我不知道怎么弄。
优酷最新K的算法是什么
Hi ,您好~,想要您一个联系方式,占用写时间私下聊聊 ,不知可否 ,
QQ :346322220 谢谢 by MK
您好,不知道怎么具体操作,很想学会,希望您讲具体点,可以吗。
http://v.youku.com/v_show/id_XMzAwNzU3MDQ0.html
这个可以查看绝对地址吗?
很高兴得到您的回复,分段那个我已经取出来了,非常谢谢
你好,近来正在收集视频资源,你的代码很有用,但是我发现有些视频是分段的,这样分段的怎么取地址啊?我按你的算法去取,结果地址打开后是空白页面,但是第一段的视频地址是对的,谢谢
Youku加密方法已经被更新了,首先Key的获取现在不需要运算了,而是读取k值。比如返回的{“mp4″:”58*43*58*58*58*36*58*67*58*58*31*38*10*38*16*57*43*58*43*67*58*38*58*25*34*64*58*10*52*50*64*0*25*38*36*57*0*58*45*25*10*0*36*45*0*57*34*31*45*34*52*64*40*45*67*58*25*31*58*0*36*0*25*16*25*16*”,之后省略
是我们前地址不变
后面是
{“mp4”:[{“no”:”0″,”size”:”18367795″,”seconds”:”421″,”k”:”281ff2875db680bb261c02ce”},{“no”:”1″,”size”:”19045091″,”seconds”:”421″,”k”:”45398cdd4aa44968261c02ce”},{“no”:”2″,”size”:”34279136″,”seconds”:”424″,”k”:”35c4b5c4103989fd2410ce7c”},{“no”:”3″,”size”:”18924886″,”seconds”:”424″,”k”:”91b750bf72875a0728273721″},{“no”:”4″,”size”:”29592883″,”seconds”:”424″,”k”:”cda5ce6314a4c54828273721″},{“no”:”5″,”size”:”32225080″,”seconds”:”421″,”k”:”eb1aaeed3efa4a64261c02ce”},{“no”:”6″,”size”:”19297239″,”seconds”:”197″,”k”:”ab137f394d68590428273721″}],
可以看到分段为7段,每段都有自己的 K 值,简单说就是按照上面的写法,不过先读取段数,然后根据段数生成地址,而地址的 K 则来源于每个分段的 K。
我的也是同样情况
请问分段的K值怎么计算,你的答案没看明白
K值应该直接在参数中给出了。当然这是比较早的时候,不知道现在还能不能用。现在比较稳定的做法是使用Youku的iPad版本URL,可以下到一个m3u8,把这个索引里面的视频分段拼接。
是的。我也发现了,直接现实K,根据标清、高清、超清现实K。请问直接读取K的函数怎么写呀。。我还比较菜~~
在您的那个插件里看到写法了,多谢您!
您好。我看了您的这个获取优酷视频的方法,其他都对,就是获取K值的方法:
function decode_key($key1,$key2){
$key = hexdec($key1);
$key = $key ^ -1520786011;
return $key2 . dechex($key);
}
好像已经不对了,优酷对K进行了加密,现在实际下载的K和用您的方法算出的K不同。您能不能再根据现在优酷的结果进行一下算法的推断?十分感谢!太需要这个功能了。谢谢!期待您的回复。
算法更新了,http://kanoha.org/2011/08/22/youku-address-update/ 这个是现在获取K方法,似乎目前Youku会直接传递K,不必再进行解密。
您真是太棒了,现在可以下载了。还有一事想问,就是我看到您这个程序是默认选择超清下载。但是我想只下载最不清楚的“标清”版本,有什么办法么?
这主要是在segs里面确定的,有mp4, flv, flvhd等等,你可以尝试选择不同的源,就能选择不同的清晰度…不过由于我没有仔细研究过,所以不太清楚到底哪个是标清哪个是高清…:kaka|26:
我根据您的程序改了一下,达到只下标清的效果了。实在太感谢了!!您真是太棒了哈!:kaka|05:
你好,可以说说具体的步骤吗?
哪一步呢?
请问,这个方法能获取到优酷网上加密视频的绝对地址吗?因为我想下载视频,可是没有密码。