当前位置:首页 > PHP教程 > php类库 > 列表

PHP抓取、分析国内视频网站的视频信息工具类

发布:smiling 来源: PHP粉丝网  添加日期:2020-11-05 11:46:59 浏览: 评论:0 

VideoUrlParser是一款基于PHP根据视频URL抓取视频信息的工具,支持优酷、土豆、酷六、56、乐视、搜狐、腾讯、新浪。

使用方法:

  1. require_once "VideoUrlParser.class.php"; 
  2. $url = "http://v.youku.com/v_show/id_XMjkwMzc0Njg4.html"; 
  3. $info = VedioUrlParser::parse($url); 
  4. echo $info; 

说明:调用该工具php文件VideoUrlParser.class.php,$url变量后面的字符串为视频页的地址,然后使用echo输出变量$info。

附:info含有的几个值,分别是img(用于视频缩略图),title(视频标题),url(地址),swf(视频swf播放地址)。我只用到了img和swf地址。具体的可以根据自己的需要进行调整。

VideoUrlParser类源码:

  1. <?php 
  2. /** 
  3.  * Video  
  4.  *  
  5.  * @package  
  6.  * @version 1.2 
  7.  * @copyright 2005-2011 HDJ.ME  
  8.  * @author Dijia Huang <huangdijia@gmail.com>  
  9.  * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} 
  10.  * 
  11.  * Usage 
  12.  * require_once "VideoUrlParser.class.php"; 
  13.  * $urls[] = "http://v.youku.com/v_show/id_XMjI4MDM4NDc2.html"; 
  14.  * $urls[] = "http://www.tudou.com/playlist/p/l13087099.html"; 
  15.  * $urls[] = "http://www.tudou.com/programs/view/ufg-A3tlcxk/"; 
  16.  * $urls[] = "http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html"; 
  17.  * $urls[] = "http://www.56.com/u68/v_NjI2NTkxMzc.html"; 
  18.  * $urls[] = "http://www.letv.com/ptv/vplay/1168109.html"; 
  19.  * $urls[] = "http://video.sina.com.cn/v/b/46909166-1290055681.html"; 
  20.  * 
  21.  * foreach($urls as $url){ 
  22.  *     $info = VideoUrlParser::parse($url); 
  23.  *     //var_dump($info); 
  24.  *     echo "<a href='{$info['url']}' target='_new'>{$info['title']}</a>"; 
  25.  *     echo "<br />"; 
  26.  *     echo $info['object']; 
  27.  *     echo "<br />"; 
  28.  * } 
  29.  * 
  30.  * 
  31.  * 
  32.  * //优酷 
  33.  * http://v.youku.com/v_show/id_XMjU0NjY4OTEy.html 
  34.  * <embed src="http://player.youku.com/player.php/sid/XMjU0NjY4OTEy/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed> 
  35.  *  
  36.  * //酷六 
  37.  * http://v.ku6.com/special/show_3917484/x0BMXAbgZdQS6FqN.html 
  38.  * <embed src="http://player.ku6.com/refer/x0BMXAbgZdQS6FqN/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"></embed> 
  39.  *  
  40.  * //土豆 
  41.  * http://www.tudou.com/playlist/p/a65929.html?iid=74905844 
  42.  * <embed src="http://www.tudou.com/l/A_0urj-Geec/&iid=74905844/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="480" height="400"></embed> 
  43.  *  
  44.  * //56 
  45.  * http://www.56.com/u98/v_NTkyODY2NTU.html 
  46.  * <embed src="http://player.56.com/v_NTkyODY2NTU.swf"  type="application/x-shockwave-flash" width="480" height="405" allowNetworking="all" allowScriptAccess="always"></embed> 
  47.  *  
  48.  * //新浪播客 
  49.  * http://video.sina.com.cn/v/b/46909166-1290055681.html 
  50.  * <embed src="http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=46909166_1290055681_b0K1GHEwDWbK+l1lHz2stqkP7KQNt6nki2O0u1ehIwZYQ0/XM5GdZNQH6SjQBtkEqDhAQJ42dfcn0Rs/s.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" name="ssss" allowFullScreen="true" allowScriptAccess="always" width="480" height="370"></embed> 
  51.  *  
  52.  * //乐视 
  53.  * http://www.letv.com/ptv/vplay/1168109.html 
  54.  * <embed src="http://i3.imgs.letv.com/player/swfPlayer.swf?id=1168109&host=app.letv.com&vstatus=1&AP=1&logoMask=0&isShowP2p=0&autoplay=true" quality="high" scale="NO_SCALE" wmode="opaque" bgcolor="#000000" width="480" height="388" name="FLV_player" align="middle" allowscriptaccess="always" allowfullscreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> 
  55.  */ 
  56.  
  57. class VideoUrlParser 
  58. { 
  59.     const USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) 
  60.         Chrome/8.0.552.224 Safari/534.10"; 
  61.     const CHECK_URL_VALID = "/(youku\.com|tudou\.com|ku6\.com|56\.com|letv\.com|video\.sina\.com\.cn|(my\.)?tv\.sohu\.com|v\.qq\.com)/"; 
  62.  
  63.     /** 
  64.      * parse  
  65.      *  
  66.      * @param string $url  
  67.      * @param mixed $createObject  
  68.      * @static 
  69.      * @access public 
  70.      * @return void 
  71.      */ 
  72.     static public function parse($url='', $createObject=true){ 
  73.         $lowerurl = strtolower($url); 
  74.         preg_match(self::CHECK_URL_VALID, $lowerurl, $matches); 
  75.         if(!$matches) return false; 
  76.  
  77.         switch($matches[1]){ 
  78.         case 'youku.com': 
  79.             $data = self::_parseYouku($url); 
  80.             break; 
  81.         case 'tudou.com': 
  82.             $data = self::_parseTudou($url); 
  83.             break; 
  84.         case 'ku6.com': 
  85.             $data = self::_parseKu6($url); 
  86.             break; 
  87.         case '56.com': 
  88.             $data = self::_parse56($url); 
  89.             break; 
  90.         case 'letv.com': 
  91.             $data = self::_parseLetv($url); 
  92.             break; 
  93.         case 'video.sina.com.cn': 
  94.             $data = self::_parseSina($url); 
  95.             break; 
  96.         case 'my.tv.sohu.com': 
  97.         case 'tv.sohu.com': 
  98.         case 'sohu.com': 
  99.             $data = self::_parseSohu($url); 
  100.             break; 
  101.         case 'v.qq.com': 
  102.             $data = self::_parseQq($url); 
  103.             break; 
  104.         default: 
  105.             $data = false; 
  106.         } 
  107.  
  108.         if($data && $createObject) $data['object'] = "<embed src=\"{$data['swf']}\" quality=\"high\" width=\"480\" height=\"400\" align=\"middle\" allowNetworking=\"all\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\"></embed>"; 
  109.         return $data; 
  110.     } 
  111.     /** 
  112.      * 腾讯视频  
  113.      * http://v.qq.com/cover/o/o9tab7nuu0q3esh.html?vid=97abu74o4w3_0 
  114.      * http://v.qq.com/play/97abu74o4w3.html 
  115.      * http://v.qq.com/cover/d/dtdqyd8g7xvoj0o.html 
  116.      * http://v.qq.com/cover/d/dtdqyd8g7xvoj0o/9SfqULsrtSb.html 
  117.      * http://imgcache.qq.com/tencentvideo_v1/player/TencentPlayer.swf?_v=20110829&vid=97abu74o4w3&autoplay=1&list=2&showcfg=1&tpid=23&title=%E7%AC%AC%E4%B8%80%E7%8E%B0%E5%9C%BA&adplay=1&cid=o9tab7nuu0q3esh 
  118.      */  
  119.     private function _parseQq($url){ 
  120.         if(preg_match("/\/play\//", $url)){ 
  121.             $html = self::_fget($url); 
  122.             preg_match("/url=[^\"]+/", $html, $matches); 
  123.             if(!$matches); return false; 
  124.             $url = $matches[0]; 
  125.         } 
  126.         preg_match("/vid=([^\_]+)/", $url, $matches); 
  127.         $vid = $matches[1]; 
  128.         $html = self::_fget($url); 
  129.         // query 
  130.         preg_match("/flashvars\s=\s\"([^;]+)/s", $html, $matches); 
  131.         $query = $matches[1]; 
  132.         if(!$vid){ 
  133.             preg_match("/vid\s?=\s?vid\s?\|\|\s?\"(\w+)\";/i", $html, $matches); 
  134.             $vid = $matches[1]; 
  135.         } 
  136.         $query = str_replace('"+vid+"', $vid, $query); 
  137.         parse_str($query, $output); 
  138.         $data['img'] = "http://vpic.video.qq.com/{$$output['cid']}/{$vid}_1.jpg"; 
  139.         $data['url'] = $url; 
  140.         $data['title'] = $output['title']; 
  141.         $data['swf'] = "http://imgcache.qq.com/tencentvideo_v1/player/TencentPlayer.swf?".$query; 
  142.         return $data; 
  143.     } 
  144.      
  145.  
  146.     /** 
  147.      * 优酷网  
  148.      * http://v.youku.com/v_show/id_XMjI4MDM4NDc2.html 
  149.      * http://player.youku.com/player.php/sid/XMjU0NjI2Njg4/v.swf 
  150.      */  
  151.     private function _parseYouku($url){ 
  152.         preg_match("#id\_(\w+)#", $url, $matches); 
  153.  
  154.         if (emptyempty($matches)){ 
  155.             preg_match("#v_playlist\/#", $url, $mat); 
  156.             if(!$mat) return false; 
  157.  
  158.             $html = self::_fget($url); 
  159.  
  160.             preg_match("#videoId2\s*=\s*\'(\w+)\'#", $html, $matches); 
  161.             if(!$matches) return false; 
  162.         } 
  163.  
  164.         $link = "http://v.youku.com/player/getPlayList/VideoIDS/{$matches[1]}/timezone/+08/version/5/source/out?password=&ran=2513&n=3"; 
  165.  
  166.         $retval = self::_cget($link); 
  167.         if ($retval) { 
  168.             $json = json_decode($retval, true); 
  169.  
  170.             $data['img'] = $json['data'][0]['logo']; 
  171.             $data['title'] = $json['data'][0]['title']; 
  172.             $data['url'] = $url; 
  173.             $data['swf'] = "http://player.youku.com/player.php/sid/{$matches[1]}/v.swf"; 
  174.  
  175.             return $data; 
  176.         } else { 
  177.             return false; 
  178.         } 
  179.     } 
  180.  
  181.     /** 
  182.      * 土豆网 
  183.      * http://www.tudou.com/programs/view/Wtt3FjiDxEE/ 
  184.      * http://www.tudou.com/v/Wtt3FjiDxEE/v.swf 
  185.      *  
  186.      * http://www.tudou.com/playlist/p/a65718.html?iid=74909603 
  187.      * http://www.tudou.com/l/G5BzgI4lAb8/&iid=74909603/v.swf 
  188.      */ 
  189.     private function _parseTudou($url){ 
  190.         preg_match("#view/([-\w]+)/#", $url, $matches); 
  191.  
  192.         if (emptyempty($matches)) { 
  193.             if (strpos($url, "/playlist/") == false) return false; 
  194.  
  195.             if(strpos($url, 'iid=') !== false){ 
  196.                 $quarr = explode("iid=", $lowerurl); 
  197.                 if (emptyempty($quarr[1]))  return false; 
  198.             }elseif(preg_match("#p\/l(\d+).#", $lowerurl, $quarr)){ 
  199.                 if (emptyempty($quarr[1])) return false; 
  200.             } 
  201.  
  202.             $html = self::_fget($url); 
  203.             $html = iconv("GB2312", "UTF-8", $html); 
  204.  
  205.             preg_match("/lid_code\s=\slcode\s=\s[\'\"]([^\'\"]+)/s", $html, $matches); 
  206.             $icode = $matches[1]; 
  207.  
  208.             preg_match("/iid\s=\s.*?\|\|\s(\d+)/sx", $html, $matches); 
  209.             $iid = $matches[1]; 
  210.  
  211.             preg_match("/listData\s=\s(\[\{.*\}\])/sx", $html, $matches); 
  212.  
  213.             $find = array("/\n/", '/\s/', "/:[^\d\"]\w+[^\,]*,/i", "/(\{|,)(\w+):/"); 
  214.             $replace = array("", "", ':"",', '\\1"\\2":'); 
  215.             $str = preg_replace($find, $replace, $matches[1]); 
  216.             //var_dump($str); 
  217.             $json = json_decode($str); 
  218.             //var_dump($json);exit; 
  219.             if(is_array($json) || is_object($json) && !emptyempty($json)){ 
  220.                 foreach ($json as $val) { 
  221.                     if ($val->iid == $iid) { 
  222.                         break; 
  223.                     } 
  224.                 } 
  225.             } 
  226.  
  227.             $data['img'] = $val->pic; 
  228.             $data['title'] = $val->title; 
  229.             $data['url'] = $url; 
  230.             $data['swf'] = "http://www.tudou.com/l/{$icode}/&iid={$iid}/v.swf"; 
  231.  
  232.             return $data; 
  233.         } 
  234.  
  235.         $host = "www.tudou.com"; 
  236.         $path = "/v/{$matches[1]}/v.swf"; 
  237.  
  238.         $ret = self::_fsget($path, $host); 
  239.  
  240.         if (preg_match("#\nLocation: (.*)\n#", $ret, $mat)) { 
  241.             parse_str(parse_url(urldecode($mat[1]), PHP_URL_QUERY)); 
  242.  
  243.             $data['img'] = $snap_pic; 
  244.             $data['title'] = $title; 
  245.             $data['url'] = $url; 
  246.             $data['swf'] = "http://www.tudou.com/v/{$matches[1]}/v.swf"; 
  247.  
  248.             return $data; 
  249.         } 
  250.         return false; 
  251.     } 
  252.  
  253.     /** 
  254.      * 酷6网  
  255.      * http://v.ku6.com/film/show_520/3X93vo4tIS7uotHg.html 
  256.      * http://v.ku6.com/special/show_4926690/Klze2mhMeSK6g05X.html 
  257.      * http://v.ku6.com/show/7US-kDXjyKyIInDevhpwHg...html 
  258.      * http://player.ku6.com/refer/3X93vo4tIS7uotHg/v.swf 
  259.      */ 
  260.     private function _parseKu6($url){ 
  261.         if(preg_match("/show\_/", $url)){ 
  262.             preg_match("#/([-\w]+)\.html#", $url, $matches); 
  263.             $url = "http://v.ku6.com/fetchVideo4Player/{$matches[1]}.html"; 
  264.             $html = self::_fget($url); 
  265.  
  266.             if ($html) { 
  267.                 $json = json_decode($html, true); 
  268.                 if(!$json) return false; 
  269.  
  270.                 $data['img'] = $json['data']['picpath']; 
  271.                 $data['title'] = $json['data']['t']; 
  272.                 $data['url'] = $url; 
  273.                 $data['swf'] = "http://player.ku6.com/refer/{$matches[1]}/v.swf"; 
  274.  
  275.                 return $data; 
  276.             } else { 
  277.                 return false; 
  278.             } 
  279.         }elseif(preg_match("/show\//", $url, $matches)){ 
  280.             $html = self::_fget($url); 
  281.             preg_match("/ObjectInfo\s?=\s?([^\n]*)};/si", $html, $matches); 
  282.             $str = $matches[1]; 
  283.             // img 
  284.             preg_match("/cover\s?:\s?\"([^\"]+)\"/", $str, $matches); 
  285.             $data['img'] = $matches[1]; 
  286.             // title 
  287.             preg_match("/title\"?\s?:\s?\"([^\"]+)\"/", $str, $matches); 
  288.             $jsstr = "{\"title\":\"{$matches[1]}\"}"; 
  289.             $json = json_decode($jsstr, true); 
  290.             $data['title'] = $json['title']; 
  291.             // url 
  292.             $data['url'] = $url; 
  293.             // query 
  294.             preg_match("/\"(vid=[^\"]+)\"\sname=\"flashVars\"/s", $html, $matches); 
  295.             $query = str_replace("&amp;", '&', $matches[1]); 
  296.             preg_match("/\/\/player\.ku6cdn\.com[^\"\']+/", $html, $matches); 
  297.             $data['swf'] = 'http:'.$matches[0].'?'.$query; 
  298.  
  299.             return $data; 
  300.         } 
  301.     } 
  302.  
  303.     /** 
  304.      * 56网 
  305.      * http://www.56.com/u73/v_NTkzMDcwNDY.html 
  306.      * http://player.56.com/v_NTkzMDcwNDY.swf 
  307.      */ 
  308.     private function _parse56($url){ 
  309.         preg_match("#/v_(\w+)\.html#", $url, $matches); 
  310.  
  311.         if (emptyempty($matches)) return false; 
  312.  
  313.         $link="http://vxml.56.com/json/{$matches[1]}/?src=out"; 
  314.         $retval = self::_cget($link); 
  315.  
  316.         if ($retval) { 
  317.             $json = json_decode($retval, true); 
  318.  
  319.             $data['img'] = $json['info']['img']; 
  320.             $data['title'] = $json['info']['Subject']; 
  321.             $data['url'] = $url; 
  322.             $data['swf'] = "http://player.56.com/v_{$matches[1]}.swf"; 
  323.  
  324.             return $data; 
  325.         } else { 
  326.             return false; 
  327.         }  
  328.     } 
  329.  
  330.     /** 
  331.      * 乐视网  
  332.      * http://www.letv.com/ptv/vplay/1168109.html 
  333.      * http://www.letv.com/player/x1168109.swf 
  334.      */ 
  335.     private function _parseLetv($url){ 
  336.         $html = self::_fget($url); 
  337.         preg_match("#http://v.t.sina.com.cn/([^'\"]*)#", $html, $matches); 
  338.         parse_str(parse_url(urldecode($matches[0]), PHP_URL_QUERY)); 
  339.         preg_match("#vplay/(\d+)#", $url, $matches); 
  340.         $data['img'] = $pic; 
  341.         $data['title'] = $title; 
  342.         $data['url'] = $url; 
  343.         $data['swf'] = "http://www.letv.com/player/x{$matches[1]}.swf"; 
  344.  
  345.         return $data; 
  346.     } 
  347.  
  348.     // 搜狐TV http://my.tv.sohu.com/u/vw/5101536 
  349.     private function _parseSohu($url){ 
  350.         $html = self::_fget($url); 
  351.         $html = iconv("GB2312", "UTF-8", $html); 
  352.         preg_match_all("/og:(?:title|image|videosrc)\"\scontent=\"([^\"]+)\"/s", $html, $matches); 
  353.         $data['img'] = $matches[1][1]; 
  354.         $data['title'] = $matches[1][0]; 
  355.         $data['url'] = $url; 
  356.         $data['swf'] = $matches[1][2]; 
  357.         return $data; 
  358.     } 
  359.  
  360.     /* 
  361.      * 新浪播客 
  362.      * http://video.sina.com.cn/v/b/48717043-1290055681.html 
  363.      * http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=48717043_1290055681_PUzkSndrDzXK+l1lHz2stqkP7KQNt6nki2O0u1ehIwZYQ0/XM5GdatoG5ynSA9kEqDhAQJA4dPkm0x4/s.swf 
  364.      */ 
  365.     private function _parseSina($url){ 
  366.         preg_match("/(\d+)(?:\-|\_)(\d+)/", $url, $matches); 
  367.         $url = "http://video.sina.com.cn/v/b/{$matches[1]}-{$matches[2]}.html"; 
  368.         $html = self::_fget($url); 
  369.         preg_match("/video\s?:\s?([^<]+)}/", $html, $matches); 
  370.         $find = array("/\n/", "/\s*/", "/\'/", "/\{([^:,]+):/", "/,([^:]+):/", "/:[^\d\"]\w+[^\,]*,/i"); 
  371.         $replace = array('', '', '"', '{"\\1":', ',"\\1":', ':"",'); 
  372.         $str = preg_replace($find, $replace, $matches[1]); 
  373.         $arr = json_decode($str, true); 
  374.  
  375.         $data['img'] = $arr['pic']; 
  376.         $data['title'] = $arr['title']; 
  377.         $data['url'] = $url; 
  378.         $data['swf'] = $arr['swfOutsideUrl']; 
  379.  
  380.         return $data; 
  381.     } 
  382.  
  383.     /* 
  384.      * 通过 file_get_contents 获取内容 
  385.      */ 
  386.     private function _fget($url=''){ 
  387.         if(!$url) return false; 
  388.         $html = file_get_contents($url); 
  389.         // 判断是否gzip压缩 
  390.         if($dehtml = self::_gzdecode($html)) 
  391.             return $dehtml; 
  392.         else 
  393.             return $html; 
  394.     } 
  395.  
  396.     /* 
  397.      * 通过 fsockopen 获取内容 
  398.      */ 
  399.     private function _fsget($path='/', $host='', $user_agent=''){ 
  400.         if(!$path || !$host) return false; 
  401.         $user_agent = $user_agent ? $user_agent : self::USER_AGENT; 
  402.  
  403.         $out = <<<HEADER 
  404. GET $path HTTP/1.1 
  405. Host: $host 
  406. User-Agent: $user_agent 
  407. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
  408. Accept-Language: zh-cn,zh;q=0.5 
  409. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7\r\n\r\n 
  410. HEADER; 
  411.         $fp = @fsockopen($host, 80, $errno, $errstr, 10); 
  412.         if (!$fp)  return false; 
  413.         if(!fputs($fp, $out)) return false; 
  414.         while ( !feof($fp) ) { 
  415.             $html .= fgets($fp, 1024); 
  416.         } 
  417.         fclose($fp); 
  418.         // 判断是否gzip压缩 
  419.         if($dehtml = self::_gzdecode($html)) 
  420.             return $dehtml; 
  421.         else 
  422.             return $html; 
  423.     } 
  424.  
  425.     /* 
  426.      * 通过 curl 获取内容 
  427.      */ 
  428.     private function _cget($url='', $user_agent=''){ 
  429.         if(!$url) return; 
  430.  
  431.         $user_agent = $user_agent ? $user_agent : self::USER_AGENT; 
  432.  
  433.         $ch = curl_init(); 
  434.         curl_setopt($ch, CURLOPT_URL, $url); 
  435.         curl_setopt($ch, CURLOPT_HEADER, 0); 
  436.         if(strlen($user_agent)) curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
  437.  
  438.         ob_start(); 
  439.         curl_exec($ch); 
  440.         $html = ob_get_contents();         
  441.         ob_end_clean(); 
  442.  
  443.         if(curl_errno($ch)){ 
  444.             curl_close($ch); 
  445.             return false; 
  446.         } 
  447.         curl_close($ch); 
  448.         if(!is_string($html) || !strlen($html)){ 
  449.             return false; 
  450.         } 
  451.         return $html; 
  452.         // 判断是否gzip压缩 
  453.         if($dehtml = self::_gzdecode($html)) 
  454.             return $dehtml; 
  455.         else 
  456.             return $html; 
  457.     } 
  458.  
  459.     private function _gzdecode($data) { 
  460.         $len = strlen ( $data ); 
  461.         if ($len < 18 || strcmp ( substr ( $data, 0, 2 ), "\x1f\x8b" )) { 
  462.             return null; // Not GZIP format (See RFC 1952)  
  463.         } 
  464.         $method = ord ( substr ( $data, 2, 1 ) ); // Compression method  
  465.         $flags = ord ( substr ( $data, 3, 1 ) ); // Flags  
  466.         if ($flags & 31 != $flags) { 
  467.             // Reserved bits are set -- NOT ALLOWED by RFC 1952  
  468.             return null; 
  469.         } 
  470.         // NOTE: $mtime may be negative (PHP integer limitations)  
  471.         $mtime = unpack ( "V", substr ( $data, 4, 4 ) ); 
  472.         $mtime = $mtime [1]; 
  473.         $xfl = substr ( $data, 8, 1 ); 
  474.         $os = substr ( $data, 8, 1 ); 
  475.         $headerlen = 10; 
  476.         $extralen = 0; 
  477.         $extra = ""; 
  478.         if ($flags & 4) { 
  479.             // 2-byte length prefixed EXTRA data in header  
  480.             if ($len - $headerlen - 2 < 8) { 
  481.                 return false; // Invalid format  
  482.             } 
  483.             $extralen = unpack ( "v", substr ( $data, 8, 2 ) ); 
  484.             $extralen = $extralen [1]; 
  485.             if ($len - $headerlen - 2 - $extralen < 8) { 
  486.                 return false; // Invalid format  
  487.             } 
  488.             $extra = substr ( $data, 10, $extralen ); 
  489.             $headerlen += 2 + $extralen; 
  490.         } 
  491.  
  492.         $filenamelen = 0; 
  493.         $filename = ""; 
  494.         if ($flags & 8) { 
  495.             // C-style string file NAME data in header  
  496.             if ($len - $headerlen - 1 < 8) { 
  497.                 return false; // Invalid format  
  498.             } 
  499.             $filenamelen = strpos ( substr ( $data, 8 + $extralen ), chr ( 0 ) ); 
  500.             if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) { 
  501.                 return false; // Invalid format  
  502.             } 
  503.             $filename = substr ( $data, $headerlen, $filenamelen ); 
  504.             $headerlen += $filenamelen + 1; 
  505.         } 
  506.  
  507.         $commentlen = 0; 
  508.         $comment = ""; 
  509.         if ($flags & 16) { 
  510.             // C-style string COMMENT data in header  
  511.             if ($len - $headerlen - 1 < 8) { 
  512.                 return false; // Invalid format  
  513.             } 
  514.             $commentlen = strpos ( substr ( $data, 8 + $extralen + $filenamelen ), chr ( 0 ) ); 
  515.             if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) { 
  516.                 return false; // Invalid header format  
  517.             } 
  518.             $comment = substr ( $data, $headerlen, $commentlen ); 
  519.             $headerlen += $commentlen + 1; 
  520.         } 
  521.  
  522.         $headercrc = ""; 
  523.         if ($flags & 1) { 
  524.             // 2-bytes (lowest order) of CRC32 on header present  
  525.             if ($len - $headerlen - 2 < 8) { 
  526.                 return false; // Invalid format  
  527.             } 
  528.             $calccrc = crc32 ( substr ( $data, 0, $headerlen ) ) & 0xffff; 
  529.             $headercrc = unpack ( "v", substr ( $data, $headerlen, 2 ) ); 
  530.             $headercrc = $headercrc [1]; 
  531.             if ($headercrc != $calccrc) { 
  532.                 return false; // Bad header CRC  
  533.             } 
  534.             $headerlen += 2; 
  535.         } 
  536.  
  537.         // GZIP FOOTER - These be negative due to PHP's limitations  
  538.         $datacrc = unpack ( "V", substr ( $data, - 8, 4 ) ); 
  539.         $datacrc = $datacrc [1]; 
  540.         $isize = unpack ( "V", substr ( $data, - 4 ) ); 
  541.         $isize = $isize [1]; 
  542.  
  543.         // Perform the decompression:  
  544.         $bodylen = $len - $headerlen - 8; 
  545.         if ($bodylen < 1) { 
  546.             // This should never happen - IMPLEMENTATION BUG!  
  547.             return null; 
  548.         } 
  549.         $body = substr ( $data, $headerlen, $bodylen ); 
  550.         $data = ""; 
  551.         if ($bodylen > 0) { 
  552.             switch ($method) { 
  553.                 case 8 : 
  554.                     // Currently the only supported compression method:  
  555.                     $data = gzinflate ( $body ); 
  556.                     break; 
  557.                 default : 
  558.                     // Unknown compression method  
  559.                     return false; 
  560.             } 
  561.         } else { 
  562.             //... 
  563.         } 
  564.  
  565.         if ($isize != strlen ( $data ) || crc32 ( $data ) != $datacrc) { 
  566.             // Bad format!  Length or CRC doesn't match!  
  567.             return false; 
  568.         } 
  569.         return $data; 
  570.     } 
  571. } 

Tags: PHP抓取 PHP视频网站

分享到: