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;

      }
      /********其余代码省略...仅供参考********/
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值