本人刚学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);
?>
遇到什么问题了呢
我尝试了一下,我在header里面就就添加了一个cookie就好了。
你这个应该是个header引起的,curl传递的header应该是这个格式
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);