1

我正在玩 Win32::IE:Mechanize 以尝试自动访问一些需要身份验证的站点。到目前为止,我已经取得了一定程度的成功,例如,我可以自动登录到我的雅虎邮箱。但是我发现很多网站都在使用某种图像验证机制,这可能被称为 CAPTCHA。我对他们无能为力。但我试图自动访问的网站之一是使用纯文本验证码。它由四位数字组成,可选择和复制。但它们不在可以使用获取的源文件中

$mech->content;

我通过Temporary Internet Files中的所有文件搜索了出现在网页上但不在源文件中的关键字,但仍然找不到。

知道发生了什么吗?我怀疑验证码以某种方式隐藏在某个 cookie 文件中,但我似乎找不到它:(

以下是完成除验证码以外的所有字段要求的代码:

use warnings;
use Win32::IE::Mechanize;

my $url = "http://www.zjsmap.com/smap/smap_login.jsp";
my $eccode = "myeccode";
my $username = "myaccountname";
my $password = "mypassword";
my $verify = "I can't figure out how to let the script get the code yet"

my $mech = Win32::IE::Mechanize->new(visible=>1);
$mech->get($url);
sleep(1); #avoids undefined value error
$mech->form_name("BaseForm");
$mech->field(ECCODE => $eccode);
$mech->field(MEMBERACCOUNT => $username);
$mech->field(PASSWORD => $password);
$mech->field(verify => $verify);
$mech->click();

像往常一样,任何建议/评论将不胜感激:)

更新

我想出了一个不太聪明的方法来解决这个问题。请评论我自己在下面发布的答案。一如既往地感谢:)

4

4 回答 4

3

这就是他们在那里的原因。停止像你这样的程序做自动化的东西;-)

CAPTCHA 或 Captcha 是一种用于计算的质询-响应测试,以确保响应不是由计算机生成的。

于 2010-02-25T05:58:10.267 回答
2

这似乎是一个无关紧要的数字。页面在 3 个地方使用它:生成它;将其显示在其输入字段旁边的表单上;并检查输入值是否等于选择的随机数。也就是说,它是仅限客户端的检查。不过,如果你禁用 javascript,我猜,重要的 cookie 不会被设置。如果您可以在页面上下文中执行 JavaScript(您应该能够使用 get 方法调用和 javascript URI),您可以将 random_number 的值更改为 fe 42 并将其填写在表单上。

于 2010-02-25T07:46:32.160 回答
0

代码由 JavaScript 插入 - 禁用 JS,重新加载页面并看到它消失。您必须通过 JS 代码来了解它的来源以及如何复制它。

于 2010-02-25T06:01:50.880 回答
0

感谢 james2vegas、zoul 和 Shoban。

我终于自己想出了一个不那么聪明但至少可行的方法来解决我在这里描述的问题。我想在这里分享。我认为@james2vegas 建议的方法可能要好得多......但无论如何我一直在学习。

我的方法是这样的:

虽然验证码不在源文件中,但由于它仍然是可选择和可复制的,我可以让我的脚本复制登录页面中的所有内容,然后提取验证码。

为此,我使用 Win32::Guitest 模块中的 sendkeys 函数执行“全选”和“复制”到登录页面。

然后我使用 Win32:Clipboard 获取剪贴板内容,然后使用 Regexp 提取代码。像这样的东西:

$verify = Win32::Clipboard::GetText();
$verify =~ s/.* (\d{4}).*/$1/msg;

一些想法:

随机数是由 Perl 中类似这样的东西生成的 my $random_number = int(rand(8999)) + 1000; #var 随机数 = rand(1000,10000); 然后它检查 $verify == $random_number。我不知道如何获取仅限一次会话的 $random_number 的值。我认为它存储在内存中的某个地方。如果我可以直接捕获该值,那么我就不会费心去使用这个和那个额外的模块。

于 2010-02-26T09:15:44.870 回答