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); }