欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

磁力链接打包下载

程序员文章站 2022-03-04 11:08:21
...
keyWord=$keyWord;
		$this->saveFile=$saveFile;
		$this->minSize=$minSize;
		$this->page=$pageRange[0];
		$this->maxPage=$pageRange[1];
	}
	
	public function run(){
	    
		while($this->flag && $this->maxPage>$this->page){
		    $this->timestamp=$this->microtimeFloat();
			$this->_execute();
			$this->page++;
			$this->_notice();
			
		}
	}
	/**
	 * 执行
	 */
	protected function _execute(){
	    
		$this->_getUrl();
		$this->_getHtmlPage();
		$this->_parseHtml();
		if($this->_currentMagnetCount){//当有磁力链接时保存
			$this->_save();
		}
		
	}
	
	public function microtimeFloat(){
        list($usec, $sec) = explode(" ", microtime());
        return sprintf('%01.2f',(float)$usec + (float)$sec);
    }
    /**
     * 通知
     */
	protected function _notice(){
	    
	    $currentTime = $this->microtimeFloat();
	    $useTime =sprintf('%01.2f', $currentTime-$this->timestamp);
	    $this->timestamp = $currentTime;
	    echo '第'.$this->page.'页存储了'.$this->_currentMagnetCount.'个磁力链接,耗时'.$useTime."秒\r\n";
		if(!($this->flag && $this->maxPage>$this->page)){
			echo '总共存储了'.$this->_magnetCount.'个磁力链接'."\r\n";
		}
	}
    /**
     * 设置url
     */
	protected function _getUrl(){
	    
		$this->_url = $this->host.'search?q='.rawurlencode($this->keyWord).'&p='.$this->page;	
	}
	/**
	 * 获得html文件内容
	 */
	protected function _getHtmlPage(){
	    
		$ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT,$this->timeout);
        curl_setopt($ch, CURLOPT_URL, $this->_url);
        curl_setopt($ch, CURLOPT_SSLVERSION,3); 
        $result = curl_exec($ch);
        if($result === false){
            //echo 'Curl error: '. curl_errno($ch) .' : '. curl_error($ch);
            $opts = array(
                'https'=>array(
                    'method'=>"GET",
                    'timeout'=>$this->timeout,//单位秒
                )
            );
            $context = stream_context_create($opts);
            $this->_html =  @file_get_contents($this->_url,false,$context);
        }else{
            $this->_html = $result;
        }
        curl_close($ch);
	}
    /**
     * 抓取磁力链接
     */
	protected function _parseHtml(){
	    
		preg_match_all('/href="(magnet\:\?xt=urn\:btih\:.+?)"/',$this->_html,$magnet);
		preg_match_all('/attr_val">(\d+?\.?\d*? [G|M|K]B)/',$this->_html,$size);
		if(empty($size[1])){
			$this->flag=false;//当获取磁力链接时不到时,停止翻页
		}
		foreach($size[1] as $key=>$val){
			if($this->_compareSize($val)){
				$this->_magnet[]=$magnet[1][$key];
			}		
		}
		$this->_currentMagnetCount = count($this->_magnet);
		$this->_magnetCount += count($this->_magnet);
	}
    /**
     * 比较磁力链接文件的大小
     */
	protected function _compareSize($size){
	    
		$number = substr($size,0,strpos($size,' '));
		$unit = substr($size,strpos($size,' ')+6);

		$n='';
		switch($unit){
			case 'GB':
					$n=1;
					break;
			case 'MB':
					$n=1024;
					break;
			case 'KB':
					$n=1048576;
					break;
			default :
					$n=false;
		}
		if($n===false){
		    try {
		        throw new Exception("文件大小单位识别失败\n");
		    } catch (Exception $e) {
		        echo $e->getMessage();
		        return false;
		    }
			
		}
		return ( $this->minSize < ($number/$n) );
	}
    /**
     * 把磁力链接保存到文件中
     */
	protected function _save(){
	    
	    $data = '';
		foreach($this->_magnet as $val){
		    $data .= $val."\n";
		    $this->magnetNum++;
		    if(0==$this->magnetNum%15)
		      $data.="\n\n";
		}
		file_put_contents($this->saveFile,$data,FILE_APPEND);
		$this->_magnet=array();
	}
	
}
//示例
$s = new Magnet('LOL','magnet.log',2,array(0,10));
$s->run();