我有很多天无法为以下站点发出http发布请求
我不知道其背后的原理。我试图使用GuzzleHttp发出请求,然后卷曲。
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "http://www.imei.sy/imei",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "UTF-8",
CURLOPT_MAXREDIRS => 20,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => array("_token:evsLRDom2AShHsioY5OyEB7cDU45opx8J0VLgqd2",//TgghCi5gkU6HODTyDwAWq0mvEyHC3ys8dXGskta1",
"imei:000000000000000"),
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: application/x-www-form-urlencoded",
"postman-token: 6a987964-86b8-25db-71a5-7c47822ec59c"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
答案 0 :(得分:0)
我无法重现该问题,当我运行您提供的代码时,它将执行以下POST请求:
POST /imei HTTP/1.1
Host: www.imei.sy
Accept: */*
Accept-Encoding: UTF-8
cache-control: no-cache
postman-token: 6a987964-86b8-25db-71a5-7c47822ec59c
Content-Length: 295
Content-Type: application/x-www-form-urlencoded; boundary=------------------------4b99e3fabc390822
--------------------------4b99e3fabc390822
Content-Disposition: attachment; name="0"
_token:evsLRDom2AShHsioY5OyEB7cDU45opx8J0VLgqd2
--------------------------4b99e3fabc390822
Content-Disposition: attachment; name="1"
imei:000000000000000
--------------------------4b99e3fabc390822--
这绝对是multipart/form-data
格式的POST请求。 (甚至Content-Type
标头都错误地声称它为application/x-www-form-urlencoded
格式,这使得服务器无法正确解析它。.但是它仍然是一个POST请求,只是一个格式严重的错误。)
但是请注意,该代码绝对不会检查任何IMEI代码,因为在检查代码之前,您必须先获得一个cookie和一个CSRF令牌,否则如果没有cookie,该令牌将无法工作,并且该cookie将无法工作没有令牌,但是每个cookie的令牌都会更改,并且您不能对其进行硬编码,但这正是您的代码正在尝试做的事情,
您的代码无法使用,因为:
..要在此处检查IMEI,首先必须启用curl的cookie处理,这可以使用CURLOPT_COOKIEFILE完成,而且UTF-8
也不是有效的传输编码,也没有任何意义,而是: / p>
curl_setopt_array($ch,array(
// emptystring COOKIEFILE tells curl enable cookie-handling and save cookies in-ram
CURLOPT_COOKIEFILE=>'',
// emptystring encoding tells curl to automatically handle compression with all built-in compression algorithms (usually "gzip" and "deflate"), it makes compressible transfers faster
CURLOPT_ENCODING=>'',
CURLOPT_RETURNTRANSFER=>1,
));
接下来,您必须使用正常的GET请求来获取页面,这将为curl提供检查IMEI所需的cookie,并为curl提供检查imei所需的CSRF令牌,
curl_setopt_array($ch,array(
CURLOPT_URL=>'http://www.imei.sy/imei',
CURLOPT_HTTPGET=>1
));
$html=curl_exec($ch);
if(empty($html)){
try{
throw new \RuntimeException("curl_exec() failed! ".curl_errno($ch).": ".curl_error($ch) );
}finally{
curl_close($ch);
}
}
在获得cookie(由curl自动处理)和HTML中的CSRF令牌之后,您需要从HTML中提取令牌,这可以使用DOMDocument和DOMXPath完成,
$domd=@DOMDocument::loadHTML($html);
$xp=new DOMXPath($domd);
$token=$xp->query("//input[@name='_token']")->item(0)->getAttribute("value");
最后,既然您已经拥有会话cookie和CSRF令牌,则可以执行IMEI查找请求,
curl_setopt_array($ch,array(
CURLOPT_POST=>1,
CURLOPT_POSTFIELDS=>http_build_query(array(
'_token'=>$token,
'imei'=>'999999999999999'
))
));
$html=curl_exec($ch);
if(empty($html)){
try{
throw new \RuntimeException("curl_exec() failed! ".curl_errno($ch).": ".curl_error($ch) );
}finally{
curl_close($ch);
}
}
curl_close($ch);
要获取HTML的响应,可以再次使用DOMDocument,
$message=(@DOMDocument::loadHTML($html))->getElementById("sts")->textContent;
var_dump($message);
产生:
$ php wtf2.php
string(100) " مُعرف الجهاز المُدخل غير صالح، الرجاء التحقق من الرقم "
因为999999999999999不是有效的IMEI码。