php CURL логин на сайте программно - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь написать функцию входа в систему, используя PHP CURL, чтобы выполнить вход на следующем сайте: https://partners.mrfavorit.com/. Когда я смотрю на сетевые запросы, кажется, что платформа включена. NET.

Сначала я делаю один запрос GET для сбора файлов cookie:

$ch = curl_init();
curl_setopt_array( $ch, array(
  CURLOPT_URL => 'https://partners.mrfavorit.com/',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_HEADER => true,
));
$a = curl_exec($ch);
preg_match_all('|Set-Cookie: (.*);|U', $a, $results);
$cookies2 = implode(';', $results[1]);

, затем отправляю POST с учетные данные для входа в тот же URL-адрес, но он не работает, запрос возвращает 200 со страницей входа html код.

curl_setopt_array($ch, array(
  CURLOPT_URL => "https://partners.mrfavorit.com/?&txtUserName=myusername&txtPassword=mypassword123",
  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_HEADER => true,
  CURLOPT_POSTFIELDS =>'',
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/json",
    "Cookie: ".$cookies2
  ),
));

$r2 = curl_exec($ch);
print_r($r2);

В чем может быть причина того, что это не удается?

Конечной целью этого является сбор данных из таблиц отчетов внутри системы.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Я заставил это работать. Хитрость заключалась в том, чтобы сделать начальный запрос GET на страницу входа и получить файлы cookie, а также поля "__VIEWSTATE", "__VIEWSTATEGENERATOR", "__EVENTVALIDATION" Dynami c. Затем отправьте POST на тот же URL-адрес с этими полями.

После этого мне пришлось сделать два запроса POST к /dailyreport.aspx, получая состояние представления и остальные переменные из первой и передавая их второй. Только тогда я смог получить возвращенную таблицу HTML.

2 голосов
/ 24 мая 2020

вы должны поместить свои POST данные внутри CURLOPT_POSTFIELDS =>'', а CURLOPT_URL должен указывать на URL-адрес входа. То, как вы это делаете, запрашивает сайт с помощью GET-запроса.

$post = ['txtUserName'=>'myUserName','txtPassword'=>'myPassword123'];    
curl_setopt_array($ch, array(
      CURLOPT_URL => "https://partners.mrfavorit.com/",
      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_HEADER => true,
      CURLOPT_POSTFIELDS =>http_build_query($post),
      CURLOPT_HTTPHEADER => array(
        "Content-Type: application/json",
        "Cookie: ".$cookies2
      ),
    ));

    $r2 = curl_exec($ch);
    print_r($r2);

см. Этот PHP + curl, пример кода HTTP POST?

[EDIT] добавление http_build_query() к $post сгенерирует application/x-www-form-urlencoded HTTP-запрос

см. комментарий к Отправка массива с curl_setopt

...