2012-07-20 74 views
2

我正在努力的是爲什麼LWP :: UserAgent不提供訪問者,以便我可以通過提供cookie的名稱來獲取我想要知道的關於cookie_jar中的cookie的所有信息。我意識到cookie_jar上有scan()方法,但它似乎有很多開銷,爲如此基本的事情提供回調。這就是我現在所擁有的:通過cookie名稱從cookie_jar中提取cookie

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dump qw (dump); 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new; 
$mech->get('http://www.nytimes.com'); 

my %cookies =(); 
$mech->cookie_jar->scan(\&check_cookies); 

dump \%cookies; 

sub check_cookies { 
    my @args = @_; 
    $cookies{ $args[1] } = { 
     version => $args[0], 
     val  => $args[2], 
     path  => $args[3], 
     domain => $args[4], 
     port  => $args[5], 
     path_spec => $args[6], 
     secure => $args[7], 
     expires => $args[8], 
     discard => $args[9], 
     hash  => $args[10], 
    }; 
} 

腳本的輸出是這樣的:

{ adxcs => { 
     discard => 1, 
     domain => ".nytimes.com", 
     expires => undef, 
     hash  => {}, 
     path  => "/", 
     path_spec => 1, 
     port  => undef, 
     secure => undef, 
     val  => "-", 
     version => 0, 
    },  
    RMID => { 
     discard => undef, 
     domain => ".nytimes.com", 
     expires => 1374340257, 
     hash  => {}, 
     path  => "/", 
     path_spec => 1, 
     port  => undef, 
     secure => undef, 
     val  => "02b4bc821c00500991212ba2", 
     version => 0, 
    },  
} 

所以,這給了我方便地訪問名字的cookie,但我在想,如果有一個更簡單的方法來做到這一點,或者如果有一個我不知道的有用的模塊。

+0

我應該說,深入研究了這個問題後,我的問題和示例代碼非常天真。如果cookie jar中的所有cookie都來自完全相同的域,則基於cookie名稱的所有cookie都可以正常工作。否則,它會崩潰,是毫無意義的。話雖如此,我想看到一個模塊,它返回cookie對象,然後您可以更新和設置。我目前正在研究這些代碼,並希望很快將其發​​布到CPAN。 – oalders 2012-08-10 16:00:17

+0

我已經將代碼發佈到https://metacpan.org/module/HTTP::CookieMonster – oalders 2012-10-04 14:09:40

回答

0
$cookies->scan(sub 
{ 
    if ($_[1] eq $name) 
    { 
    print "$_[1] @ $_[4] = $_[2]\n"; 
    }; 
}); 

輸出將是例如:

sessionID @ www.nytimes.com = 1234567890 

編輯: >>

sub getCookieValue 
{ 
    my $cookies = $_[0]; 
    my $name = $_[1]; 
    my $result = null; 
    $cookies->scan(sub 
    { 
    if ($_[1] eq $name) 
    { 
     $result = $_[2]; 
    }; 
    }); 
    return $result; 
} 

,並使用它,像這樣:

print getCookieValue($cokies, 'sessionID'); 
+0

那麼,這基本上就是我的代碼已經在做的事情,但是它增加了創建我可以訪問的散列的層。我想要做的是將一個cookie名稱傳遞給一個方法並獲得一些回報。據我所知,掃描不會返回任何內容,所以它在此上下文中調試很有用,但不適用於返回任何內容。 – oalders 2012-07-20 17:52:50

+0

@oalders - 答案已更新 – 2012-07-20 17:59:08

+0

非常感謝您的回答。在仔細研究了這些之後,我意識到我其實並沒有提出一個很好的問題,但是我認爲,您提供的解決方案最接近解決方案。 – oalders 2012-08-10 15:57:21