Почему я получаю новый идентификатор сессии при каждом извлечении страницы в моем скрипте Perl WWW :: Mechanize? - PullRequest
1 голос
/ 27 апреля 2010

Таким образом, я очищаю сайт, к которому у меня есть доступ через HTTPS, я могу войти в систему и запустить процесс, но каждый раз, когда я нажимаю на новую страницу (URL), идентификатор сеанса cookie изменяется. Как сохранить зарегистрированный идентификатор сеанса cookie?

#!/usr/bin/perl -w
use strict;
use warnings;
use WWW::Mechanize;
use HTTP::Cookies;
use LWP::Debug qw(+);
use HTTP::Request;
use LWP::UserAgent;
use HTTP::Request::Common;

my $un = 'username';
my $pw = 'password';

my $url = 'https://subdomain.url.com/index.do';

my $agent = WWW::Mechanize->new(cookie_jar => {}, autocheck => 0);
$agent->{onerror}=\&WWW::Mechanize::_warn;
$agent->agent('Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100407 Ubuntu/9.10 (karmic) Firefox/3.6.3');
$agent->get($url);

$agent->form_name('form');
$agent->field(username => $un);
$agent->field(password => $pw);
$agent->click("Log In");

print "After Login Cookie: ";
print $agent->cookie_jar->as_string();
print "\n\n";

my $searchURL='https://subdomain.url.com/search.do';
$agent->get($searchURL);    

print "After Search Cookie: ";
print $agent->cookie_jar->as_string();
print "\n";

Выход:

After Login Cookie: Set-Cookie3: JSESSIONID=367C6D; path="/thepath"; domain=subdomina.url.com; path_spec; secure; discard; version=0

After Search Cookie: Set-Cookie3: JSESSIONID=855402; path="/thepath"; domain=subdomain.com.com; path_spec; secure; discard; version=0

Также я думаю, что сайт требует CERT (ну, в браузере это делает), это будет правильный способ добавить его?

$ENV{HTTPS_CERT_FILE} = 'SUBDOMAIN.URL.COM'; ## Insert this after the use HTTP::Request...

Также для CERT При использовании первой опции в этом списке, это правильно?

X.509 Certificate (PEM)
X.509 Certificate with chain (PEM)
X.509 Certificate (DER)
X.509 Certificate (PKCS#7)
X.509 Certificate with chain (PKCS#7)

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

Когда ваш пользовательский агент не делает то, что, по вашему мнению, он должен делать, сравните его запросы с запросами интерактивного браузера. Плагин Firefox удобен для такого рода вещей.

Возможно, вам не хватает части процесса, который ожидает сервер. Вы, вероятно, не входите в систему или не взаимодействуете правильно, и это может быть по разным причинам. Например, на странице может быть JavaScript, который WWW :: Mechanize не обрабатывает.

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

В вашем скрипте вы также можете наблюдать за происходящим, включив отладку в LWP , на которой построен мех:

 use LWP::Debug qw(+); 

rjh уже ответил сертификат часть вашего вопроса.

0 голосов
/ 27 апреля 2010

Если ваш файл cookie сеанса изменяется при каждой загрузке страницы, то, скорее всего, вы входите в систему неправильно. Но вы можете попытаться заставить JSESSIONID быть одинаковым для каждого запроса. Создайте свою собственную банку с печеньем и скажите WWW :: Mechanize, чтобы она использовалась:

my $cookie_jar = HTTP::Cookies->new(file => 'cookies', autosave => 1, ignore_discard => 1);
my $agent = WWW::Mechanize->new(cookie_jar => $cookie_jar, autocheck => 0);

ignore_discard => 1 означает, что даже файлы cookie сеанса сохраняются на диск (обычно они удаляются из соображений безопасности).

Затем, после входа в систему, позвоните:

$cookie_jar->save;

Затем, после каждого запроса:

$cookie_jar->revert;  # re-loads the save

Кроме того, вы можете использовать подкласс HTTP :: Cookies и переопределить метод set_cookie, чтобы отклонить переустановку cookie сеанса, если он уже существует.


Также я думаю, что сайт требует CERT (ну, в браузере это делает), это будет правильный способ добавить его?

Некоторые браузеры (например, Internet Explorer) запрашивают сертификат безопасности, даже если он не нужен. Если вы не получаете никаких ошибок, а содержимое ответа выглядит хорошо, вам, вероятно, не нужно его устанавливать.

Если у вас есть файл сертификата, проверьте POD для Crypt :: SSLeay . Ваш сертификат имеет кодировку PEM0, так что да, вы хотите установить $ENV{HTTPS_CERT_FILE} на путь вашего сертификата. Возможно, вы захотите установить $ENV{HTTPS_DEBUG} = 1, чтобы увидеть, что происходит.

0 голосов
/ 27 апреля 2010

Установите банку с печеньем, что-то похожее на это:

my $cookie = HTTP::Cookies->new(file => 'cookie',autosave => 1,);
my $mech = WWW::Mechanize->new(cookie_jar => $cookie, ....);
...