使用 Perl 实现文字识别验证码的自动化处理


本文将介绍如何使用 Perl 实现文字识别验证码的自动化处理。具体步骤包括提取目标文字和背景图文字,计算点击坐标并模拟点击。

一、目标文字识别
首先,通过 XPath 提取出目标图片的 URL 并下载。

perl

use strict;
use warnings;
use LWP::Simple;
use Selenium::Remote::Driver;

my $driver = Selenium::Remote::Driver->new;
$driver->get('YOUR_TARGET_URL');

# 提取并下载目标图片
my $image2 = $driver->find_element('//*[@id="verify-bar-code"]', 'xpath');
my $target_img_url = $image2->get_attribute('src');
my $target_image_content = get($target_img_url);
open(my $fh, '>', 'target_image.png') or die "Could not open file 'target_image.png' $!";
print $fh $target_image_content;
close $fh;
然后通过 OCR 库直接识别出文字。

perl

use Imager;
use Imager::OCR;

my $ocr = Imager::OCR->new();
my $target_image = Imager->new(file => 'target_image.png') or die Imager->errstr();
my $target_words = $ocr->recognize($target_image);更多内容联系1436423940
print "Target words: $target_words\n";
二、背景图文字识别
同样先通过 XPath 提取背景图片 URL 并下载。

perl

# 提取并下载背景图片
my $image1 = $driver->find_element('//*[@id="captcha-verify-image"]', 'xpath');
my $background_img_url = $image1->get_attribute('src');
my $background_image_content = get($background_img_url);
open(my $fh, '>', 'background_image.png') or die "Could not open file 'background_image.png' $!";
print $fh $background_image_content;
close $fh;
获取图片后,直接使用 OCR 库的目标检测函数识别背景图文字坐标。

perl

use Imager::Search;

my $background_image = Imager->new(file => 'background_image.png') or die Imager->errstr();
my $poses = Imager::Search->new()->find_objects($background_image);
然后通过识别出来的坐标对背景图的每个文字分别进行裁剪,裁剪后对图片进行文字的 OCR 识别。

perl

use Imager::Transform;

my %click_identify_result;
foreach my $pos (@$poses) {
    my ($x1, $y1, $x2, $y2) = @$pos;
    my $crop = $background_image->crop(left => $x1, top => $y1, right => $x2, bottom => $y2);
    my $word = $ocr->recognize($crop);
    $click_identify_result{$word} = $pos;
}
三、计算点击坐标并点击
文字全部识别完毕后,只要计算下点击坐标就好了。

perl

# 计算文字点击坐标
my %img_xy;
foreach my $key (keys %click_identify_result) {
    my ($x1, $y1, $x2, $y2) = @{$click_identify_result{$key}};
    $img_xy{$key} = [int(($x1 + $x2) / 2), int(($y1 + $y2) / 2)];
}
print "Image coordinates: ", %img_xy, "\n";

# 计算最终点击顺序与坐标
my %result;
foreach my $word (split //, $target_words) {
    $result{$word} = $img_xy{$word};
}
print "Click result: ", %result, "\n";

# 点击坐标
my ($image1_x, $image1_y) = ($image1->get_element_location()->{x}, $image1->get_element_location()->{y});
foreach my $xy (values %result) {
    my ($x, $y) = @$xy;
    $x = $x * (340 / 552);
    $y = $y * (212 / 344);
    $driver->mouse_move_to_location(element => $image1, xoffset => $x, yoffset => $y);
    $driver->click();
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值