1. 程式人生 > >PHP CURL模擬登陸並提交資料,及PHP CURL檔案上傳/圖片下載等(僅作除錯,未完善)

PHP CURL模擬登陸並提交資料,及PHP CURL檔案上傳/圖片下載等(僅作除錯,未完善)

<?php error_reporting(255);
	  set_time_limit(120);
/**
 * 傳送報頭資訊
 *
 * @return   void(0) || string;
 */
if(!function_exists('httpHeader')){

	function httpHeader(){
	  	if(!headers_sent($file,$line)){
	  		header("Content-Type:text/html;charset=utf-8");
	  		header("Cache-Control: public");//強制瀏覽器快取
	  		header("Pragma: cache");
	  		return	;
	  	}else{
	  		return	"Headers sent in <b>{$file}</b> on line <u>{$line}</u>";
	  	}
	}

}
/**
 * 隨機IP
 *
 * @return string;
 */
function randIp(){

    $ip2id= round(rand(600000, 2550000) / 10000); //第一種方法,直接生成
    $ip3id= round(rand(600000, 2550000) / 10000);
    $ip4id= round(rand(600000, 2550000) / 10000);
    //下面是第二種方法,在以下資料中隨機抽取
    $arr_1 = array("218","218","66","66","218","218","60","60","202","204","66","66","66","59","61","60","222","221","66","59","60","60","66","218","218","62","63","64","66","66","122","211");
    $randarr= mt_rand(0,count($arr_1)-1);
    $ip1id = $arr_1[$randarr];
    return $ip1id.".".$ip2id.".".$ip3id.".".$ip4id;

}
/**
 * 模擬移動端頭資訊
 *
 * @return string;
 */
function randIphone(){

    $arr=array('LBEParents/1.2.1 (iPhone; iOS 10.3.1; Scale/2.00)',
                 'MicroMessenger/6.5.7.1041 NetType/WIFI Language/zh_CN',
                 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 MicroMessenger/6.5.4 NetType/WIFI Language/zh_CN',
                 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/6.5.7 NetType/WIFI Language/en'
     );
    $rand_num=rand(0,count($arr)-1);
    return $arr[$rand_num]; 

}

function isMobile(){
    //weixin
    if(isWeixin()) return true;
    // 如果有HTTP_X_WAP_PROFILE則一定是移動裝置
    if(isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
        return true;
    } 
    // 如果via資訊含有wap則一定是移動裝置,部分服務商會遮蔽該資訊
    if(isset ($_SERVER['HTTP_VIA'])){ 
        // 找不到為flase,否則為true
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    } 
    // 腦殘法,判斷手機發送的客戶端標誌,相容性有待提高
    if(isset ($_SERVER['HTTP_USER_AGENT'])){
        $clientkeywords = array(
            'nokia',
            'sony',
            'ericsson',
            'mot',
            'samsung',
            'htc',
            'sgh',
            'lg',
            'sharp',
            'sie-',
            'philips',
            'panasonic',
            'alcatel',
            'lenovo',
            'iphone',
            'ipod',
            'blackberry',
            'meizu',
            'android',
            'netfront',
            'symbian',
            'ucweb',
            'windowsce',
            'palm',
            'operamini',
            'operamobi',
            'openwave',
            'nexusone',
            'cldc',
            'midp',
            'wap',
            'mobile',
            'windows phone'
            ); 
        // 從HTTP_USER_AGENT中查詢手機瀏覽器的關鍵字
        if(preg_match("/(".implode('|', $clientkeywords).")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){
            return true;
        } 
    } 
    // 協議法,因為有可能不準確,放到最後判斷
    if(isset ($_SERVER['HTTP_ACCEPT'])){ 
        // 如果只支援wml並且不支援html那一定是移動裝置
        // 如果支援wml和html但是wml在html之前則是移動裝置
        if((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))){
            return true;
        } 
    } 

    return false;

} 

function isWeixin(){ 

    if (isset ($_SERVER['HTTP_USER_AGENT'])&&strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'micromessenger') !== false ) {
        return true;
    }

    return false;

}
/**
 * 含報頭輸出字串
 *
 * @param   string $str;
 * @return  string;
 */
if(!function_exists('e')){

	function e($str){
		httpHeader();
		echo '伺服器返回資訊:'.$str;
	}

}

class curl{
	
	private $login_url   = "http://xx.com/apple3/member/login?_debug=1"; //要測試的api地址
	private $doOrder_url = "http://xx.com/apple3/order/doOrder?_debug=1";
	private $addCart_url = "http://xx.com/apple3/member/addCart?_debug=1";
	private $username    = "username"; //使用者登陸所需的測試賬戶密碼
	private $password    = "password";
	private $cache_dir   = "/home/www/pic/logs/";
        private $up_dir      = "/home/www/pic/upload/";
	private $cookie_file;

	public function __construct(){
		
		if(strstr(PHP_OS,'WIN'));
			$this->cache_dir = dirname(dirname(dirname(__FILE__)))."/cache/"; 
		if(!is_writable($this->cache_dir)) 
			exit(e("日誌跟蹤檔案目錄({$this->cache_dir})沒有可寫許可權/該目錄下需要可寫許可權!"));

		$this->cookie_file = $this->cache_dir."pic.cookie";
		
	}

	/**
	 * 模擬登陸用
	 * 
	 * @return string;
	 */
	public function curlLogin(){

		$curl = curl_init();
		$cookie_jar = $this->cookie_file;//cookie檔案地址必須可寫
		curl_setopt($curl, CURLOPT_URL,$this->login_url);//這裡寫上處理登入的介面
		curl_setopt($curl, CURLOPT_POST, 1);
		$request = "username={$this->username}&password={$this->password}";
		curl_setopt($curl, CURLOPT_POSTFIELDS, $request);//傳 遞資料
		curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_jar);// 把返回來的cookie資訊儲存在$cookie_jar檔案中
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//設定返回 的資料是否自動顯示
		curl_setopt($curl, CURLOPT_HEADER, false);//設定是否顯示頭信 息
		curl_setopt($curl, CURLOPT_NOBODY, false);//設定是否輸出頁面 內容
		$data = curl_exec($curl);//返回結果
		curl_close($curl); //關閉
		return $data;

	}

	/**
	 * 模擬登陸後提交資料用(摘取天上星 test資料)
         *
	 * @param  string  $post k1=v1&k2=v2;
	 * @return string;
	 */
	public function curlPost($post,$is_cart=false){

		$ch = curl_init();

		if($is_cart){
			$url = $this->addCart_url;
		}else{
			$url = $this->doOrder_url;
		}

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
		curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
		curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
		$request=curl_exec($ch);
		curl_close($ch);
		return $request;

	}

	/**
	 * 傳送CURL檔案上傳
         *
	 * @return string
	 */
	public function up($file_path,$up_url){

		//httpHeader();//除錯列印用
                //$cookie_file = $this->cookie_file; //非登陸驗證頁面無需此項根據情況開啟即可
		$ch = curl_init();
		//$data = array('img'=>'@F:/hof2/QQ20160513141328.jpg'); //加@符號curl就會把它當成是檔案上傳處理
                $data = array("img"=>"@".$file_path); //加@符號curl就會把它當成是檔案上傳處理
		curl_setopt($ch,CURLOPT_URL,$up_url); //設定要上傳的URL目的地址
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($ch,CURLOPT_POST,true);
		curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
		curl_setopt($ch,CURLOPT_POSTFIELDS,$data); //傳輸資料
                curl_setopt($ch,CURLOPT_HEADER, false);//不輸出HEADER頭資訊
                //curl_setopt($ch,CURLOPT_COOKIEFILE, $cookie_file); //登陸後儲存的cookie檔案地址 //非驗證頁面無需此項根據情況開啟即可
		$result = curl_exec($ch);
		//print_r($result); //除錯用

		if(curl_errno($ch)){
                  $err = curl_error($ch);
        	  //var_dump($err); //除錯用
                }

                $r = curl_getinfo($ch);
                //var_dump($r); //除錯用
		curl_close($ch);
		return json_decode($result);

	}

	/**
	 * 接收CURL上傳請求(接收自up動作上傳過來的檔案)僅測試用
	 * @return void(0)
	 *
	public function handleUpload(){

		if(isset($_FILES) && !empty($_FILES['img']['name'])){
			 $filename = time().$_FILES['img']['name'];
			 $tmpname = $_FILES['img']['tmp_name'];
			 if(move_uploaded_file($tmpname,$this->up_dir.$filename)){
			  	echo json_encode('上傳成功');
			 }else{
				$data = json_encode($_FILES);
				echo $data;
			 }
		}else{
			echo json_encode('上傳失敗');
		}

	}
        */
        /**
         * CURL抓取遠端圖片並轉64編碼(用於圖片採集下載)
         * @param string $url
         * @return array
         */
        public function curlDown($url,$type=0){
    
        $msg = ['code'=>2100,'status'=>'error','msg'=>'未知錯誤!'];
        $imgs= ['image/jpeg'=>'jpeg',
               'image/jpg'=>'jpg',
               'image/gif'=>'gif',
               'image/png'=>'png',
               'text/html'=>'html',
               'text/plain'=>'txt',
               'image/pjpeg'=>'jpg',
               'image/x-png'=>'png',
               'image/x-icon'=>'ico'
         ];
        if(!stristr($url,'http')){
        $msg['code']= 2101;
        $msg['msg'] = 'url地址不正確!';  
        return $msg;
        }   
        $dir= pathinfo($url);
        $host = $dir['dirname'];
        $refer= $host.'/';
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_REFERER, $refer); //偽造來源地址
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
          curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:'.randIp(), 'CLIENT-IP:'.randIp()));//模擬隨機IP
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); //解決重定向問題 
        $data = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);
        $httpCode = intval($info['http_code']);
        $httpContentType = $info['content_type'];
        $httpSizeDownload= intval($info['size_download']);
    
        if($httpCode!='200'){
        $msg['code']= 2102;
        $msg['msg'] = 'url返回內容不正確!';
        return $msg;
        }
        if($type>0 && !isset($imgs[$httpContentType])){
        $msg['code']= 2103;
        $msg['msg'] = 'url資源型別未知!';
        return $msg;
        }
        if($httpSizeDownload<1){
        $msg['code']= 2104;
        $msg['msg'] = '內容大小不正確!';
        return $msg;
        }
        $msg['code']  = 200;
        $msg['status']='success';
        $msg['msg']   = '資源獲取成功';
        if($type==0 or $httpContentType=='text/html') $msg['data'] = $data;
        $base_64 = base64_encode($data);
        if($type==1) $msg['data'] = $base_64;
        elseif($type==2) $msg['data'] = "data:{$httpContentType};base64,{$base_64}";
        elseif($type==3) $msg['data'] = "<img src='data:{$httpContentType};base64,{$base_64}' />";
        else $msg['msg'] = '未知返回需求!';   
        unset($info,$data,$base_64);
        return $msg;

      }
      /**
       * 模擬移動端請求
       *
       * @param  string $url;
       * @return string;
       */
      function curlMobile($url){

            $dir= pathinfo($url);
        $host = $dir['dirname'];
        $refer= $host.'/';
        $ch2 = curl_init();
        //$user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";//模擬windows使用者正常訪問
        //模擬手機使用者
        $user_agent = randIphone();
        curl_setopt($ch2, CURLOPT_URL, $url);
        curl_setopt($ch2, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch2, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:'.randIp(), 'CLIENT-IP:'.randIp()));//追蹤返回302狀態碼,繼續抓取
        curl_setopt($ch2, CURLOPT_HEADER, 0); 
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); 
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch2, CURLOPT_NOBODY, false);
        curl_setopt($ch2, CURLOPT_REFERER,$refer);//模擬來路
        curl_setopt($ch2, CURLOPT_USERAGENT, $user_agent);
        curl_setopt($ch2, CURLOPT_POST, 1); //設定為POST方式  
        curl_setopt($ch2, CURLOPT_POSTFIELDS, array('class_id'=>769)); //資料傳輸  
        curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, 1 ); //解決重定向問題  
        $temp = curl_exec($ch2);
        curl_close($ch2);
        return $temp;

      }
      /********其餘程式碼省略...僅供參考********/
}