Мне нужен http пост для этого сайта - PullRequest
0 голосов
/ 23 июня 2019

У меня в течение многих дней я не мог сделать http пост-запрос для следующего сайта

http://www.imei.sy/imei

Я не знаю принципа этого. Я попытался сделать запрос, используя GuzzleHttp и curl.

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

1 Ответ

0 голосов
/ 24 июня 2019

Я не могу воспроизвести проблему, когда я запускаю предоставленный вами код, он выполняет следующий запрос 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.

...