管理JAE代码的Git工具安装汉化

作者:Matrix 发布时间:2014年8月31日星期日 分类:零零星星

放在jae的代码修改的时候使用git方便很多,由于没有接触过GIT,这里记录一些。

以win8-64bit为例:

安装工具

msysgit[Git-1.9.4-preview20140611]

Tortoisegit-64bit

Tortoisegit-64bit中文语言包

汉化步骤

安装完这仨文件后重启。

右击资源管理器任意空白位置,选择 TortoiseGit -> Settings

选择 Tortoisegit -> Settings

 

从右侧语言设置中,选择简体中文。

选择简体中文

参考:http://www.freehao123.com/jae-git/

php源码_优酷视频解析_更新

作者:Matrix 发布时间:2014年8月23日星期六 分类:兼容并蓄

优酷的算法到6月份就变了,以前的优酷解析源码也早就失效。

获取视频信息的接口:

http://v.youku.com/player/getPlayList/VideoIDS/{$youku_ID}/ctype/12/ev/1
标清测试:

方法一.

通过优酷的m38u文件匹配到视频源,主要是获取m3u8地址麻烦

http://v.youku.com/player/getM3U8/vid/{ $id} /type/ {$type}这种优酷的m3u8地址在7月份的时候还能用,到这个月就成403错误没法访问。

后来找到了新的m38u地址:

http://pl.youku.com/playlist/m3u8?vid=XNTc5NDcwMjI4&type=mp4&ep={$ep}&sid={$sid}&token={$tk}&ctype=12&ev=1&oip={$oip}

麻烦的是多出来的ep等一趴拉参数,很扯拐。

还好有github项目的相关的源码,这里修改整理下[python]:
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import re
  4. import sys
  5. import json
  6. import gzip
  7. import base64
  8. import time
  9. from urllib import request, parse
  10. def get_response(url, faker = False):
  11.     if faker:
  12.         response = request.urlopen(request.Request(url, headers = fake_headers), None)
  13.     else:
  14.         response = request.urlopen(url)
  15.     data = response.read()
  16.     if response.info().get('Content-Encoding') == 'gzip':
  17.         data = ungzip(data)
  18.     elif response.info().get('Content-Encoding') == 'deflate':
  19.         data = undeflate(data)
  20.     response.data = data
  21.     return response
  22. # DEPRECATED in favor of get_content()
  23. def get_html(url, encoding = None, faker = False):
  24.     content = get_response(url, faker).data
  25.     return str(content, 'utf-8', 'ignore')
  26. def generate_ep(vid, ep):
  27.     f_code_1 = 'becaf9be'
  28.     f_code_2 = 'bf7e5f01'
  29.     def trans_e(a, c):
  30.         f = h = 0
  31.         b = list(range(256))
  32.         result = ''
  33.         while h < 256:
  34.             f = (f + b[h] + ord(a[h % len(a)])) % 256
  35.             b[h], b[f] = b[f], b[h]
  36.             h += 1
  37.         q = f = h = 0
  38.         while q < len(c):
  39.             h = (h + 1) % 256
  40.             f = (f + b[h]) % 256
  41.             b[h], b[f] = b[f], b[h]
  42.             if isinstance(c[q], int):
  43.                 result += chr(c[q] ^ b[(b[h] + b[f]) % 256])
  44.             else:
  45.                 result += chr(ord(c[q]) ^ b[(b[h] + b[f]) % 256])
  46.             q += 1
  47.         return result
  48.     e_code = trans_e(f_code_1, base64.b64decode(ep))
  49.     sid, token = e_code.split('_')
  50.     new_ep = trans_e(f_code_2, '%s_%s_%s' % (sid, vid, token))
  51.     return base64.b64encode(bytes(new_ep, 'latin')), sid, token
  52.     #return base64.b64encode(new_ep)
  53. def de_m3u8(vid):
  54.         url = 'http://v.youku.com/player/getPlayList/VideoIDS/%s/Pf/4/ctype/12/ev/1' % vid
  55.         meta = json.loads(get_html(url))
  56.         if not meta['data']:
  57.                 print ('[Failed] Video not found.')
  58.                 sys.exit() # 退出程序
  59.         metadata0 = meta['data'][0]
  60.         title = metadata0['title']
  61.         ep = metadata0['ep']
  62.         ip = metadata0['ip']
  63.         vid2 = metadata0['videoid']
  64.         data = generate_ep(vid2,ep);
  65.        # m3u8url = 'http://pl.youku.com/playlist/m3u8?vid=%s&type=mp4&ep=%s&sid=%s&token=%s&ctype=12&ev=1&oip=%s' % (vid,data[0],data[1],data[2],ip)
  66.         m3u8_query = parse.urlencode(dict(
  67.             ctype=12,
  68.             ep=data[0],
  69.             ev=1,
  70.             keyframe=1,
  71.             oip=ip,
  72.             sid=data[1],
  73.             token=data[2],
  74.             ts=int(time.time()),
  75.             type='mp4',
  76.             vid=vid2,
  77.         ))
  78.         m3u8_url = 'http://pl.youku.com/playlist/m3u8?' + m3u8_query
  79.         return m3u8_url;
  80. v = 'XNjc1MDI4Nzg0'#优酷视频ID
  81. print(get_html(de_m3u8(v)))#返回m3u8内容

说明:python的相关代码我只是DIY了,原创来自:
https://github.com/tacy/plugin.video.youkuvideo/blob/master/addon.py
https://github.com/soimort/you-get/blob/develop/src/you_get/extractors/youku.py

php源码_优酷视频解析_更新

 

执行上面的python得到如图,明显m3u8的视频源就是这些,只是不要后面的ts_参数。

之后再慢慢改成php代码,装成类:

  1. class youku_m3u8
  2. {
  3.     public static function curl($url$carry_header = true, $REFERER_ = 0, $add_arry_header = 0)
  4.     {
  5.         $ch = curl_init($url);
  6.         if ($carry_header)
  7.         {
  8.             curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36'));
  9.         }
  10.         if ($add_arry_header)
  11.         {
  12.             curl_setopt($ch, CURLOPT_HTTPHEADER, $add_arry_header);
  13.         }
  14.         if ($REFERER_)
  15.         {
  16.             curl_setopt($ch, CURLOPT_REFERER, $REFERER_);
  17.         }
  18.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  19.         $get_url = curl_exec($ch);
  20.         curl_close($ch);
  21.         return $get_url;
  22.     }
  23.     public static function charCodeAt($str$index)
  24.     {
  25.         $charCode = array();
  26.         $key = md5($str);
  27.         $index = $index + 1;
  28.         if (isset($charCode[$key]))
  29.         {
  30.             return $charCode[$key][$index];
  31.         }
  32.         $charCode[$key] = unpack('C*', $str);
  33.         return $charCode[$key][$index];
  34.     }
  35.     public static function charAt($str$index = 0)
  36.     {
  37.         return substr($str$index, 1);
  38.     }
  39.     public static function fromCharCode($codes)
  40.     {
  41.         if (is_scalar($codes))
  42.         {
  43.             $codes = func_get_args();
  44.         }
  45.         $str = '';
  46.         foreach ($codes as $code)
  47.         {
  48.             $str .= chr($code);
  49.         }
  50.         return $str;
  51.     }
  52.     public static function yk_e($a$c)
  53.     {
  54.         for ($f = 0, $i$e = ''$h = 0; 256 > $h$h++)
  55.         {
  56.             $b[$h] = $h;
  57.         }
  58.         for ($h = 0; 256 > $h$h++)
  59.         {
  60.             $f = (($f + $b[$h]) + self::charCodeAt($a$h % strlen($a))) % 256;
  61.             $i = $b[$h];
  62.             $b[$h] = $b[$f];
  63.             $b[$f] = $i;
  64.         }
  65.         for ($q = ($f = ($h = 0)); $q < strlen($c); $q++)
  66.         {
  67.             $h = ($h + 1) % 256;
  68.             $f = ($f + $b[$h]) % 256;
  69.             $i = $b[$h];
  70.             $b[$h] = $b[$f];
  71.             $b[$f] = $i;
  72.             $e .= self::fromCharCode(self::charCodeAt($c$q) ^ $b[($b[$h] + $b[$f]) % 256]);
  73.         }
  74.         return $e;
  75.     }
  76.     public static function yk_d($a)
  77.     {
  78.         $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  79.         if (!$a)
  80.         {
  81.             return '';
  82.         }
  83.         $f = strlen($a);
  84.         $b = 0;
  85.         for ($c = ''$b < $f ;  )
  86.         {
  87.             $e = self::charCodeAt($a$b++) &255;
  88.             if ($b == $f)
  89.             {
  90.                 $c .= self::charAt($str$e >> 2);
  91.                 $c .= self::charAt($str, ($e &3) << 4);
  92.                 $c .= '==';
  93.                 break;
  94.             }
  95.             $g = self::charCodeAt($a$b++);
  96.             if ($b == $f)
  97.             {
  98.                 $c .= self::charAt($str$e >> 2);
  99.                 $c .= self::charAt($str, ($e &3) << 4 | ($g &240) >> 4);
  100.                 $c .= self::charAt($str, ($g &15) << 2);
  101.                 $c .= '=';
  102.                 break;
  103.             }
  104.             $h = self::charCodeAt($a$b++);
  105.             $c .= self::charAt($str$e >> 2);
  106.             $c .= self::charAt($str, ($e &3) << 4 | ($g &240) >> 4);
  107.             $c .= self::charAt($str, ($g &15) << 2 | ($h &192) >> 6);
  108.             $c .= self::charAt($str$h &63);
  109.         }
  110.         return $c;
  111.     }
  112.     public static function get_m3u8_url($youku_ID$type = 'flv')
  113.     {
  114.         $video_info = self::curl('http://v.youku.com/player/getPlayList/VideoIDS/' . $youku_ID . '/ctype/12/ev/1');
  115.         $obj = json_decode($video_info);
  116.         $vid = $obj->data[0]->videoid;
  117.         $oip = $obj->data[0]->ip;
  118.         $epdata = $obj->data[0]->ep;
  119.         $youku_m3u8 = self::_calc_ep2($vid$epdata);
  120.         $m3u8_url = 'http://pl.youku.com/playlist/m3u8?vid=' . $vid . '&type=' . $type . '&ep=' . urlencode($youku_m3u8['ep']) . '&token=' . $youku_m3u8['token'] . '&ctype=12&ev=1&oip=' . $oip . '&sid=' . $youku_m3u8['sid'];
  121.         return $m3u8_url;
  122.     }
  123.     public static function _calc_ep2($vid$ep)
  124.     {
  125.         $e_code = self::yk_e('becaf9be', base64_decode($ep));
  126.         $s_t = explode('_', $e_code);
  127.         $sid = $s_t[0];
  128.         $token = $s_t[1];
  129.         // $new_ep = trans_e('bf7e5f01', '%s_%s_%s' % ($sid.$vid.$token));
  130.         $new_ep = self::yk_e('bf7e5f01', $sid . '_' . $vid . '_' . $token);
  131.         $new_ep = base64_encode($new_ep); //可以换作下面代码 
  132.         // $new_ep = iconv('gbk', 'UTF-8', self::yk_d($new_ep));
  133.         return array('ep' => $new_ep,
  134.             'token' => $token,
  135.             'sid' => $sid,
  136.             );
  137.     }
  138. }

说明:调用函数youku_m3u8::get_m3u8_url('XNjc1MDI4Nzg0')就能得到m3u8地址

方法二.

像之前一样解密优酷算法,按照新的URL拼接。

这里有深渊戮影的新算法[php]:

  1. class Youku {
  2.     const USER_AGENT = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36";
  3.     const REFERER = "http://www.youku.com";
  4.     const FORM_ENCODE = "GBK";
  5.     const TO_ENCODE = "UTF-8";
  6.     private static $base = "http://v.youku.com/player/getPlaylist/VideoIDS/";
  7.     private static $source = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890";
  8.     private static $sz = '-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1';
  9.     private static $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  10.     public static function parse($url){
  11.         preg_match("#id\_([\w=]+)#"$url$matches); //id里可以有=号
  12.         if (emptyempty($matches)){
  13.             $html = self::_cget($url);
  14.             preg_match("#videoId2\s*=\s*\'(\w+)\'#"$html$matches);
  15.             if(!$matchesreturn false;
  16.         }
  17.         //根据you vid 获取相应的视频地址
  18.         return self::_getYouku(trim($matches[1]));
  19.     }
  20.     /**
  21.      * [_cget curl获取数据]
  22.      * @param  [type]  $url     [url地址]
  23.      * @param  boolean $convert [是否转换编码]
  24.      * @param  integer $timeout [超时时间]
  25.      * @return [type]           [description]
  26.      */
  27.     public static function _cget($url,$convert=false,$timeout=10){
  28.         $ch=curl_init($url);
  29.         curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  30.         curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
  31.         curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  32.         curl_setopt($ch,CURLOPT_USERAGENT,self::USER_AGENT);
  33.         curl_setopt($ch,CURLOPT_REFERER,self::REFERER);
  34.         curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); //跟随301跳转
  35.         curl_setopt($ch,CURLOPT_AUTOREFERER,1); //自动设置referer              
  36.         $res=curl_exec($ch);
  37.         curl_close($ch);
  38.         if($convert){
  39.             $res=mb_convert_encoding($res,self::TO_ENCODE,self::FORM_ENCODE);
  40.         }
  41.         return $res;
  42.     }
  43.     //start 获得优酷视频需要用到的方法
  44.     private static function getSid(){
  45.         $sid = time().(mt_rand(0,9000)+10000);
  46.         return $sid;
  47.     }
  48.     private static function getKey($key1,$key2){
  49.         $a = hexdec($key1);
  50.         $b = $a ^0xA55AA5A5;
  51.         $b = dechex($b);
  52.         return $key2.$b;
  53.     }
  54.     private static function getFileid($fileId,$seed){
  55.         $mixed = self::getMixString($seed);
  56.         $ids = explode("*",rtrim($fileId,'*')); //去掉末尾的*号分割为数组
  57.         $realId = "";
  58.         for ($i=0;$i<count($ids);$i++){
  59.             $idx = $ids[$i];
  60.             $realId .= substr($mixed,$idx,1);
  61.         }
  62.         return $realId;
  63.     }
  64.     private static function getMixString($seed){
  65.         $mixed = "";
  66.         $source = self::$source;
  67.         $len = strlen($source);
  68.         for($i=0;$i<$len;$i++){
  69.             $seed = ($seed * 211 + 30031)%65536;
  70.             $index = ($seed / 65536 * strlen($source));
  71.             $c = substr($source,$index,1);
  72.             $mixed .= $c;
  73.             $source = str_replace($c,"",$source);
  74.         }
  75.         return $mixed;
  76.     }
  77.     private static function yk_d($a){
  78.         if (!$a) {
  79.             return '';
  80.         }
  81.         $f = strlen($a);
  82.         $b = 0;
  83.         $str = self::$str;
  84.         for ($c = ''$b < $f😉 {
  85.             $e = self::charCodeAt($a$b++) & 255;
  86.             if ($b == $f) {
  87.                 $c .= self::charAt($str$e >> 2);
  88.                 $c .= self::charAt($str, ($e & 3) << 4);
  89.                 $c .= '==';
  90.                 break;
  91.             }
  92.             $g = self::charCodeAt($a$b++);
  93.             if ($b == $f) {
  94.                 $c .= self::charAt($str$e >> 2);
  95.                 $c .= self::charAt($str, ($e & 3) << 4 | ($g & 240) >> 4);
  96.                 $c .= self::charAt($str, ($g & 15) << 2);
  97.                 $c .= '=';
  98.                 break;
  99.             }
  100.             $h = self::charCodeAt($a$b++);
  101.             $c .= self::charAt($str$e >> 2);
  102.             $c .= self::charAt($str, ($e & 3) << 4 | ($g & 240) >> 4);
  103.             $c .= self::charAt($str, ($g & 15) << 2 | ($h & 192) >> 6);
  104.             $c .= self::charAt($str$h & 63);
  105.         }
  106.         return $c;
  107.     }
  108.     private static function yk_na($a){
  109.         if (!$a) {
  110.             return '';
  111.         }
  112.         $h = explode(',', self::$sz);
  113.         $i = strlen($a);
  114.         $f = 0;
  115.         for ($e = ''$f < $i😉 {
  116.             do {
  117.                 $c = $h[self::charCodeAt($a$f++) & 255];
  118.             } while ($f < $i && -1 == $c);
  119.             if (-1 == $c) {
  120.                 break;
  121.             }
  122.             do {
  123.                 $b = $h[self::charCodeAt($a$f++) & 255];
  124.             } while ($f < $i && -1 == $b);
  125.             if (-1 == $b) {
  126.                 break;
  127.             }
  128.             $e .= self::fromCharCode($c << 2 | ($b & 48) >> 4);
  129.             do {
  130.                 $c = self::charCodeAt($a$f++) & 255;
  131.                 if (61 == $c) {
  132.                     return $e;
  133.                 }
  134.                 $c = $h[$c];
  135.             } while ($f < $i && -1 == $c);
  136.             if (-1 == $c) {
  137.                 break;
  138.             }
  139.             $e .= self::fromCharCode(($b & 15) << 4 | ($c & 60) >> 2);
  140.             do {
  141.                 $b = self::charCodeAt($a$f++) & 255;
  142.                 if (61 == $b) {
  143.                     return $e;
  144.                 }
  145.                 $b = $h[$b];
  146.             } while ($f < $i && -1 == $b);
  147.             if (-1 == $b) {
  148.                 break;
  149.             }
  150.             $e .= self::fromCharCode(($c & 3) << 6 | $b);
  151.         }
  152.         return $e;
  153.     }
  154.     private static function yk_e($a$c){
  155.         for ($f = 0, $i$e = ''$h = 0; 256 > $h$h++) {
  156.             $b[$h] = $h;
  157.         }
  158.         for ($h = 0; 256 > $h$h++) {
  159.             $f = (($f + $b[$h]) + self::charCodeAt($a$h % strlen($a))) % 256;
  160.             $i = $b[$h];
  161.             $b[$h] = $b[$f];
  162.             $b[$f] = $i;
  163.         }
  164.         for ($q = ($f = ($h = 0)); $q < strlen($c); $q++) {
  165.             $h = ($h + 1) % 256;
  166.             $f = ($f + $b[$h]) % 256;
  167.             $i = $b[$h];
  168.             $b[$h] = $b[$f];
  169.             $b[$f] = $i;
  170.             $e .= self::fromCharCode(self::charCodeAt($c$q) ^ $b[($b[$h] + $b[$f]) % 256]);
  171.         }
  172.         return $e;
  173.     }
  174.     private static function fromCharCode($codes){
  175.         if (is_scalar($codes)) {
  176.             $codes = func_get_args();
  177.         }
  178.         $str = '';
  179.         foreach ($codes as $code) {
  180.             $str .= chr($code);
  181.         }
  182.         return $str;
  183.     }
  184.     private static function charCodeAt($str$index){
  185.         static $charCode = array();
  186.         $key = md5($str);
  187.         $index = $index + 1;
  188.         if (isset($charCode[$key])) {
  189.             return $charCode[$key][$index];
  190.         }
  191.         $charCode[$key] = unpack('C*', $str);
  192.         return $charCode[$key][$index];
  193.     }
  194.     private static function charAt($str$index = 0){
  195.         return substr($str$index, 1);
  196.     }
  197.     /**
  198.      * [_getYouku description]
  199.      * @param  [type] $vid [视频id]
  200.      * @return [type]      [description]
  201.      */
  202.     public static function _getYouku($vid){
  203.         //$link = "http://v.youku.com/player/getPlayList/VideoIDS/{$vid}/Pf/4"; //获取视频信息json 有些视频获取不全(土豆网的 火影忍者)
  204.         $blink = self::$base.$vid;
  205.         $link = $blink."/Pf/4/ctype/12/ev/1";
  206.         $retval = self::_cget($link);
  207.         $bretval = self::_cget($blink);
  208.         if ($retval) {
  209.             $rs = json_decode($retval, true);
  210.             $brs = json_decode($bretval, true);
  211.             if(!emptyempty($rs['data'][0]['error'])){
  212.                 return false;  //有错误返回false
  213.             }
  214.             $data = array();
  215.             $streamtypes = $rs['data'][0]['streamtypes'];  //可以输出的视频清晰度
  216.             $streamfileids = $rs['data'][0]['streamfileids'];
  217.             $seed = $rs['data'][0]['seed'];
  218.             $segs = $rs['data'][0]['segs'];
  219.             $ip = $rs['data'][0]['ip'];
  220.             $bsegs =  $brs['data'][0]['segs'];
  221.             list($sid$token) = explode('_', self::yk_e('becaf9be', self::yk_na($rs['data'][0]['ep'])));
  222.             foreach ($segs as $key=>$val) {
  223.                 if(in_array($key,$streamtypes)){
  224.                     foreach($val as $k=> $v){
  225.                         $no = strtoupper(dechex($v['no'])); //转换为16进制 大
  226.                         if(strlen($no) == 1){
  227.                             $no ="0".$no;  //no 为每段视频序号
  228.                         }
  229.                         //构建视频地址K值
  230.                         $_k = $v['k'];
  231.                         if ((!$_k || $_k == '') || $_k == '-1') {
  232.                             $_k = $bsegs[$key][$k]['k'];
  233.                         }
  234.                         $fileId = self::getFileid($streamfileids[$key],$seed);
  235.                         $fileId = substr($fileId,0,8).$no.substr($fileId,10);
  236.                         $ep = urlencode(iconv('gbk', 'UTF-8', self::yk_d(self::yk_e('bf7e5f01', ((($sid . '_') . $fileId) . '_') . $token))));
  237.                         //判断后缀类型 、获得后缀
  238.                         $typeArray = array("flv"=>"flv","mp4"=>"mp4","hd2"=>"flv","3gphd"=>"mp4","3gp"=>"flv","hd3"=>"flv");
  239.                         //判断视频清晰度  
  240.                         $sharpness = array("flv"=>"normal","flvhd"=>"normal","mp4"=>"high","hd2"=>"super","3gphd"=>"high","3gp"=>"normal","hd3"=>"original"); //清晰度 数组
  241.                         $fileType = $typeArray[$key];
  242.                         $data[$sharpness[$key]][$k] = "http://k.youku.com/player/getFlvPath/sid/".$sid."_00/st/{$fileType}/fileid/".$fileId."?K=".$_k."&hd=1&myp=0&ts=".((((($v['seconds'].'&ypp=0&ctype=12&ev=1&token=').$token).'&oip=').$ip).'&ep=').$ep;
  243.                     }
  244.                 }
  245.             }
  246.             //返回 图片 标题 链接  时长  视频地址
  247.             $data['img'] = $rs['data'][0]['logo'];
  248.             $data['title'] = $rs['data'][0]['title'];
  249.             $data['seconds'] = $rs['data'][0]['seconds'];
  250.             return $data;
  251.         } else {
  252.             return false;
  253.         }
  254.     }
  255.     //end  获得优酷视频需要用到的方法
  256. }

说明:调用Youku::parse('http://v.youku.com/v_show/id_XNzM4ODk0ODcy.html')就能得到所有地址。

php源码下载:

提示: 此处内容需要评论本文后才能查看.

 

参考:

3shi天下

php 获取优酷视频的真实地址(2014.6月新算法)

plugin.video.youkuvideo

you-get