设为首页 | 加入收藏
PHP
心如止水
网络编程
育儿心经
成长经历
心如止水 首页 > 心如止水 > PHP

抓取酷六、优酷、土豆等视频网站的swf地址、缩略图等

所属类别:PHP 发布者: 心如止水 来源:喜气妍妍 发布时间:2013-03-23 10:16:21

因公司业务需求,需要采集优酷、酷六、土豆、乐视网等网站的视频。所以我包装了一个php类用于解析爱奇艺、中国网络电视台、腾讯视频、优酷、土豆、酷六、新浪、我乐、乐视、搜狐视频;根据视频URL抓取视频缩略图、视频播放地址等。好先不多说先贴代码,后面再做解析。

/**
 * 解析优酷、酷6、土豆等视频;根据视频URL抓取视频缩略图、视频播放地址等。
 * 目前支持:爱奇艺、中国网络电视台、腾讯视频、优酷、土豆、酷六、新浪、我乐、乐视、搜狐、
 * @author Bear
 * @version 1.1.0
 * @copyright http://xiqiyanyan.com
 * @created 2013-03-12
 */
class Study_Model_Communal_UrlVideoAnalyzer
{
    const VERSION = '1.1.0';
    
    /**
     * 爱奇艺 
     * @var string
     */
    const WEBSITE_IQIYI = 'iqiyi.com';
    
    /**
     * 中国网络电视台
     * @var string
     */
    const WEBSITE_CNTV = 'cntv.cn';
    const WEBSITE_QQ = 'qq.com';
    const WEBSITE_YOUKU = 'youku.com';
    const WEBSITE_TUDOU = 'tudou.com';
    const WEBSITE_KU6 = 'ku6.com';
    const WEBSITE_SINA = 'sina.com.cn';
    const WEBSITE_56 = '56.com';
    
    /**
     * 乐视网
     * @var string
     */
    const WEBSITE_LETV = 'letv.com';
    
    /**
     * 搜狐
     * @var string
     */
    const WEBSITE_SOHU = 'sohu.com';
//     const WEBSITE_ = '';
//     const WEBSITE_ = '';
//     const WEBSITE_ = '';
    
    const USER_AGENT = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19';
    
    private $_error;
    private $_url;
    private $_hasImg;
    private $_supportWebsite = array('iqiyi.com'  => '_iqiyi', 
                                       'cntv.cn'    => '_cntv',
                                       'qq.com'     => '_qq', 
                                       'youku.com'  => '_youku', 
                                       'tudou.com'  => '_tudou', 
                                       'ku6.com'    => '_ku6',
                                       'sina.com.cn'=> '_sina',
                                       '56.com'     => '_56',
                                       'letv.com'   => '_letv',
                                       'sohu.com'   => '_sohu',
            );
    
    
    public function __construct() {
    }
    
    /**
     * 通过curl获取网页内容
     * @param string $url
     * @return boolean|string
     */
    public function getWebContent($url) {
        if (!$url) {
            $this->setError('URL不能为空');
        	return false;
        }
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_USERAGENT, self::USER_AGENT); // $_SERVER['HTTP_USER_AGENT']
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
        //curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); // 在发起连接前等待的时间,如果设置为0,则不等待
        $str = trim(curl_exec($ch));
        curl_close($ch);
        if (!is_string($str) || $str=='') {
            $this->setError('无法获取该网页');
        	return false;
        }
        // TODO 解压网页
//         if (is_gb2312($str)) { // $html = iconv("GB2312", "UTF-8", $html);
//         	$str = iconv('gbk', 'utf-8//IGNORE', $str);
//         } else {
        	$str = mb_convert_encoding($str, 'utf-8', 'gbk,gb18030,utf8,GB2312'); // 貌似这里不能用 utf-8//IGNORE
//         }
        return $str;
    }
    
    /*
     * 分析一个网页是否为gb2312编码
    * @param str string 网页内容
    * @return bool
    */
//     public function is_gb2312($str) {
//         for ($i = 0; $i < strlen($str); $i ++) {
//             $v = ord($str[$i]);
//             if ($v > 127) {
//                 if (($v >= 228) && ($v <= 233)) {
//                     if (($i + 2) >= (strlen($str) - 1))
//                         return true; // not enough characters
//                     $v1 = ord($str[$i + 1]);
//                     $v2 = ord($str[$i + 2]);
//                     if (($v1 >= 128) && ($v1 <= 191) && ($v2 >= 128) && ($v2 <= 191)) // utf编码
//                         return false;
//                     else
//                         return true;
//                 }
//             }
//         }
//         return true;
//     }
    
    /**
     * 解析
     * @param string $url 需要分析的url地址
     * @param boolean $hasImg 是否需要返回缩略图
     * @return array 成功返回array('title'=>'', 'img'=>'', 'url'=>''),失败返回空数组:array() 
     */
    public function analyzer($url, $hasImg = true) {
    	$url = trim($url);
    	$data = array();
    	if (!$url) {
    	    $this->setError('URL不能为空');
    		return $data;
    	}
    	
    	$website = false;
    	foreach ($this->_supportWebsite as $k=>$v) {
    		if (false !== stripos($url, $k)) {
    			$website = $v;
    			break;
    		}
    	}
    	
    	if (!$website) {
    	    $this->setError('暂不支持该视频地址');
    		return $data;
    	}
    	
    	$this->_url = $url;
    	$this->_hasImg = $hasImg;// var_dump($website);exit;
    	
    	$data = $this->$website();
//     	switch ($website) {
//     		case self::WEBSITE_IQIYI : break;
//     		case self::WEBSITE_CNTV  : break;
//     		case self::WEBSITE_QQ    : break;
//     		case self::WEBSITE_YOUKU : break;
//     		case self::WEBSITE_TUDOU : break;
//     		case self::WEBSITE_KU6   : break;
//     		case : break;
//     		default : $this->setError('暂不支持该视频地址'); return $data;break;
//     	}
    	
    	return $data;
    }
    
    /**
     * 获取错误信息
     * @return string 
     */
    public function getError() {
        return $this->_error;
    }
    
    /**
     * 设置错误信息
     * @param string $error
     */
    private function setError($error) {
    	$this->_error = $error;
    }
    
    /**
     * iqiyi.com 爱奇艺
     * http://www.iqiyi.com/zongyi/20130210/ac3ca82e47a790f3.html
     *
     *
     * // http://www.iqiyi.com/yinyue/20120420/bdfd19bb49091615.html?key=%E6%A8%8A%E5%87%A1&from=suggest&clicked=%E6%A8%8A%E5%87%A1%E3%80%8A%E6%88%91%E6%83%B3%E5%A4%A7%E5%A3%B0%E5%91%8A%E8%AF%89%E4%BD%A0%E3%80%8B%20%E7%94%B5%E8%A7%86%E5%89%A7%E3%80%8A%E8%9C%97%E5%B1%85%E3%80%8B%E7%89%87%E5%B0%BE%E6%9B%B2%28%E9%9F%B3%E4%B9%90%29
     */
    private function _iqiyi() {
        $html = $this->getWebContent($this->_url);
        $data = array();
        if (!$html) {
            return $data;
        }
    
        $data['url'] = $this->_url;
        // 获取视频
        $videoId = $this->match('/"videoId"\s*:\s*"(\w+)"/', $html); // "videoId":"176733b8ec3e4481a9459cffb449233e"
        $data['swf'] = $this->match('/var\s+flashUrl_old\s*=\s*\'(.+?)\'/', $html) . '?vid=' . $videoId; // var flashUrl_old = 'http://www.iqiyi.com/player/20120911133726/Player.swf';//低版本flash播放器
        // 获取标题
        $data['title'] = $this->match('/"title":"(.+?)"/', $html); // "title":"蛇年2013春晚 SHE《Shero》" (?非贪婪)
        // 获取图片
        if ($this->_hasImg) { // http://www.iqiyi.com/zongyi/20130210/ac3ca82e47a790f3.html
            $data['img'] = $this->imgByQQShare($this->_url);
        }
    
        return $data;
    }
    
    /**
     * youku.com 优酷
     * http://v.youku.com/v_show/id_XNTI1ODMwNjUy.html?f=19032416
     * @return array
     */
    private function _youku() {
        $html = $this->getWebContent($this->_url);
        $data = array();
        if (!$html) {
            return $data;
        }
        
        $data['url'] = $this->_url;
        // 获取视频
        $data['swf'] = $this->match('/id="link2"\s+value="(.*?)"\s*>/', $html); // id="link2" value="http://player.youku.com/player.php/Type/Folder/Fid/19032416/Ob/1/sid/XNTI1ODMwNjUy/v.swf" >
        // 获取标题
        $pattern = array('/—在线播放/', '/—优酷网/', '/,视频高清在线观看/');
        $replacement = array('', '', '');
        $data['title'] = preg_replace($pattern, $replacement, $this->match('//', $html)); // 
        // 获取图片
        if ($this->_hasImg) {
            $data['img'] = $this->match('/screenshot=(.*?)"\s+/', $html); // screenshot=http://g3.ykimg.com/0100641F46513F2F92B6330247A48F66764CA3-BB6B-E2C3-2A45-D006EADB2FF7"
        }
        
        return $data;
    }
    
    /**
     * tudou.com 土豆
     * http://www.tudou.com/programs/view/M5ZlqcwZtTQ/
     * http://www.tudou.com/listplay/WG6NNGdL3Ps.html
     * http://www.tudou.com/albumplay/vFwUST3pLx4.html
     * @return array 
     */
    private function _tudou() {
        $html = $this->getWebContent($this->_url);
        $data = array();
        if (!$html) {
            return $data;
        }
        
        $data['url'] = $this->_url;
        $boolean = preg_match('/\/view\/([\w-]+)\/?/', $this->_url, $mateches);
        if ($boolean) { // 类似:http://www.tudou.com/programs/view/M5ZlqcwZtTQ/
	        // 获取视频
	        $data['swf'] = 'http://www.tudou.com/v/' . $mateches[1] . '/v.swf';
	        // 获取标题
	        $data['title'] = $this->match('/([^<]+?)<\/span>/', $html); // 2013 Ford Focus ST 发动机声 and 百公里加速
	        // 获取图片
	        if ($this->_hasImg) {
	            $data['img'] = $this->match('/pic\s*:\s*\'(.+?)\'/', $html); // pic: 'http://i1.tdimg.com/164/609/134/p.jpg' 
	        }
        } else { 
            if (stripos($this->_url, 'albumplay') === false) { // http://www.tudou.com/listplay/WG6NNGdL3Ps.html
	            // 获取视频
	            $lcode = $this->match('/lcode\s*=\s*\'([^\']+?)\'/', $html); // ,lcode = 'WG6NNGdL3Ps'
	            $iid = $this->match('/iid:(\d+)/', $html); // iid:98250734
	            $data['swf'] = 'http://www.tudou.com/l/' . $lcode . '/&iid=' . $iid . '/v.swf';
	            
	            // 获取标题
	            $data['title'] = $this->match('/kw\s*:\s*"([^"]+?)"/', $html); // kw:"美媒爆911内幕五角大楼被导弹击中而非飞机"
	            // 获取图片
	            if ($this->_hasImg) {
	            	$data['img'] = $this->match('/pic:"(http:\/\/[^"]+?)"/', $html); // pic:"http://i1.tdimg.com/098/250/734/p.jpg"
	            }
            } else { // http://www.tudou.com/albumplay/vFwUST3pLx4.html
                // 获取视频
                $acode = $this->match('/acode\s*=\s*\'(\w+)\'/', $html); // acode='vFwUST3pLx4'
                $iid = $this->match('/iid\s*:\s*(\d+)/', $html); // iid: 130561607
                $data['swf'] = 'http://www.tudou.com/a/' . $acode . '/&iid=' . $iid . '&resourceId=0_04_02_99/v.swf';
                // 获取标题
                $data['title'] = $this->match('/kw\s*:\s*["\']([^"]+?)["\']/', $html); // kw: "49天-第1集"
            	if ($this->_hasImg) {
            		$data['img'] = $this->match('/pic\s*:\s*["\'](http:\/\/[^"\',]+)["\']/', $html); // pic: "http://g1.ykimg.com/01270F1F46511C43547BD8000000009307566D-9498-B7E6-5168-C7F433C339CF"
            	}
            }
        }
        
        return $data;
    }
    
    /**
     * qq.com 腾讯视频 (不好采)
     * http://v.qq.com/cover/o/opq82bnh2jjjlha.html 
     * http://v.qq.com/page/8/X/a/8gRWZGQSFXa.html
     * @return array
     */
    private function _qq() {
        $oldUrl = $this->_url;
        $this->_url = preg_replace('/\_\w+$/', '', $this->_url);
        //消除类似http://v.qq.com/cover/n/ngdlegvgf8v80g6.html?vid=9H9ozv5eAIs_0后面的“_0”造成获取的swf为http://imgcache.qq.com/tencentvideo_v1/player/TencentPlayer.swf?_v=20110829&vid=9H9ozv5eAIs_0不能播放 
        $data = array();
        $support = $this->match('/(\/cover\/|\/detail\/|\/play\/|\/page\/)/', $this->_url);
        if (!$support) {
            $this->setError('暂不能解析该地址');
        	return $data;
        }
        
        $html = $this->getWebContent($this->_url);
        if (!$html) {
            return $data;
        }
        $data['url'] = $oldUrl;
        $qqSwf = 'http://static.video.qq.com/TPout.swf?vid=';
        switch ($support) {
        	case '/cover/':
        	    // 获取视频
        	    $vid = $this->match('/vid:"(\w+?)"/', $html); // vid:"h00112web9l"
        	    $data['swf'] = $qqSwf . $vid;
        	    // 获取标题
        	    $data['title'] = $this->match('/title:"(.+?)"/', $html); // title:"十二生肖"
        	    // 获取图片
        	    if ($this->_hasImg) {
        	        $data['img'] = trim($this->match('/pic\s*\:\s*"(.*?)"/', $html)); // pic :"http://i.gtimg.cn/qqlive/img/jpgcache/files/qqvideo/o/opq82bnh2jjjlha_h.jpg"
        	        if ($data['img'] == '') {
        	        	$data['img'] = $this->imgByQQShare($oldUrl); // 
        	        }
        	    }
        	    break;
        	case '/page/':
        	    // 获取视频
        	    $vid = $this->match('/vid:"(\w+?)"/', $html); // vid:"8gRWZGQSFXa"
        	    $data['swf'] = $qqSwf . $vid;
        	    // 获取标题
        	    $data['title'] = $this->match('/title:"([^"]+)"/', $html); // title:" 七雄争霸巴彦淖尔联盟宣传片测试片原片",
        	    // 获取图片
        	    if ($this->_hasImg) {
        	    	$data['img'] = $this->imgByQQShare($this->_url);
        	    }
        	    break;
        	case '/detail/': 
        	    
        	    break;
        	case '/play/' : 
                // 获取视频
                $vid = $this->match('/\/(\w+)\.html/', $this->_url);
                $data['swf'] = $qqSwf . $vid;
                // 获取标题
                $data['title'] = $this->match('/title:"([^"]+?)"/', $html); // title:" 爆笑恶搞之《疯狂的舟子》 何仙姑夫作品"
                if ($this->_hasImg) {
                    $data['img'] = $this->imgByQQShare($this->_url);
                }
        	    break;
        	default : $this->setError('暂不能解析该地址');return array();break;
        }

        return $data;  
    }
    
    /**
     * sina.com.cn 新浪
     * http://video.sina.com.cn/v/b/98436902-2430117877.html
     * http://video.sina.com.cn/m/fkdst_61088353.html
     * @return array
     */
    private function _sina() {
        $data = array();
        $html = $this->getWebContent($this->_url);
        if (!$html) {
            return $data;
        }
        $boolean = preg_match('/(\d+)[-|_](\d+)/', $this->_url);
        $data['url'] = $this->_url;
        if ($boolean) { // http://video.sina.com.cn/v/b/98436902-2430117877.html
            // 获取视频
            $data['swf'] = $this->match('/swfOutsideUrl\s*\:\s*\'(http\:\/\/.+\.swf?)\'/', $html); // swfOutsideUrl:'http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=98436902_2430117877_ZxixSiAxWTLK+l1lHz2stqkP7KQNt6nnjWm0ulOjLQleQ0/XM5GQatkE5iDWAtkEqDhATZA7dvgv1x8/s.swf'
            // 获取标题
            $data['title'] = $this->match('/title\s*\:\s*\'(.+?)\'/', $html); // title:'20130302周笔畅澳门水舞间之非凡之旅演出部分'
            // 获取图片
            if ($this->_hasImg) {
                $data['img'] = $this->match('/pic\s*:\s*\'(.+?)\'/', $html); // pic: 'http://p3.v.iask.com/522/269/98436902_2.jpg'
            }
        } else { // http://video.sina.com.cn/m/xzphqj_61897881.html
            // 获取视频
            $vid = $this->match('/vid:\'(\d+\|\d+)\'/', $html); // vid:'88870101|88870103'
            $vid = str_replace('|', '_', $vid);
            $data['swf'] = 'http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=' . $vid . '/s.swf';
            // 获取标题
            $data['title'] = $this->match('/(.*?)_.*<\/title>/', $html); // <title>《向着炮火前进》第1集_高清在线观看_新浪大片_新浪网
            // 获取图片
            if ($this->_hasImg) {
            	$data['img'] = $this->match('/pic\s*:\s*\'(.+?)\'/', $html); // pic:'http://p3.v.iask.com/85/3/88870101_2.jpg'
            }
        }
        
        return $data;
    }
    
    /**
     * 56.com 我乐
     * http://www.56.com/w90/play_album-aid-10236058_vid-ODg0Mzg3ODA.html
     * http://www.56.com/u68/v_NjI2NTkxMzc.html
     * @return array
     */
    private function _56() {
        $data = array();
        $boolean = preg_match('/\/v_(\w+)\.html|\_vid\-(\w+)\.html/i', $this->_url, $matches);
        if ($boolean) { // http://www.56.com/u68/v_NjI2NTkxMzc.html  http://www.56.com/w90/play_album-aid-10236058_vid-ODg0Mzg3ODA.html
            if ($matches[1]) {
            	$vid = $matches[1];
            } else {
            	$vid = $matches[2];
            }
            
            $url = 'http://vxml.56.com/json/' . $vid . '/?src=out';
            $html = $this->getWebContent($url);
            if (!$html) {
                $this->setError('获取页面出错');
            	return $data;
            }
            $html = json_decode($html);
            if (isset($html->info)) {
                $data['url'] = $this->_url;
            	// 获取视频
            	$data['swf'] = 'http://player.56.com/v_' . $vid . '.swf';
            	// 获取标题
            	$data['title'] = $html->info->Subject;
            	// 获取图片
            	if ($this->_hasImg) {
            		$data['img'] = $html->info->bimg;
            	}
            } else {
                $this->setError('请求网页,返回错误');
            }
        } else {
            $this->setError('暂不支持此视频地址');
        }
        return $data;
    }
    
    /**
     * letv.com 乐视网
     * http://www.letv.com/ptv/pplay/86764/6.html
     * @return array
     */
    private function _letv() {
        $data = array();
        $html = $this->getWebContent($this->_url);
        if (!$html) {
            return $data;
        }
        // 通过新浪微博分享 http://v.t.sina.com.cn/share/share.php?url=$url // /scope.picLst.*?,"(.*?)"/
        
        $data['url'] = $this->_url;
        // 获取视频
        $data['swf'] = 'http://i7.imgs.letv.com/player/swfPlayer.swf?autoPlay=0&id=' . $this->match('/vid\s*:\s*(\w+)/', $html); // vid:1929864  http://www.letv.com/player/x1929864.swf
        // http://img1.c0.letv.com/ptv/player/swfPlayer.swf?id=1929864
        // $data['swf'] = $this->match('/input\sname=""\stype="text"\svalue="(.*)"\s/', $html);
        // 获取标题
        $data['title'] = $this->match('/title\s*:\s*"(.+?)"/', $html); // title:"我叫郝聪明06"
        // 获取图片
        if ($this->_hasImg) {
            $data['img'] = $this->match('/pic\s*:\s*"(http:\/\/.+?)"/', $html); // pic:"http://i0.letvimg.com/yunzhuanma/201303/19/0023564646d1bb07cb15a6219cbe7890/thumb/2.jpg"
        }
        
        return $data;
    }
    
    /**
     * sohu.com 搜狐视频
     * http://tv.sohu.com/20130318/n369187910.shtml#3241
     * 
     * @return array
     */
    private function _sohu() {
        $data = array();
        $html = $this->getWebContent($this->_url); // iconv("GB2312", "UTF-8", $html);
        preg_match_all('/"og:(?:videosrc|title|image)"\s+content\s*=\s*"(.+?)"/is', $html, $matches); // ?: 非捕获匹配

        $data['url'] = $this->_url;
        // 获取视频
        $data['swf'] = $matches[1][0];
        // 获取标题
        $data['title'] = str_replace(' - 搜狐视频', '', $matches[1][1]);
        // 获取图片
        if ($this->_hasImg) {
        	$data['img'] = $matches[1][2];
        }

        return $data;
    }
    
    /**
     * ku6.com 酷六网
     * http://v.ku6.com/special/show_6578054/H8iskaWn5zBCYZCf3aaKeg...html?nr=1
     * @return array
     */
    private function _ku6() {
        $html = $this->getWebContent($this->_url);
        $data = array();
        if (!$html) {
            return $data;
        }
        
        $data['url'] = $this->_url;
        // 获取视频
        $data['swf'] = $this->match('/match('/(.*)<\/h1>/', $html);
        // 获取图片
        if ($this->_hasImg) {
            $data['img'] = $this->match('/cover\s*:\s*"(.*?)"/', $html); // cover: "http://vi0.ku6img.com/data1/p2/ku6video/2013/3/11/19/1368234392830_46155466_46155466/6.jpg"
        }
        
        return $data;
    }
    
    /**
     * cntv.cn 中国网络电视台
     * http://tv.cntv.cn/video/C40657/7997f6053489453a96352e58d54a96b3 
     * http://shaoer.cntv.cn/children/C30147/classpage/video/20110906/100432.shtml
     * http://xiyou.cntv.cn/v-7cef4d76-8930-11e2-b474-a4badb4689bc.html
     * @return array 
     */
    private function _cntv() {
        $html = $this->getWebContent($this->_url);
        $data = array();
        if (!$html) {
        	return $data;
        }

        $data['url'] = $this->_url;
        if (strpos($this->_url, 'xiyou.cntv.cn') === false) {
            // 获取视频
            $videoId = $this->match('/"videoId",\s*"(\w+)"/', $html, 1); // "videoId", "VIDE100144371768"
            $videoCenterId = $this->match('/"videoCenterId",\s*"(\w+)"/', $html); // "videoCenterId","7997f6053489453a96352e58d54a96b3"
            $data['swf'] = 'http://player.cntv.cn/standard/cntvOutSidePlayer.swf?v=2.0.2013.1.30.0';
            $data['swf'] .= '&videoId=' . $videoId . '&videoCenterId=' . $videoCenterId;
            // 获取标题 
            $data['title'] = $this->match('/(.*?)\_.*中国网络电视台<\/title>/', $html); // <title>电视剧《触摸未来》预告片_触摸未来_中国网络电视台 ? : 表示非贪婪
            // 获取图片 
            if ($this->_hasImg) {
        	    $data['img'] = $this->imgBySinaShare($this->_url);
            }
        } else { // 爱西柚
            // 获取视频
            $id = $this->match('/var\s+item_id\s*=\s*fid\s*=\s"([^"]+?)"\s*;/', $html); // var item_id = fid = "f8bb4c94-910e-11e2-89a1-001e0bd5b3ca";
            $data['swf'] = 'http://static.xiyou.cntv.cn/flash/player.swf?ver=2.090&id=' . $id;
            // 获取标题
            $data['title'] = $this->match('/.*>([^><]+?)<.*<\/h1>/', $html); // (可能以后有变)
            // 获取图片
            if ($this->_hasImg) {
                $data['img'] = $this->imgByQQShare($this->_url);
            }
        }
          
        return $data;
    }
    

    
    /**
     * 通过QQ分享页来获取图片
     * @param string $url 要分享的各视频网站详情页地址
     * @return string
     */
    public function imgByQQShare($url) {
        $qqShare = 'http://share.v.t.qq.com/index.php?c=share&a=index&url=' . $url;
        $shareHtml = $this->getWebContent($qqShare);
        return $this->match('//', $shareHtml); // 
    }
    
    /**
     * 通过新浪(sina)微博分享页来获取图片
     * @param string $url
     * @return string
     */
    public function imgBySinaShare($url) {
        $sinaShare = 'http://v.t.sina.com.cn/share/share.php?url=' . urlencode($url);
        //$shareHtml = $this->getWebContent($sinaShare);
        $shareHtml = file_get_contents($sinaShare); // 无解:貌似用curl无法返回html
        return $this->match('/scope.picLst\s*=\s*\[.*?,\s*"(http:\/\/[^"]+?)"\s*\]\s*;/', $shareHtml); 
        // scope.picLst = ["","http://p1.img.cctvpic.com/fmspic/2011/09/06/D465A477B3524a308B89C568DA8EC3BB-180.jpg"];
    }

    /**
     * 使用正则匹配获取字符串
     * @param string $pattern 需要匹配的正则表达式
     * @param string $subject 用于匹配的字符串
     * @param integer $num 需要获取匹配的第几个值
     * @return string
     */
    public static function match($pattern, $subject, $num = 1) {
    	$boolean = preg_match($pattern, $subject, $matches);
    	$str = '';
    	if ($boolean) {
    		$str = $matches[$num];
    	}
    	return $str;
    }
	
}

解析一下,为何我要用 $hasImg(是否需要图片),这是因为很多的缩略图没法获取到,需要二次请求才能获取到,有时在对速度要求比较高的情况下就可以不要图片。

大致思路是获取一个详情页,然后用正则匹配把要的信息匹配出来。当然这有个不好的就是,如果网站改版了,你的程序就没法用了,你的也要跟着改。最好的做发是如果视频网站提供了API,那调用api来获取是比较稳定的。目前我只知道56、土豆网提供了这样的api,下一步此类将继续往这方面更新。敬请期待。。。

程序未免有些Bug,和一些网址是不能更新的。所以我将不断的更新此类,有什么问题欢迎各位亲回贴讨论。

UrlVideoAnalyzer类的下载:UrlVideoAnalyzer

程序借鉴了网络上的一些资源和我们同事的一些思想,在这里谢谢他们了;但大部分代码都是我亲手写的;欢迎各位转载,但请注明出处:喜气妍妍:http://xiqiyanyan.com/blog.php?id=71  请尊重别人的劳动成果!

标签: 优酷 ; swf视频 ; 土豆缩略图 ; PHP ;

100% 0% 欢迎顶踩!
        13 票                 0
顶 踩
看过本文的所有网友评论:
我也来评论几句:
验证码: 请输入右边图片上的字母或数字(不区分大小写);看不清,请直接点击图片即可换一张