2010-04-27 1 views
1

Donc, je raccroche un site auquel j'ai accès via HTTPS, je peux me connecter et démarrer le processus, mais chaque fois que je clique sur une nouvelle page (URL), le cookie ID de session change. Comment conserver l'identifiant de session de cookie connecté?Pourquoi est-ce que je reçois un nouvel identifiant de session sur chaque page récupérée dans mon script 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"; 

La sortie:

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 

Je pense aussi que le site nécessite un CERT (bien dans le navigateur qu'il fait), serait-ce la bonne façon de l'ajouter?

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

Également pour le CERT En utilisant la première option de cette liste, est-ce correct?

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

Notez qu'il vous suffit de charger les modules que vous souhaitez utiliser explicitement. D'autres modules chargeront les choses dont ils ont besoin par eux-mêmes. –

Répondre

1

Lorsque votre user-agent ne fait pas quelque chose que vous pensez qu'il devrait faire, comparez ses requêtes avec celles d'un navigateur interactif. Un plugin Firefox est pratique pour ce genre de chose.

Vous manquez probablement une partie du processus attendue par le serveur. Vous ne vous connectez probablement pas ou n'interagissez pas correctement, et cela pourrait être pour toutes sortes de raisons. Par exemple, il peut y avoir JavaScript sur la page que WWW::Mechanize ne gère pas.

Lorsque vous pouvez identifier ce qu'un navigateur interactif est en train de faire, vous saurez où vous devez améliorer votre script.

Dans votre script, vous pouvez aussi regarder ce qui se passe en tournant le débogage dans LWP, qui Mech est construit sur:

use LWP::Debug qw(+); 

rjh already answered la partie certificat de votre question.

+0

Il utilise déjà LWP :: Debug :) – rjh

+0

Ah, raté ça. Nous devrions ensuite voir la sortie. –

+0

Alors, qu'avez-vous trouvé le problème et quelle partie de cette réponse vous a aidé à le trouver? :) –

-1

Configuration du cookie jar, quelque chose qui ressemble à ceci:

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

Ce cookie_jar => {} met le cookie en mémoire, cela ne devrait-il pas fonctionner? –

+0

Le cookie de session ne sera pas écrit sur le disque de toute façon, donc cela ne fait rien. – rjh

0

Si votre cookie de session change chaque chargement de page, alors probable que vous ne rentrez pas correctement. Mais vous pourriez essayer de forcer le JSESSIONID à être le même pour chaque requête. Construire votre propre pot à biscuits et dire WWW :: mécaniser à utiliser:

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

Le ignore_discard => 1 signifie que même les cookies de session sont enregistrés sur le disque (normalement ils sont mis au rebut pour des raisons de sécurité).

Puis, une fois connecté, appelez:

$cookie_jar->save; 

Puis, après chaque demande:

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

Alternativement, vous pouvez HTTP sous-classe :: Les cookies et remplacer la méthode set_cookie rejeter redéfinir le cookie de session s'il existe déjà.


Je pense aussi que le site nécessite un CERT (bien dans le navigateur qu'il fait), serait-ce la bonne façon de l'ajouter?

Certains navigateurs (Internet Explorer par exemple) demandent un certificat de sécurité, même s'il n'est pas nécessaire. Si vous n'obtenez aucune erreur et que le contenu de la réponse semble correct, vous n'avez probablement pas besoin d'en définir un.

Si vous avez un fichier de certificat, vérifiez le POD pour Crypt::SSLeay. Votre certificat est codé en PEM0 donc oui, vous voulez définir $ENV{HTTPS_CERT_FILE} sur le chemin de votre cert. Vous voudrez peut-être définir $ENV{HTTPS_DEBUG} = 1 pour voir ce qui se passe.

+0

Puis-je faire le retour comme ceci: $ agent-> cookie_jar-> revert; –

+0

Je pense que cela fonctionne, encore en test !!! –

+0

'$ agent-> cookie_jar-> revert' fonctionnera, oui. – rjh

Questions connexes