php模拟请求curl和fsockopen形式

1. curl模拟请求

//封装curl模拟请求
    public function curlRequest($url,$method="GET",$postData='',$header=[]){
        //初始化
        $ch=curl_init();
        //设置选项
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//文件流输出,不是直接输出
        curl_setopt($ch, CURLOPT_HEADER, 0);//启用时,头文件信息作为数据流输出
        //curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩

        //提交数据支持字符串和数组
        if(is_array($postData)){
            $postData=http_build_query($postData);
        }
        $strlen=strlen($postData);
        
        //curl已经模拟了头部信息,如不是特需要求,可以不需要的
        /*$header=array("Content-Type:application/x-www-form-urlencoded","Content-Length:".$strlen,"User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36","Referer:http://www.test.com/stream.php");*/
        $header_default=array("Content-Type:application/x-www-form-urlencoded","Content-Length:".$strlen,"User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36");
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header_default);//模拟头部信息
        //add header
        if(!empty($header)) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        //curl_setopt($ch, CURLOPT_REFERER, $referer);//模拟来路

        //add ssl support
        if(substr($url, 0, 5) == 'https') {
            //当请求https开头的时候,需要走php接口文件就需要走443端口,故false进行屏蔽。是否检测服务器的证书是否由正规浏览器认证过的授权CA颁发的
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    //SSL 报错时使用
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);    //SSL 报错时使用
        }

        //add post data support
        if(!empty($postData) && mb_strtoupper($method)=='POST') {
            //设置post请求
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        }

        //add 302 support
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

        //设置cookie
        $cookie_jar = dirname(__FILE__)."/pic.cookie";
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);// 存放Cookie信息的文件名称
        curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_jar); // 读取上面所储存的Cookie信息
        curl_setopt($ch,CURLOPT_COOKIE,'age=12');//单独设置cookie,如何不用上面的两个方法
        //3.执行
        $output=curl_exec($ch);
        //4.释放
        curl_close($ch);

        //var_dump($output);
        return $output;

    }

 使用:

        $url = "https://xxx.com?userLevl=1&lang=&page=1&pagesize=50";
        $data = "";//字符串或数组,get为空
        $method = 'GET';
        $header=array("Content-Type:application/x-www-form-urlencoded","X-Requested-With: XMLHttpRequest","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36","Referer:https://xxx.com/");
        $res = $this->curlRequest($url,$method,$data,$header);
        var_dump($res);

2. fsockopen模拟请求 (没有封装先记录着)

public function sockRequest(){
        $url = "https://www.xxx.cn/?userLevl=1&lang=&page=1&pagesize=50";

        $srv_ip = 'www.xxx.cn';//你的目标服务地址.
        $srv_port = 80;//端口
        $url = 'https://www.xxx.cn/'; //接收你post的URL具体地址
        $fp = '';
        $errno = 0;//错误处理
        $errstr = '';//错误处理
        $timeout = 10;//多久没有连上就中断
        $post_str = "userLevl=1&lang=&page=1&pagesize=50";//要提交的内容.
        //打开网络的 Socket 链接。
        $fp = fsockopen($srv_ip,$srv_port,$errno,$errstr,$timeout);
        if (!$fp){
            echo('fp fail');
        }
        $content_length = strlen($post_str);
        $post_header = "GET $url HTTP/1.1".PHP_EOL;
        $post_header .= "Content-Type: application/x-www-form-urlencoded".PHP_EOL;
        //$post_header .= "X-Requested-With: XMLHttpRequest".PHP_EOL;
        $post_header .= "User-Agent: MSIE".PHP_EOL;
        $post_header .= "Host: ".$srv_ip.PHP_EOL;
        $post_header .= "Content-Length: ".$content_length.PHP_EOL;
        $post_header .= "Connection: close".PHP_EOL.PHP_EOL;
        $post_header .= $post_str.PHP_EOL.PHP_EOL;
        fwrite($fp,$post_header);

        $content = '';//body内容
        $inheader = 1;
        while(!feof($fp)){//测试文件指针是否到了文件结束的位置
            $line = fgets($fp,1024);
            //去掉请求包的头信息
            if ($inheader && ($line == PHP_EOL)) {
                $inheader = 0;
            }
            if ($inheader == 0) {
                $content .= $line;
            }
        }

        var_dump($content);
        fclose($fp);
        unset ($line);
    }
原文地址:https://www.cnblogs.com/fps2tao/p/14267811.html