极验验证码的破解3-模拟浏览器渲染

前面我们介绍了如何求解极验验证码的滑块目标位移,下面我就就要开始实施拖动滑块破解了。因为我们采取的是模拟人的行为操作,而极验验证码都是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) {
        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("不存在极验验证码"));
    }

只需要提供包含验证码的页面url、js脚本文件名(该js文件是放在前面截图的js文件夹下的,当然你也可以自己改)以及其他脚本需要的参数即可,然后就可以等待脚本执行完成并返回执行结果。至于脚本中如何接收并执行任务,我会在下一章讲解。

时间: 2024-08-04 18:45:10

极验验证码的破解3-模拟浏览器渲染的相关文章

极验验证码的破解-开篇

    近几年有个拖动解锁的验证码风头很盛,用过12306的人就知道,它有段时间用的就是这个拖动解锁的验证码,据说就是极验验证码,虽然现在12306的验证码变成了看图识画,安全性和趣味性大大提高,但是也还是被万能的大神破了.由此看来天下没有破不了的验证码,只要功夫深,防火墙也能磨成针.     好了,今天我们来探讨一下极验验证码的破解,这也是我最近一段时间的研究成果.首先声明一下:本博客所讨论的内容仅限于技术研究,请勿用于商业用途,否则后果自负.     我打算分成几个章节来讨论极验验证码所采用

极验验证码的破解2-图片还原和滑块位置求解

上一章我们讨论了破解极验验证码的思路和步骤,这一章我将介绍如何还原两张背景图和求解滑块的目标位置. 一.图片还原 我们首先看看页面上给了我们什么参数: 这个是完整的背景图(fullbg)的页面元素,可以看到他们都是来自于同一张原图,只是截取的位置不同.上图红框就是该小图片在原图中的位置,每一张小图片都是10个像素宽,58个像素高,我们再来看看原图: 确实很乱,根本看不出什么东西.如果我们把这个原图下载下来,然后按照页面上的参数截取一个个10像素宽,58像素高的小图片拼接在一起便可以得到完整的背景

极验验证码的破解4-执行破解

经过以上的铺垫,我们就差最后一步了-破解!首选我们来分析一下要做的事情: 1.加载包含验证码的页面,当然是用我们前面讲的phantomaJS来加载啦,因为极验验证码是依赖于js渲染的,我们必须等页面完全渲染完成后再执行拖动 2.收集一些页面的参数发送到java后台服务计算滑块的目标位移并接受结果 3.通过js模拟鼠标事件来实现滑块的移动 4.输出验证结果 好,让我们一步步来讲解如果实现上面的目标. 我们首先新建一个js文件,就叫做geetest_refresh.js好了,我们首先写一些样板代码,

极验验证码破解之selenium

这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法,是不是有点小激动呢,小伙伴们等不了了,让我们赶紧直入主题吧. 虎嗅网注册 这次我们是拿虎嗅开刀,注册账号的时候需要滑动图片到缺口位置,这种验证码我们现在也经常遇到,这个就不用详细介绍了吧 针对这种验证码我们首先确定了使用selenium模拟滑动破解方式,selenium鼠标移动点击拖动都比较简单,那

极验验证码 破解

本文主要提供目前极验的识别思路. 极验验证码主要分为4步. 1/ 还原验证图片.通过分析CSS,发现是固定位置,把一张图片分成若干份,按照指定顺序重新排列,所以难度不大. 2/ 还原好图片后,找出2张图片的差异,即bg(验证图)和fullbg(全图).这个难度也不大,按像素或者按块去扫描.设定一个阈值,当2个图片块或像素的差异值高于这个阈值的时候,就横向向右再扫描几个像素,例如10个,如果这10个像素里面有7个都高于这个像素.那个这个像素所在图片的X坐标,就是我们要的坐标点.根据这种方式,识别坐

极验验证码-userresponse.js

aa= function(a, b) { for (var c = b.slice(32), d = [], e = 0; e < c.length; e++) { var f = c.charCodeAt(e); d[e] = f > 57 ? f - 87 : f - 48 } c = 36 * d[0] + d[1]; var g = Math.round(a) + c; b = b.slice(0, 32); var h, i = [[], [], [], [], []], j = {

极验验证码-判断需要移动的距离

public static int compare(String file1,String file2,String file3,int threshold){ int result=0; try { //读取第一张图片 File fileOne = new File(file1); BufferedImage ImageOne = ImageIO.read(fileOne); int width = ImageOne.getWidth();//图片宽度 int height = ImageOn

极验验证码缺口图片计算缺口位置

对两张图片的像素点做比较,当不同的时候返回当前点位 from PIL import Image img = Image.open('captcha1.png') img2 = Image.open('captcha2.png') print(img.size)#(258, 159) print(img2.size)#(258, 159) for i in range(60,img.size[0]):#刨除拖动位置的坐标 for j in range(img.size[1]): if abs(im

破解极验滑动验证码

阅读目录 一 介绍 二 实现 三 说明 一 介绍 一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下 但一些网站加入了滑动验证码,最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/,下图是极验的登录界面 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家企业正在使用极验,每天服务响应超过四亿次,广泛应用于直播视频.金融服务.