2010-04-22 6 views
3

Comment imprimer les valeurs du cookie/cookie_jar en cours de définition?Comment puis-je imprimer les valeurs cookie_jar dans WWW :: Mechanize de Perl?

Essayer:

##my $cookie_jar=HTTP::Cookies->new(file => "cookie.jar",autosave=>1,ignore_discard=>1); 
my $cookie_jar=HTTP::Cookies->new(); ## Would like it to be in memory 
my $agent = WWW::Mechanize->new(cookie_jar => $cookie_jar); 

##my $agent = WWW::Mechanize->new(); 
##my $agent = WWW::Mechanize->new(autocheck => 1); 

##$agent->cookie_jar({}); 

# we need cookies 
##$agent->cookie_jar(HTTP::Cookies->new); 

print "Set Cookie Jar?\n"; 
print $agent->cookie_jar->as_string(); 
print "\n"; 

$agent->get($url); // url is a https site 

Pas trop de chance avec toutes ces choses, ce que je fais mal?

+1

Vous définissez un agent Monster qui imprime les valeurs des cookies lorsqu'ils sortent du pot. Vous pouvez avoir 3 niveaux de détail. "-NOM", "-NOMNOM" et "-NOMNOMNOM". –

+0

donc mon $ monster-> manger (cookie_jar-> cookie) ;, LOL –

+0

correct. notez que c'est une opération destructrice et que vous n'obtiendrez pas de cookies. –

Répondre

5

Eh bien, vous devez avoir des cookies dans le cookie jar pour voir les cookies dans la sortie. Jusqu'à présent, vous avez un pot de biscuits vide. Soit vous assurer que vous ajoutez des cookies ou que le site auquel vous accédez les ensembles:

use HTTP::Cookies; 
use WWW::Mechanize; 

my $cookie_jar = HTTP::Cookies->new; 
my $agent  = WWW::Mechanize->new(cookie_jar => $cookie_jar); 

$cookie_jar->set_cookie(
    qw(
    3 
    cat 
    buster 
    /
    .example.com 
    0 
    0 
    0 
    ) 
    ); 

    $agent->get('http://www.amazon.com'); 

print "Set Cookie Jar?\n", $agent->cookie_jar->as_string, "\n"; 

Cela m'a donné la sortie:

Set Cookie Jar? 
Set-Cookie3: session-id=000-0000000-0000000; path="/"; domain=.amazon.com; path_spec; discard; version=0 
Set-Cookie3: session-id-time=1272524400l; path="/"; domain=.amazon.com; path_spec; discard; version=0 Set-Cookie3: cat=buster; path="/"; domain=.example.com; port=0; version=3 

Cependant, vous n'avez pas besoin d'invoquer HTTP::Cookies directement. LWP prendra soin de cela. Vous venez de donner cookie_jar une référence de hachage:

my $agent  = WWW::Mechanize->new(cookie_jar => {}); 

Si vous voulez juste les témoins d'une réponse particulière, vous pouvez créer un cookie jar séparé pour contenir ceux que vous extrait de la réponse:

use WWW::Mechanize; 

my $agent = WWW::Mechanize->new(cookie_jar => {}); 

my $response = $agent->get('http://www.amazon.com'); 

my $cookie_jar = HTTP::Cookies->new; 
$cookie_jar->extract_cookies($response); 

print $cookie_jar->as_string; 
+0

sry, nouveau sur ce truc de grattage d'écran. J'ai $ agent-> get ($ url); Est-ce que cela ajoute le cookie au cookie jar. Désolé, j'ai besoin de rire après avoir tapé ça, LMAO !!! –

+2

Montrez toujours un exemple de travail complet afin de ne pas perdre de temps à réparer les erreurs que vous n'avez pas réellement. :) Vous pouvez modifier votre question pour résoudre ce problème aussi. :) –

+0

hmm peut-être que je ne pose pas la bonne question. Comment imprimer le cookie que le site que je suis en train d'explorer envoie/définit? –

1

Votre principal problème semble être que vous essayez d'imprimer les cookies avant de visiter le site. Essayez de déplacer vos relevés d'impression après votre appel à get()

1

Si vous recherchez la valeur d'un cookie spécifique, vous devez analyser l'ensemble du cookie en utilisant la méthode HTTP::Cookie's $cookie_jar->scan(\&callback). Par exemple, pour obtenir de biscuits JSESSIONID www.linkedin.com, vous pouvez utiliser le code suivant:

#!/usr/bin/perl 

use strict; 
use warnings; 

use LWP::UserAgent; 
use HTTP::Cookies::Netscape; 

my $cookies = HTTP::Cookies::Netscape->new(
    hide_cookie2 => 1, 
    file => "$ENV{HOME}/.cookies.txt", 
    autosave => 1 
    ); 

my $browser = LWP::UserAgent->new(
    env_proxy => 1, 
    autocheck => 1, 
    cookie_jar => $cookies, 
    agent => "get-jsessionid.pl/1.0" 
    ); 

$browser->env_proxy(); 

my $response = $browser->get('http://www.linkedin.com'); 
if ($response->is_success) 
{ 
    $cookies->scan(sub 
        { 
         if ($_[1] eq 'JSESSIONID') 
         { 
          print "$_[1] @ $_[4] = $_[2]\n"; 
         }; 
        } 
     ); 
} 
else 
{ 
    die $response->status_line; 
} 

La sortie serait quelque chose comme:

JSESSIONID @ www.linkedin.com = " ajax: 11122233344455556667 "

Questions connexes