PHP CURL войти на сайт JSP и вернуть HTML - PullRequest
0 голосов
/ 06 марта 2012

Я пытаюсь использовать cURL для входа на сайт jsp / tomcat (мы будем называть это https://unknown.com по соображениям конфиденциальности) и вернуть HTML-код со страницы.Я наблюдал за панелью Net в Firebug и панелью cookie с Firecookie, чтобы описать в руководстве следующие шаги:

  1. Открыть веб-корень - https://unknown.com
  2. Перенаправлено на https://unknown.com/common/frames.jsp -Cookie Создано: JSESSIONID
  3. Заполните j_username и j_password
  4. Опубликовать "j_username = user & j_password = pass & submit = logon" на https://unknown.com/common/j_security_check
  5. Перенаправить на https://unknown.com/common/frames.jsp
  6. Пользователь выбирает ссылку с домашней страницы, где находится HTML-код для возврата.

Так что в основном у меня нет большого опыта работы с cURL, и мне не везетМне действительно нужно начать с понимания шагов, которые cURL потребует для входа на сайт и перехода на страницу назначения.

РЕДАКТИРОВАТЬ: Вот мой код:

//user login information
$username = "user";
$password = "pass";

$postData = "j_username=".$username."&j_password=".$password."&logon=submit";

$cookie_file = "/tmp/curl_cookies.txt";

//$fp = fopen($cookie_file, "w");
//fclose($fp);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/common/j_security_check');
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_REFERER, "https://unknown.com/common/Frames.jsp");
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$data = curl_exec($ch);
curl_close($ch);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://unknown.com/claritymatch/ClarityBatchViewer.jsp?id=123');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$data = curl_exec($ch);

curl_close($ch);
echo $data;

Он не работает, когда я впервые запускаю файл .php, но во второй раз он вызывает целевой HTML-код - как я могу получить его, чтобы он просто вызывался в первый раз?Кроме того, поскольку я сохраняю файл cookie JSESSIONID в указанном выше файле, не возникнут ли у меня проблемы с тем, что идентификатор сеанса не изменяется или он изменится при необходимости?

1 Ответ

2 голосов
/ 06 марта 2012

Вот несколько советов для вашей ситуации ...

  • Повторно используйте ту же ручку скручивания для простоты
    Это уменьшает необходимость дублированияварианты для каждого запроса.Установите большинство ваших вариантов в начале и сделайте это только один раз.Я имею в виду в основном параметры cookie, пользовательский агент, отслеживание местоположения и т. Д.
    Затем можно задать URL-адрес и метод запроса для каждого отдельного запроса.
    Вы даже можете повысить производительность, добавив Keep-Aliveзаголовок вашего запроса, поэтому, если удаленный сервер его поддерживает, одно и то же соединение будет использоваться для выполнения нескольких запросов без повторного подключения.

  • Установите CURLOPT_FOLLOWLOCATION в true и начните с начала
    Постарайтесь точно следовать тому, что вы видите в браузере.То есть запросить веб-корень;если сайт перенаправляет вас на URL проверки безопасности, cURL будет следовать этому перенаправлению и захватывать любые файлы cookie, установленные в процессе.Один запрос cURL может привести к нескольким HTTP-запросам, если отправлено перенаправление.Затем перейдите к «заполнению» формы авторизации.

  • Используйте http_build_query () для своих данных поста
    Нет ничего плохого в том, как вы настроили строку поста, ноданные должны быть в кодировке URL.Использование http_build_query() с массивом легче для манипулирования и приведет к строке в кодировке URL, которую вы можете передать непосредственно в cURL.

См. Также этот ответ Iопубликовал пару дней назад для человека, пытающегося сделать что-то подобное.Я также опубликовал несколько ссылок на некоторые другие ответы, которые содержат полные примеры запроса нескольких URL-адресов с использованием cURL;простой взгляд на эти ответы должен помочь вам понять, как делать то, что вы хотите.Особенно см. этот ответ , который был первой ссылкой в ​​посте, о котором я упомянул, поскольку он показывает, как войти в Google, выполнив несколько почтовых запросов и, наконец, запрос на получение.

...