Прочитайте страницу сервлета JSP, используя PHP (libcurl), Python (liburl) или AJAX - PullRequest
0 голосов
/ 16 марта 2011

Итак, я пытаюсь свернуть страницу: http://rutgers.bncollege.com/webapp/wcs/stores/servlet/TextBookProcessDropdownsCmd?campusId=35577418, чтобы извлечь некоторые данные. Проблема в том, что я получаю либо ошибку 404, либо статус 302 в заголовке. Я подозреваю, что это как-то связано с тем, что Барнс и Tomcat Нобла неправильно перенаправляют на сервлет при удаленном запросе. Это просто предположение, хотя. Я попробовал несколько реализаций, используя как libcurl в PHP5, liburl в Python, AJAX (фреймворк и не-фреймворк), так и используя бинарный файл curl из моего терминала.

Вот пример вывода, который я получаю, когда я повторяю текст ответа:

Произошла ошибка:

Код ошибки: 404

Цель сообщения: /BNCB_GenericError.jsp

Имя сервлета: Процессор JSP 1.2

Трассировка стека: [Ljava.lang.StackTraceElement; @ 14b6c4d

Основная причина: N / A

Вот заголовки, которые я отправляю и получаю:

Заголовки ответа

Истекает четверг, 01 декабря 1994 года, 16:00:00 по Гринвичу

Cache-Control no-cache = "set-cookie, set-cookie2"

Местоположение http://uncc.bncollege.com/webapp/wcs/stores/servlet/TBDropDownView?campusId=1748054&dojo.transport=xmlhttp&dojo.preventCache=1300287790307&ddkey=TextBookProcessDropdownsCmd

Длина содержимого 0

Продолжительность PerfHeader = D = 56606,

время = т = 1300287776952692

Тип содержимого text / html;

* * Тысяча сорок-одина кодировка = ISO-8859-1 * * тысяча сорок-две

Content-Language en-US Дата Ср, 16

Март 2011 15:02:57 GMT

Поддержание соединения

Разное Accept-Encoding

Set-Cookie WC_SESSION_ESTABLISHED = true; домен = .bncollege.com; путь = /

WC_ACTIVESTOREDATA =% 2D1% 2c0; домен = .bncollege.com; Путь = / WC_USERSESSION_46349649 = 46349649% 2cnull% 2cnull% 2c% 2d2000% 2cnull% 2cnull% 2cnull% 2cnull% 2cnull% 2cnull% 2cnull% 2cnull% 2c% 5B0% 7cnull% 7cnull% 7cnull% 7c% 2d2000% 5d% 2c8XwO3l7WhszbuSO41vmZUDtbpoQ% 3d; домен = .bncollege.com; Путь = /

JSESSIONID = 0000AuZi2Uo6F6Ft5xihFdUsBQn: app06z02; домен = .bncollege.com; Path = /

TS884e96 = b7fb55c6fcd8aff3987bcdb831a8255a16b4cbcb208252614d80d120;

Заголовки запроса

Host uncc.bncollege.com

User-Agent Mozilla / 5.0 (Macintosh; U;

Intel Mac OS X 10.6; EN-US;

rv: 1.9.2.15pre) Gecko / 20110227

Firefox / 3.6.15pre (Сообщество Mac

Build, ElFurbe)

Принять текст / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8

Accept-Language en-us, en; q = 0,5

Accept-Encoding gzip, deflate

Accept-Charset ISO-8859-1, utf-8; q = 0,7, *; q = 0,7

Keep-Alive 115 Поддержание соединения

рефери http://localhost/bn.php

Происхождение http://localhost

И вот код для этого:

function bufferURL($url,$bindArgs) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://rutgers.bncollege.com/webapp/wcs/stores/servlet/TBWizardView?catalogId=10001&storeId=58552&langId=-1');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    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_exec($ch);

    $url .= '?';
    foreach ($bindArgs as $a => $b) $url .= $a . '=' . $b . '&';
    $url = substr($url,0,strlen($url)-1);

    curl_setopt($ch, CURLOPT_HTTPGET, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    echo curl_exec($ch);
}

BN, похоже, использует Dojo для выполнения своих запросов AJAX к сервлету; однако даже при использовании того же формата запроса я не могу выполнить репликацию.

1 Ответ

0 голосов
/ 16 марта 2011

Это выглядит немного подозрительно. Самый первый выбранный вами вариант - это URL. Затем вы установите его для данных POST. Затем в конце блока параметров вы добавляете к нему знак вопроса, вручную добавляете еще больше строк запроса, затем убираете лишний амперсанд ... и затем повторно сбрасываете URL после , изменяя его на ПОЛУЧИТЬ запрос! Это не имеет смысла.

Добавление знака вопроса, безусловно, является как минимум одной из причин, которые его нарушают - в URL уже есть один, что означает, что он также уже имеет строку запроса. Кроме того, вы, похоже, неправильно корректируете URL-адрес каких-либо дополнительных параметров, поэтому они также могут вызывать проблемы.

Взгляните на parse_url и parse_str, два инструмента, которые можно использовать для дизассемблирования исходного URL-адреса и получения исходной строки запроса. После того, как вы разбили его на компоненты и извлекли исходную строку запроса в массив, вы можете добавить новые параметры запроса в этот массив / заменить существующие записи / удалить ненужные. Затем вы можете использовать http_build_query, чтобы перестроить строку запроса, а затем собрать правильный URL.

Однако, это будет действительно хорошо работать, только если цель принимает эти данные как GET, а не как POST.

Если для цели требуется POST, вы, вероятно, можете оставить строку запроса в покое и просто отправить строки запроса в виде массива, используя параметр CURLOPT_POSTFIELDS. Он сделает всю тяжелую работу за вас.

Имейте в виду, похоже, вы пытаетесь использовать чью-то конечную точку ajax для неожиданных целей. Возможно, существуют дополнительные средства защиты, которые они установили для предотвращения автоматических запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...