Html 为什么我可以使用浏览器通过此表单登录,而不是LWP?

Html 为什么我可以使用浏览器通过此表单登录,而不是LWP?,html,perl,forms,post,lwp,Html,Perl,Forms,Post,Lwp,我试图登录到一个网站,该网站使用此表单和三个输入进行身份验证 <form action="/login.html" method="post"> <div class="loginlabel1 aright">ID / Email: </div> <div class="bsearchfield"> <input type="text" name="profid" class="inputBx" size="15" value="" />

我试图登录到一个网站,该网站使用此表单和三个输入进行身份验证

<form action="/login.html" method="post">
<div class="loginlabel1 aright">ID / Email: </div>
<div class="bsearchfield">
<input type="text" name="profid" class="inputBx" size="15" value="" />
</div>
<div class="clear"></div>
<div class="loginlabel1 aright">Password: </div>
<div class="bsearchfield">
<input type="password" name="password" class="inputBx" size="15" value="" />
</div>
<div class="clear"></div>
<div class="loginbutton1">
<input name="login"type="image" src="images/logi.gif" align="right" border="0" />
</div>
</form>

有时,它们需要正确的接受编码和/或引用头。当然,我也会尝试用户代理标题。

您的提交按钮是一个图像。当点击类型为image的输入时,浏览器会将点击位置的像素坐标发送到CGI。在您的表单中,浏览器将发送
login.x
login.y
以及
profid
密码

顺便说一句,这是调试CGI的一个很好的工具。

我也推荐Firefox。你打开它,然后提交你的表单,它会准确地显示得到或发布到站点的内容,包括所有标题、参数和cookies,然后显示来自服务器的所有响应,包括设置cookies、标题和重定向

页面上可能有javascript创建了额外的参数,当您只查看表单时,您看不到这些参数,上面提到的图像坐标,或者它可能要求您首先接受cookie并在登录时发送cookie

LiveHTTPHeaders还允许您修改标题和“重播”-这允许您修改发送到服务器的内容(任何标题、cookie、参数等),以帮助确定服务器登录时实际需要的内容

另外,我认为LWP默认情况下会自动跟随重定向,因此页面可能实际上正在重定向,而您却看不到它(我认为“simple_request”函数不会跟随redirs)

在LWP响应中,您可以通过任何重定向向后走,如下所示:

my $prev_res = $res->previous();
while ( $prev_res ) {
    print $prev_res->status_line . "\n";
    $prev_res = $prev_res->previous();
}

希望这有帮助

您没有提交单击的提交按钮的名称;我怀疑另一端的代码正在检查请求中是否存在该变量,以查看表单是否已提交

正如PacoRG指出的,submit按钮是一个图像;同样地,在浏览器中单击该按钮进行提交将提交名为“login.x”和“login.y”以及“login”的字段

避免此类问题的一个好方法是使用它为您做大量工作,例如:

my $mech = WWW::Mechanize->new;
$mech->get('http://www.example.com/login.html');
$mech-submit_form(
    with_fields => {
        profid => $username,
        password => $password,
    },
);
上面将请求登录页面,找到合适的表单并提交

另外,正如其他人所说,如果来自脚本的请求与来自浏览器的请求的处理方式不同,那么最好的调试方法是获取两者发送的完整HTTP请求,并查找相关的差异。对于浏览器,您可以使用诸如Firefox的LiveHTTPHeaders或Tamper数据插件之类的扩展,或者使用诸如Wireshark之类的东西在发送请求时捕获请求。对于脚本,您可以很容易地让它输出正在发送的请求

例如,对于使用LWP::UserAgent或WWW::Mechanize(其子类为LWP::UserAgent)的脚本,可以添加:

$mech->add_handler("request_send", sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });

这将转储发送的原始请求以及来自服务器的原始响应。(将
$mech
更改为LWP::UserAgent/WWW::Mechanize对象所在的变量-
$browser

也许您可以尝试诊断问题。你得到的是重定向响应码还是200 OK或者其他什么?没有。它返回的是同一个登录页面。无错误代码您的响应代码是什么?200行吗?完整的标题是什么?是的。它给我200 OK作为响应。并且只打印响应标题字段-server=Apache+1这是调试此类问题的准确方法。将请求与网络嗅探器(如Wireshark)进行比较也会有所帮助。
$mech->add_handler("request_send", sub { shift->dump; return });
$mech->add_handler("response_done", sub { shift->dump; return });