PHP CURL模擬登陸並提交資料,及PHP CURL檔案上傳/圖片下載等(僅作除錯,未完善)
阿新 • • 發佈:2019-02-07
<?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; } /********其餘程式碼省略...僅供參考********/ }