Я не могу воспроизвести проблему, когда я запускаю предоставленный вами код, он выполняет следующий запрос 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--
это определенно запрос POST в формате multipart/form-data
. (даже если заголовок Content-Type
неверно утверждает, что он находится в формате application/x-www-form-urlencoded
, что делает серверы неспособными правильно его проанализировать ... но, тем не менее, это все-таки запрос POST, он просто сильно искажен.)
однако обратите внимание, что код определенно не будет проверять какой-либо код IMEI, потому что перед проверкой кода необходимо получить cookie и токен CSRF, токен не будет работать без cookie, и cookie не будет работать без токена, но токен меняется для каждого куки, и вы не можете жестко его закодировать, но это именно то, что пытается сделать ваш код,
ваш код не будет работать, потому что:
- никогда не создает сеанс cookie (требуется для проверки IMEI)
- он пытается жестко закодировать токен CSRF вместо выборки динамического токена. (токен CSRF привязан к сеансу cookie ... который ваш код никогда не создает.)
.. чтобы проверить IMEI здесь, сначала вы должны включить обработку cookie в curl, что можно сделать с помощью CURLOPT_COOKIEFILE, также UTF-8
не является допустимой кодировкой передачи и не имеет смысла, вместо этого выполните:
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 cookie, необходимый для проверки IMEI, и даст curl токен CSRF, необходимый для проверки imei,
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) и токен CSRF в HTML, вам нужно извлечь токен из 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.