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; } /********其余代码省略...仅供参考********/ }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。