2010-04-27 3 views
1

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

#!/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) 
+0

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

ответ

1

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

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

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

В вашем сценарии, вы также можете посмотреть, что происходит при включении отладки в LWP, который Мех построен на:

use LWP::Debug qw(+); 

rjh already answered сертификат части вашего вопроса.

+0

Он уже использует LWP :: Debug :) – rjh

+0

А, пропустил это. Затем мы должны увидеть результат. –

+0

Итак, что вы нашли, проблема, и какая часть этого ответа помогла вам найти его? :) –

-1

настройки куков, что-то похожее на это:

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

Этот файл cookie_jar => {} устанавливает cookie в память, не должно ли это работать? –

+0

Сессия cookie не будет записываться на диск, так что это ничего не значит. – rjh

0

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

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_jar->save; 

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

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

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


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

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

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

+0

Могу ли я сделать это следующим образом: $ agent-> cookie_jar-> revert; –

+0

Я думаю, что это работает, все еще проверяя !!! –

+0

'$ agent-> cookie_jar-> revert' будет работать, да. – rjh