0

我正在尝试编写一个 perl 脚本来连接到一个网站,并且在存储我从 Chromium SQLite 数据库中获取的 cookie 时遇到了问题。这是相关的代码片段:

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);

我清理了我的用户名和域,但“say Dumper($rows)”语句返回的正是我期望的 cookie 信息。因此,我知道我的 SQLite 数据库访问正常。while 循环内外的“say Dumper($cookie_jar)”返回一个空的 cookie_jar。我刚开始玩 perl,所以在设置数据方面我缺少什么吗?

4

2 回答 2

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 值,以使该方法对其他人更明显地适应他们自己的目的。

于 2013-04-18T16:49:36.193 回答
-1

When accessing elements in an array reference such as $rows use the arrow operator. In your case change: @$rows[0] to: $rows->[0] for each element.

于 2013-04-18T16:17:12.303 回答