我知道这听起来像是一个已在论坛上提出的问题,但我相信我的情况略有不同......
我尝试使用Perl登录需要身份验证的网站。我已经意识到完成此任务最方便的工具是使用WWW :: Mechanize模块,可以很容易地填写表单并提交它们。
就我而言,我遇到以下困难:
<table></table>
中。我使用以下代码,似乎无论我输入什么细节(用户/通行证),由于某种原因我总是遵循“成功”方案并收到“登录成功!”:< / p>
my $mech = WWW::Mechanize->new(
cookie_jar => {},
autocheck => 1,
onerror => \&Carp::croak,);
# Login Form
my $response = $mech->get($url);
if (!$response->is_success) {
die "Login page unreachable $url: ", $response->status_line, "\n";
}
$mech->field('Email', $Email);
$mech->field('Password', $Password);
$response = $mech->click();
if ($response->is_success) {
print "Login Successful!\n";
} else {
die "Login failed: ", $response->status_line, "\n";
}
因此,脚本的运行似乎是成功的,但是当我假设我已经登录并尝试从站点获取任何数据时,我看到(在嗅探器中)我不断被转发到“注册“页面。
非常感谢任何帮助!
提前致谢!
答案 0 :(得分:2)
似乎我已经意识到如何解决这个问题。我使用Wireshark嗅探器来分析使用浏览器时发送的HTTP标头和由mechanize对象创建的标头之间的区别。我发现机械化生成的“连接”标题包含“TE,close”值,而浏览器发出“Connection”标题,其中包含“keep-alive”值。此外,浏览器生成的请求包括额外的“Keep-Alive:115”标题。我手动将这些标题添加到我的mech对象中,如下所示:
$mech->add_header(
"Connection" => "keep-alive",
"Keep-Alive" => "115");
这解决了问题,我能够成功登录!
谢谢大家的贡献和帮助!非常感谢!
答案 1 :(得分:1)
如果它不在表单标记中,则会在某处使用GET请求将提交按钮发送到同一个(最可能的)URL。
为什么要尝试使用浏览器模拟单击身份验证按钮,是否有其他隐藏字段或您需要访问的内容?
在我看来,最好的方法是找出实际验证用户和密码的页面,并对该页面使用SSL POST请求。
如果页面有类似的内容:
<input type="text" name="user" />
<input type="password" name="pass" />
通过HTTP POST请求发送到登录页面的任何内容(如果未定义&lt; form&gt;,则可能是同一页面)。 POST变量将是user = $ value和pass = $ other_value。
答案 2 :(得分:1)
当您检查$response->is_success
是否只检查目标站点响应而没有任何HTTP错误时。但是需要检查响应页面是否包含一些文本。例如,“Auth ERROR!”等
如果目标网站使用已禁用的JavaScript,则不会出现此问题。
尝试将x和y(鼠标指针的坐标)添加到提交到表单的数据中(某些站点检查此信息)。
您可以使用一些HTTP流量监控工具来检查浏览器向目标站点发送的数据(我使用Firefox HTTPFox扩展)并通过WWW :: Mechanize发出相同的请求。
此外,WWW :: Mechanize不需要cookie_jar。它默认处理cookie。
试试这段代码:
$mech->get($url);
$mech->submit_form(
form_name => 'aspnetForm',
fields => {
'ctl00$cph1$lg1$txtEmail' => $login,
'ctl00$cph1$lg1$txtPassword' => $password,
},
button => 'ctl00$cph1$lg1$btnLogin',
);
答案 3 :(得分:1)
我建议看看WWW :: Scripter。这是使用javascript和ajax支持在WWW :: Mechanize上编写的。
WWW :: Scripter https://metacpan.org/pod/WWW::Scripter
使用此模块,您可以直接调用javascript函数并执行更多操作。