> 有些网站打开后,有验证码需要填写,而我们又不能直接获取该验证码的远程地址,然后下载,这样的话就相当于又请求了一次,那么验证码又被更新了,就达不到我们识别验证码的效果。
> 而我们的方案是通过网页截图,然后找到验证码的具体位置,然后再截图方式把验证码图片获取到。废话不多说,直接开始!
#### 示例脚本:
~~~
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require_once('vendor/autoload.php');
header("Content-Type: text/html; charset=UTF-8");
const vcodeDst = 'f://vcode.png'; //验证码存放地址
// start Firefox with 5 second timeout
$host = 'http://localhost:4444/wd/hub'; // this is the default
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->get('http://www.yimuhe.com/');
$driver->manage()->window()->maximize(); //将浏览器最大化
$driver->takeScreenshot(vcodeDst); //截取当前网页,该网页有我们需要的验证码
$element = $driver->findElement(WebDriverBy::id('vcode_img'));
generateVcodeIMG($element->getLocation(), $element->getSize(),vcodeDst);
echo 'done!';
//关闭浏览器
$driver->quit();
/**
* 生成验证码图片
* @param $location 验证码x,y轴坐标
* @param $size 验证码的长宽
*/
function generateVcodeIMG($location,$size,$src_img){
$width = $size->getWidth();
$height = $size->getHeight();
$x = $location->getX();
$y = $location->getY();
$src = imagecreatefrompng($src_img);
$dst = imagecreatetruecolor($width,$height);
imagecopyresampled($dst,$src,0,0,$x,$y,$width,$height,$width,$height);
imagejpeg($dst,$src_img);
chmod($src_img,0777);
imagedestroy($src);
imagedestroy($dst);
}
?>
~~~
> 备注:当我们已经把正确的验证码图片下载到了本地后,不管是用自己写的OCR程序进行识别还是用第三方程序进行识别都可以,这个就比较简单了,就不在这里进行陈述。
这里推荐一个比较准确的第三方验证码识别的程序,集成一下就可以了。
https://www.juhe.cn/docs/api/id/60/aid/344