PHP curl post接口问题

本人刚学php,对curl也才刚了解,遇到了一个post问题,我想通过代码获取到这个数据,我的这个php程序,跑这个图片里接口不出数据,这个图片里是post提交,我php里参数都设置了,但是还是不出数据,我估计是curl里面参数设置有问题,我想要图片里的灰色返回的数据,想通过php代码,调用到这个接口,返回数据
<?php
$header=array(
"Accept: application/json, text/javascript",
"Accept-Encoding:gzip, deflate, br",
"Accept-Language, zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Alt-Used, www.api4all.pror",
"Connection,keep-alive",
"Content-Length, 39",
"Content-Type,application/x-www-form-urlencoded; charset=UTF-8",
"Cookie,__cf_bm=m7eYyPnNP9rj2lJhsBkwaUzDA3VZIwJ3UIYxeQUYSyQ-1652907985-0-AcaR3g+6BDD3nszjWqDdkiAt4a4LZHEnPt7AJ4ib361fjYXTHY+M7cS/M/FcFgLcUmJVx2LDQy2fWAWa669lup3llDelzxlvwXFKrEGgLeI8dPysruSNMq109ecmpX703w==",
"Host:www.api4all.pro",
"Origin:https://www.api4all.pro",
"Referer:https://www.api4all.pro/mdfprv8/",
"Sec-Fetch-Dest:empty",
"Sec-Fetch-Mode:cors",
"Sec-Fetch-Site: same-origin",
"TE: trailers",
"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0",
"X-Requested-With:XMLHttpRequest"
);
$ch = curl_init();//初始化cURL
$post_data = array ("imei" => "352114951270837","selectedService" => "s5");
curl_setopt($ch, CURLOPT_URL, "https://www.api4all.pro/mdfprv8/chose.php");//抓取指定网页
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串并输出到屏幕上
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
 // post数据
  curl_setopt($ch, CURLOPT_POST, 1);//Post请求方式
  // post的变量
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data)//Post变量
$output = curl_exec($ch);//执行并获得HTML内容
print_r $output;//释放cURL句柄

curl_close($ch);

?>

img


获取到返回的数据,

遇到什么问题了呢

我尝试了一下,我在header里面就就添加了一个cookie就好了。

你这个应该是个header引起的,curl传递的header应该是这个格式

img

key:value,key:value,,,,这样的格式

然后我把你的cookie直接放到postman中请求后,可用直接拿到和你截图中一样的数据。
php代码如下

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://www.api4all.pro/mdfprv8/chose.php',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => 'imei=352114951270837&selectedService=s5',
  CURLOPT_HTTPHEADER => array(
    'Cookie: m7eYyPnNP9rj2lJhsBkwaUzDA3VZIwJ3UIYxeQUYSyQ-1652907985-0-AcaR3g+6BDD3nszjWqDdkiAt4a4LZHEnPt7AJ4ib361fjYXTHY+M7cS/M/FcFgLcUmJVx2LDQy2fWAWa669lup3llDelzxlvwXFKrEGgLeI8dPysruSNMq109ecmpX703w==',
    'Content-Type: application/x-www-form-urlencoded'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
<?php
$url = 'https://www.api4all.pro/mdfprv8/chose.php';


$data = [
    'imei' => '352114951270837',
    'selectedService' => 's5'
];

$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL => $url,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => 1
]);

$resp = curl_exec($curl);
if (curl_errno($curl)) {
    var_dump(curl_error($curl));
}
$data = json_decode($resp, true);
echo $data['responseData'];

请求 https 的链接关键在于取消证书验证,也就是下面这两个配置项

CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,

仔细看了一下代码,有以下问题:

1、采用https方式请求,要么关闭证书验证,信认所有证书;要么加上证书验证,具体处理方式如下:

关闭证书验证方法:

//关闭ssl认证(跳过证书检查),信认所有证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

开启证书验证方法:

//采用https方式调用,必须使用下面3行代码打开ssl安全校验。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
//libcurl_7.28.1之后的版本,CURLOPT_SSL_VERIFYHOST只有0/2两种取值。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//证书下载地址:http://curl.haxx.se/ca/cacert.pem 
//下载的证书放在本代码文件同一目录下即可
curl_setopt($ch, CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');

2、关于头信息的问题:

直接去掉以下头信息这一行也是可以正常执行

curl_setopt($ch, CURLOPT_HTTPHEADER,$header);

具体看了您的头信息参数,压缩编码设置有问题,

//以下这行压缩方式头信息启用会导致乱码,注释掉能正常返回
//"Accept-Encoding:gzip,deflate,br",
//或者把上一行替换成以下这一行压缩方式头信息,可以正常返回
//"Accept-Encoding:compress",

3、就是POST要传递的参数,需要是&符连接健值对,具体处理处理如下:

$paramterList = array ("imei" => "352114951270837","selectedService" => "s5");
$tmp = '';
foreach ($paramterList as $key=>$value){
	if($key == 'msg'){
		$tmp.= "$key=".rawurlencode($value)."&";
	}else{
		$tmp.= "$key=".($value)."&";
	}
}
$postData = substr($tmp,0,-1);	

也可以用 http_build_query()函数构造

4、最后就是一些标点符号问题了,仔细检测一下即可。也可能是复制的问题。

以下是我修改后的完整代码如下:

$header = array(
	"Accept:application/json,text/javascript",
	//以下这行压缩方式头信息启用会导致乱码,注释掉能正常返回
	//"Accept-Encoding:gzip,deflate,br",
	//或者把上一行替换成以下这一行压缩方式头信息,可以正常返回
	"Accept-Encoding:compress",
	"Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
	"Alt-Used:www.api4all.pror",
	"Connection:keep-alive",
	"Content-Length:39",
	"Content-Type:application/x-www-form-urlencoded;charset=UTF-8",
"Cookie,__cf_bm=m7eYyPnNP9rj2lJhsBkwaUzDA3VZIwJ3UIYxeQUYSyQ-1652907985-0-AcaR3g+6BDD3nszjWqDdkiAt4a4LZHEnPt7AJ4ib361fjYXTHY+M7cS/M/FcFgLcUmJVx2LDQy2fWAWa669lup3llDelzxlvwXFKrEGgLeI8dPysruSNMq109ecmpX703w==",
	"Host:www.api4all.pro",
	"Origin:https://www.api4all.pro",
	"Referer:https://www.api4all.pro/mdfprv8/",
	"Sec-Fetch-Dest:empty",
	"Sec-Fetch-Mode:cors",
	"Sec-Fetch-Site:same-origin",
	"TE:trailers",
	"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0",
	"X-Requested-With:XMLHttpRequest"
);
//初始化cURL
$ch = curl_init();
//$urlParse = parse_url("https://www.api4all.pro/mdfprv8/chose.php");
//if($urlParse['scheme'] == 'https'){
	//采用https方式调用,必须使用下面3行代码打开ssl安全校验。
	//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
	//libcurl_7.28.1之后的版本,CURLOPT_SSL_VERIFYHOST只有0/2两种取值。
	//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
	//证书下载地址:http://curl.haxx.se/ca/cacert.pem 
	//下载的证书放在本代码文件同一目录下即可
	//curl_setopt($ch, CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');
//}else{
	//关闭ssl认证(跳过证书检查),信认所有证书
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//}

$paramterList = array ("imei" => "352114951270837","selectedService" => "s5");
$tmp = '';
foreach ($paramterList as $key=>$value){
	if($key == 'msg'){
		$tmp.= "$key=".rawurlencode($value)."&";
	}else{
		$tmp.= "$key=".($value)."&";
	}
}
$postData = substr($tmp,0,-1);	
//抓取指定网页
curl_setopt($ch, CURLOPT_URL, "https://www.api4all.pro/mdfprv8/chose.php");
//要求结果为字符串并输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_HEADER, 0);
//Post请求方式
curl_setopt($ch, CURLOPT_POST, 1);
//Post变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
//执行并获得HTML内容
$result = curl_exec($ch);
$curlErrno = curl_errno($ch);  
$curlError = curl_error($ch);
//关闭cURL
curl_close($ch);
//检测请求是否出错
if($curlErrno >0){
	echo 'CURL Error:'.$curlError.'('.$curlErrno.')'; 
}
//输出结果
echo $result;

 

 

 

可以输出一下print_r(curl_error($ch)),看下有没有报错

短短几行代码就行

$url = "https://www.api4all.pro/mdfprv8/chose.php?imei=352114951270837&selectedService=s5";
$ch = curl_init();
$post_data="";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
 
$output = curl_exec($ch);
curl_close($ch);
 
//打印获得的数据
print_r($output);