Почему приведенный ниже PHP cURL-код не публикует никаких данных?

#php #curl #web-scraping

#php #curl #очистка веб-страниц

Вопрос:

Кто-нибудь, пожалуйста, может сказать, что я делаю не так в приведенном ниже коде?

Я работаю над php-скриптом для входа в систему и извлечения данных изhttps://beams.us.yazaki.com/BEAMSLogin/Login.aspx?ReturnUrl=/Beams/Default.aspx

Я пробовал использовать приведенный ниже curl-код.

 <?php
define('USERNAME', 'XXX');
define('PASSWORD', 'XXX');
define('DOMAIN', 'XXX');
define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
define('COOKIE_FILE', 'cookie.txt');
define('LOGIN_FORM_URL', 'https://beams.us.yazaki.com/BEAMSLogin/Login.aspx?ReturnUrl=/Beams/Default.aspx');
define('LOGIN_ACTION_URL', 'https://beams.us.yazaki.com/BEAMSLogin/Login.aspx?ReturnUrl=/Beams/Default.aspx');
$postValues = array(
    'txtUserName' => USERNAME,
    'txtPassword' => PASSWORD,
    'lstDomain'   => DOMAIN
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postValues));
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, LOGIN_FORM_URL);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_exec($curl);
if(curl_errno($curl)){
    throw new Exception(curl_error($curl));
}
curl_setopt($curl, CURLOPT_URL, 'https://beams.us.yazaki.com/BEAMS/SearchAndResults.aspx?topic=component');
curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
echo curl_exec($curl);
?>
  

Я получаю вывод, подобный приведенной ниже странице.

 Object not found!

The requested URL was not found on this server. The link on the referring page seems to be wrong or outdated. Please inform the author of that page about the error. 

If you think this is a server error, please contact the webmaster. 

Error 404

localhost
Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.8 *
  

И браузер перенаправляется на http://localhost/BeamsLogin/AuthenticationSelect.aspx?ReturnUrl=/BEAMS/SearchAndResults.aspx?topic=componentamp;topic=component

Я искренне жду ответа.

Спасибо.

РЕДАКТИРОВАТЬ 1 @Shibon Я думаю, что этот веб-сайт не использует какой-либо токен csrf. Я предоставляю HTTP-заголовок live content. Пожалуйста, проверьте один раз.

 https://beams.us.yazaki.com/BEAMSLogin/Login.aspx?ReturnURL=/Beams/Default.aspx
Host: beams.us.yazaki.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://beams.us.yazaki.com/
Connection: keep-alive
Upgrade-Insecure-Requests: 1

GET: HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 15 Sep 2020 06:19:19 GMT
Content-Length: 3376
  

Комментарии:

1. Я думаю, что это что-то связанное с файлами cookie. Попробуйте сначала получить веб-сайт, а затем попытаться войти в систему, а также вы должны просмотреть __VIEWSTATE в форме.

2. Я попытался выполнить выборку с помощью $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); и получил Array() в качестве выходных данных. Я думаю, вы правы. Не могли бы вы подсказать, как это решить, поскольку я немного новичок в этом.

3. Спасибо @nguaman, я должен был отправить __VIEWSTATE, __EVENTVALIDATION, __VIEWSTATEGENERATOR вместе с именем пользователя и паролем.

Ответ №1:

Попробуйте приведенный ниже код

 $ch= curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_COOKIEJAR, "-"); //to set session and cookie for the current $ch object
curl_setopt($ch, CURLOPT_URL, LOGIN_ACTION_URL);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postValues));
$resp = curl_exec($ch);
if(!$resp) {
   print_r(curl_error($ch));
   exit;
}
curl_setopt($curl, CURLOPT_URL, 'https://beams.us.yazaki.com/BEAMS/SearchAndResults.aspx?topic=component');
curl_setopt($ch, CURLOPT_POST, true);
echo curl_exec($ch);
  

В этом изначально установлен cookie и используется во всех запросах

Комментарии:

1. Спасибо@Shibon, я попробовал это. Но та же ошибка. В принципе, я не знаю, почему браузер перенаправляется на ссылку . Эта ссылка нигде не упоминается на странице источника формы входа.

2. Не могли бы вы попробовать с обратным URL, подобным этому beams.us.yazaki.com/BEAMSLogin/Login.aspx

3. Нет; по-прежнему он перенаправляется на ту же страницу (Authentication.aspx). И в основном он ищет эту ссылку на моем сервере localhost. Ранее я пробовал использовать простой анализатор HTML dom, с помощью которого я могу отправлять данные формы, но не могу нажать кнопку входа, что теперь я знаю; бесполезно. Еще одна вещь; исходная страница этой формы имеет ссылку на действие, например (./Login.aspx). Итак, как я могу перенаправить это на тот же https-адрес, а не на мой localhost? Я думаю, что это проблема.

4. Итак, ваш первый curl успешен, но он перенаправляет, не так ли..

5. ДА. Я получаю видимую форму, но вместо того, чтобы направлять ссылку на поиск компонентов после входа в систему; я получаю направление на какую-то ссылку, которая нигде не упоминается в источнике, и я не знаю, отправил ли POST какие-либо данные, и мой вход в систему прошел успешно.