龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 磁力链接打包下载

时间:2017-10-23 11:33来源:网络整理 作者:网络 点击:
分享到:
磁力链接打包下载 [代码片段(177行)]
<?php
/**
 * 磁力链接下载,根据 关键词 文件大小 保存到指定文件中
 */
class Magnet{

    public $host='https://btdigg.org/';//域名
    public $keyWord='';//关键词
    public $minSize=0;//文件大小最小值
    public $saveFile='';//存储文件

    public $flag=true;//是否继续翻页
    public $page=0;//当前页面
    protected $_url='';//当前的url
    protected $_html='';//当前的url的html文件内容
    protected $_magnet=array();//保存磁力链接的数组
    protected $_currentMagnetCount=0;//当前磁力链接的数量
    protected $_magnetCount=0;//磁力链接的总数
    public $timeout=10;//页面超时设置
    public $maxPage=1000;
    public $magnetNum=0;
    public $timestamp=0;

    public function __construct($keyWord,$saveFile='./magnet.log',$minSize=0,$pageRange=array(0,1000)){
        $this->keyWord=$keyWord;
        $this->saveFile=$saveFile;
        $this->minSize=$minSize;
        $this->page=$pageRange[0];
        $this->maxPage=$pageRange[1];
    }

    public function run(){

        while($this->flag &amp;&amp; $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 &amp;&amp; $this->maxPage>$this->page)){
            echo '总共存储了'.$this->_magnetCount.'个磁力链接'."\r\n";
        }
    }
    /**
     * 设置url
     */
    protected function _getUrl(){

        $this->_url = $this->host.'search?q='.rawurlencode($this->keyWord).'&amp;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*?&amp;nbsp;[G|M|K]B)<\/span>/',$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,'&amp;nbsp;'));
        $unit = substr($size,strpos($size,'&amp;nbsp;')+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();

精彩图集

赞助商链接