• 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);
        }
  • 相关阅读:
    workerPool _ golang
    jsp:JDBCmysql数据库连接
    jsp:session的跟踪方式
    js:使用nodejs为页面传递mysql中的数据
    js:网页中的高和宽(document)
    js:nodejs简单的Http服务器搭建
    js:面向对象编程
    js:nextSibling兄弟节点的使用
    java:mysql基础语法
    jsp:常用标签的核心标签的使用
  • 原文地址:https://www.cnblogs.com/fps2tao/p/14267811.html
Copyright © 2020-2023  润新知