前面我们介绍了如何求解极验验证码的滑块目标位移,下面我就就要开始实施拖动滑块破解了。因为我们采取的是模拟人的行为操作,而极验验证码都是js渲染的,因此我们需要一个工具来帮我们完成这个渲染过程得到一个完整的页面,否则一切都是空谈。这里我将使用casperJs+phantomJs来实现目标。
phantomJs号称一个headless的浏览器,也就是包含浏览器内核但是没有界面的浏览器,它是跨平台的,安装很简单,解压到一个目录即可。
casperJs是基于phantomJs的封装,提供了更友好的api和方法,让我们编写脚本更容易。
请各位自行下载这两个东西然后解压在一个目录,我的情况是这样的(exec目录下的casperjs和phantomjs两个文件夹就是下载包解压后的内容):
然后我们编写一个工具类来管理这个无头浏览器的执行:
package com.yay.geetestIdentification.utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.Semaphore;
/**
* 管理Casperjs的启动和执行
*
*/
public class CasperjsProgramManager {
private static Logger logger = LoggerFactory.getLogger(CasperjsProgramManager.class);
private static final Semaphore semaphore = new Semaphore(10, true);
public static String launch(String jsFileName, Object... params) {
if (StringUtils.isBlank(jsFileName)) {
logger.error("待执行的js文件名不能为空!");
return null;
}
try {
semaphore.acquire();
String path = CasperjsProgramManager.class.getResource("/").getPath();
path = path.substring(1, path.lastIndexOf("/") + 1);
String os = System.getProperties().getProperty("os.name");
String casperJsPath = "";
String phantomJsPath = "";
if (StringUtils.startsWithIgnoreCase(os, "win")) {
casperJsPath = path + "casperjs/bin/casperjs.exe";
phantomJsPath = path + "phantomjs/window/phantomjs.exe";
} else {
casperJsPath = path + "casperjs/bin/casperjs";
phantomJsPath = path + "phantomjs/linux/phantomjs";
}
logger.info("CasperJs程序地址:{}", casperJsPath);
ProcessBuilder processBuilder = new ProcessBuilder(casperJsPath, jsFileName);
if (params != null) {
for (Object param : params) {
processBuilder.command().add(String.valueOf(param));
}
}
processBuilder.directory(new File(path + "casperjs/js"));
processBuilder.environment().put("PHANTOMJS_EXECUTABLE", phantomJsPath);
Process p = processBuilder.start();
InputStream is = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp).append("\r\n");
}
p.destroy();
semaphore.release();
return sbf.toString();
} catch (Exception ex) {
logger.error(ex.getMessage());
return null;
}
}
}
由以上代码我们可以知道我们的前面两个东西为什么要放在特殊的目录下面了,调用很简单:
private static boolean startIdentification(String pageUrl,String domain,String cookies,String jsFileName, String deltaResolveAddress) {只需要提供包含验证码的页面url、js脚本文件名(该js文件是放在前面截图的js文件夹下的,当然你也可以自己改)以及其他脚本需要的参数即可,然后就可以等待脚本执行完成并返回执行结果。至于脚本中如何接收并执行任务,我会在下一章讲解。 仅此而已
String result = CasperjsProgramManager.launch(jsFileName, pageUrl,deltaResolveAddress,domain,cookies, " web-security=no", "ignore-ssl-errors=true");
logger.info("验证码识别结果:\r\n" + result);
return result != null && (result.contains("验证通过") || result.contains("不存在极验验证码"));
}