2013-04-18 64 views
0

我正在嘗試編寫一個perl腳本來連接到一個網站,並且在存儲我從Chromium SQLite數據庫中抓取的cookie時遇到了問題。下面是相關的代碼片段:在Perl腳本中使用鉻餅乾

use HTTP::Cookies; 
use Data::Dumper; 
use feature 'say'; 
use DBI; 

my $cookie_jar = HTTP::Cookies->new(); 
my $dbh = DBI->connect("dbi:SQLite:dbname=/home/{user}/.config/chromium/Default/Cookies", 
    "", ""); 
my $sth = $dbh->prepare("select * from cookies where host_key='{domain}'"); 
$sth->execute(); 
my $rows; 
while ($rows = $sth->fetch()) { 
    say Dumper($rows); 
    $cookie_jar->set_cookie(@$rows[0], 
          @$rows[1], 
          @$rows[2], 
          @$rows[3], 
          @$rows[4], 
          @$rows[5], 
          @$rows[6], 
          @$rows[7], 
          @$rows[8], 
          @$rows[9]); 
    say Dumper($cookie_jar); 

} 

$sth->finish(); 
$dbh->disconnect(); 

say Dumper($cookie_jar); 

我擦洗我的用戶名和域名,但「說自卸車($行)」語句返回正是我期待的cookie信息。因此,我知道我的SQLite數據庫訪問正在工作。 while循環內部和外部的「say Dumper($ cookie_jar)」返回一個空的cookie_jar。我剛剛開始使用perl進行遊戲,因此在設置數據時,我錯過了某些東西?

回答

-1

當訪問數組引用(如$ rows)中的元素時,使用箭頭運算符。在你的情況下更改:@$rows[0] 到:$rows->[0] 爲每個元素。

+0

這似乎不是這個腳本的中心問題,所以這不是一個真正的答案。 (另外,'$$ arr [0]'和'$ arr - > [0]'是完全等價的。你忘了提到顯而易見的解決方案,數組切片'@ $ arr [0 .. 9]') – amon

+0

我嘗試了所有這些訪問方法,儘管知道引用數組的其他方法(特別是@ $ arr [0..9])非常方便,但它們都沒有解決持久性問題。 – bjornsen

1

我發現沒有標準的cookie值或存儲它們的標準順序。 Chromium cookie中的字段0-9不映射到HTTP :: Cookies中的字段0-9。看起來set_cookie方法由於奇怪的值而失敗,但沒有詳細說明其錯誤。我意識到,更好的方式來處理它是使用hashrefs爲行,所以我想有更多的可讀的代碼:

# set_cookie($version, $key, $val, $path, $domain, 
#    $port, $path_spec, $secure, $maxage, $discard, \%rest) 

while ($rows = $sth->fetchrow_hashref()) { 
    $cookie_jar->set_cookie(0, 
          $rows->{name}, 
          $rows->{value}, 
          $rows->{path}, 
          $rows->{host_key}, 
          443, 
          0, 
          $rows->{secure}, 
          1000000, 
          0); 
    say Dumper($cookie_jar); 

} 

我在評論添加set_cookie值,使該方法的其他人更明顯適應這個他們自己的目的。

+0

或者按下select語句,爲您提供與set_cookie的預期參數相匹配的列:''從cookie中選擇0,名稱,值,路徑,host_key,null,null,secure,600''然後'$ cookie_jar-> set_cookie @ $行);' – ttubrian