入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PHP CURL模拟登陆并提交数据,及PHP CURL文件上传/图片下载等(仅作调试,未完善)

创建时间:2016-12-02 投稿人: 浏览次数:151
<?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。