GVKun编程网logo

Thinkphp极验滑动验证码实现步骤解析(极验滑动验证码破解接口)

12

关于Thinkphp极验滑动验证码实现步骤解析和极验滑动验证码破解接口的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于95行代码极验滑动验证码?是远远不够的!大牛石锤!、Javaselen

关于Thinkphp极验滑动验证码实现步骤解析极验滑动验证码破解接口的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于95行代码极验滑动验证码?是远远不够的!大牛石锤!、Java selenium处理极验滑动验证码示例、Java 介入极验滑动验证码、Java中关于selenium处理极验滑动验证码的示例等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Thinkphp极验滑动验证码实现步骤解析(极验滑动验证码破解接口)

Thinkphp极验滑动验证码实现步骤解析(极验滑动验证码破解接口)

对于建站的筒子们来说;垃圾广告真是让人深恶痛绝;

为了清净;搞个难以识别的验证码吧;又被用户各种吐槽;

直到后来出现了极验这个滑动的验证码;这真是一个体验好安全高的方案;


官网:http://www.geetest.com/ (此处应该有广告费)

示例项目:https://github.com/baijunyao/thinkphp-bjyadmin

一:注册获取key

注册;创建应用;获取key;


二:导入sdk

/ThinkPHP/Library/Org/Xb/Geetest.class.php

三:生成验证样式

/tpl/Home/Index/index.html

<div>
  <h4>
    <a target="_blank" href="http://baijunyao.com/article/79" rel="external nofollow" >thinkphp整合系列之极验滑动验证码</a>
  </h4>
  <form id="geetest" action="{:U(''Home/Index/geetest_submit_check'')}" method="post">
    账号:<input type="text" name="username" value="admin">
    密码:<input type="text" name="password" value="123456">
    <input type="button" value="异步验证登录" onclick="check_verify()">
    <input type="submit" value="post提交登录">
    <div id="captcha"></div>
  </form>
</div>
<script src="/Public/statics/js/jquery-1.10.2.min.js"></script>
<script src="http://static.geetest.com/static/tools/gt.js"></script>
<script>
  var handler = function (captchaObj) {
    // 将验证码加到id为captcha的元素里
    captchaObj.appendTo("#captcha");
   };
  // 获取验证码
  $.get("{:U(''Home/Index/geetest_show_verify'')}", function(data) {
    // 使用initGeetest接口
    // 参数1:配置参数,与创建Geetest实例时接受的参数一致
    // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
    initGeetest({
      gt: data.gt,
      challenge: data.challenge,
      product: "float", // 产品形式
      offline: !data.success
    }, handler);
  },''json'');
  // 检测验证码
  function check_verify(){
    // 组合验证需要用的数据
    var test=$(''.geetest_challenge'').val();
    var postData={
      geetest_challenge: $(''.geetest_challenge'').val(),
      geetest_validate: $(''.geetest_validate'').val(),
      geetest_seccode: $(''.geetest_seccode'').val()
    }
    // 验证是否通过
    $.post("{:U(''Home/Index/geetest_ajax_check'')}", postData, function(data) {
      if (data==1) {
        alert(''验证成功'');
      }else{
        alert(''验证失败'');
      }
    });
  }
</script>

HTML

四:验证函数

/Application/Common/Common/function.php

/**
 * geetest检测验证码
 */
function geetest_chcek_verify($data){
  $geetest_id=C(''GEETEST_ID'');
  $geetest_key=C(''GEETEST_KEY'');
  $geetest=new \Org\Xb\Geetest($geetest_id,$geetest_key);
  $user_id=$_SESSION[''geetest''][''user_id''];
  if ($_SESSION[''geetest''][''gtserver'']==1) {
    $result=$geetest->success_validate($data[''geetest_challenge''], $data[''geetest_validate''], $data[''geetest_seccode''], $user_id);
    if ($result) {
      return true;
    } else{
      return false;
    }
  }else{
    if ($geetest->fail_validate($data[''geetest_challenge''],$data[''geetest_validate''],$data[''geetest_seccode''])) {
      return true;
    }else{
      return false;
    }
  }
}

PHP

多谢 香蕉你个banana 童鞋的提醒;补上验证的函数;

五:php 生成验证码 并 验证

/Application/Home/Controller/IndexController.class.php

/**
 * geetest生成验证码
 */
public function geetest_show_verify(){
  $geetest_id=C(''GEETEST_ID'');
  $geetest_key=C(''GEETEST_KEY'');
  $geetest=new \Org\Xb\Geetest($geetest_id,$geetest_key);
  $user_id = "test";
  $status = $geetest->pre_process($user_id);
  $_SESSION[''geetest'']=array(
    ''gtserver''=>$status,
    ''user_id''=>$user_id
    );
  echo $geetest->get_response_str();
}
/**
 * geetest submit 提交验证
 */
public function geetest_submit_check(){
  $data=I(''post.'');
  if (geetest_chcek_verify($data)) {
    echo ''验证成功'';
  }else{
    echo ''验证失败'';
  }
}
/**
 * geetest ajax 验证
 */
public function geetest_ajax_check(){
  $data=I(''post.'');
  echo intval(geetest_chcek_verify($data));
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • ThinkPHP5.1验证码功能实现的示例代码
  • ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
  • thinkphp5.1验证码及验证码验证功能的实现详解
  • tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
  • thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
  • thinkPHP框架实现的短信接口验证码功能示例
  • thinkPHP实现的验证码登录功能示例
  • 详解ThinkPHP3.2.3验证码显示、刷新、校验
  • thinkPHP中验证码的简单实现方法
  • thinkphp自带验证码全面解析

95行代码极验滑动验证码?是远远不够的!大牛石锤!

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<phttps://www.jb51.cc/tag/gino/" target="_blank">gino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei','Helvetica Neue',Arial,sans-serif;background-color:rgb(255,255,255);">

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>一直以来,极验坚持的理念是:醉心技术,以不变之变以应万变。通过不断地钻研技术,升级产品,每日迭代更新,全网联动联防。在攻防过程中,始终将对手甩在身后,我们团队始终坚守着,因为我们相信行动才是最好的回应。

<p>所以,在我们看来,大家围绕着“行为验证”安全产品而展开的相关技术细节讨论,是对我们最大的推动,极验“行为验证”的成功离不开大家的建言献策。

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>“行为验证”本质上是一个人工智能产品

<p>人工智能决策演示效果

<p>我们还会从多个维度对用户的交互行为进行采集,一部分数据进行特征工程,通过哈希随机森林进行处理判别,另外一部分数据通过卷积神经网络进行训练并输出差别结果。

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>极验独创的逻辑严密的“三防体系”

<p>对于目前主流的攻击行为,极验具备“防模拟,防伪造,防暴力”的能力。这些能力在后端全部由AI进行智能感知和决策。

<p>防模拟

<p>在前面已经介绍了,我们的动态和静态模型对于模拟的轨迹具备很强的区分能力和动态学习防御能力。

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>极验“三防体系”之防伪造演示效果

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>防暴力

<p>对于一些极端的黑产组织,在多次尝试无效之后,会进行类似DDos的攻击。对此,我们也有应对策略,极验首次在验证安全产品中引入工作量证明。对于暴力攻击的客户,我们会强制要求提交cpu密集计算的题目,强制消耗硬件资源,有效避免了暴力攻击。

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>通过上面的那些介绍,相信大家已经对极验的产品有了一定的了解了。其实安全这个行业,就是不断攻防的过程,作为安全从业人员,时刻都在枕戈待旦,沙场点兵。

<p>我们全体极验人也在不断地努力钻研,自我挑战。只为打造更加智能、更加安全以及更加友好的产品,所以才有了上述这些完整的逻辑体系和技术体系。

<p>最后,极验团队也有些题外话跟大家说:

<p>首先,我们非常欢迎大家就交互安全技术展开交流,并筹办AI在交互安全行业的相关分享交流活动,最近一场将在5月17日,我们也将在斗鱼以及微信上进行同步直播报道,有兴趣大家可以参与进来。

<p>

95行代码极验滑动验证码?是远远不够的!大牛石锤!

<p>回复小编 01 即可获取零基础视频一套哦!PDF还在整理中!


总结

以上是小编为你收集整理的95行代码极验滑动验证码?是远远不够的!大牛石锤!全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Java selenium处理极验滑动验证码示例

Java selenium处理极验滑动验证码示例

本篇文章主要介绍了Java selenium处理极验滑动验证码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题,我按照这思路去大概实现了一下。

1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过)

我用的是java,我首先先想到了用直接用htmlunit,我做了点初始化

private void initWebClient() { if (webClient != null) { return; } webClient = new WebClient(browserVersion.FIREFOX_24); webClient.getoptions().setProxyConfig(new ProxyConfig("127.0.0.1",8888)); webClient.getoptions().setActiveXNative(true); webClient.getoptions().setUseInsecureSSL(true); // 配置证书 webClient.getoptions().setJavaScriptEnabled(true); webClient.getoptions().setCssEnabled(true); webClient.setCssErrorHandler(new SilentCssErrorHandler()); webClient.getoptions().setThrowExceptionOnScriptError(false); webClient.getoptions().setThrowExceptionOnFailingStatusCode(false); CookieManager cookieManager = new CookieManager(); List httpCookies = client.getCookies();//其方式获取的cookie for (org.apache.http.cookie.Cookie cookie : httpCookies) { cookieManager.addCookie(new com.gargoylesoftware.htmlunit.util.Cookie(cookie)); } webClient.setCookieManager(cookieManager); }

初始化代理,cookie..然后就能正常调用了

HtmlPage page = webClient.getPage("http://www.qixin.com/login");//企信宝 gePageInfor(page);

下面就是我获取图片,还原图片并且模拟拖拽,(这里我觉得是有些问题的,可能是拖拽我模拟的不对导致触发的js并没有生成正确的轨迹,还请大家帮忙看看哪里错了)

private void gePageInfor(HtmlPage page) { String[] img_slice={"div", "class", "gt_cut_fullbg_slice"}; String[] img_bg_slice={"div", "class", "gt_cut_bg_slice"}; HtmlDivision div = (HtmlDivision) page.getElementById("captcha"); int deCAPTCHA = 0; try { byte[] img_slice_binary = client.get(getimgurl(img_slice, div, true)).getBinary();//获取图片byte byte[] img_bg_slice_binary = client.get(getimgurl(img_bg_slice, div, false)).getBinary(); //获取还原后的图片 BufferedImage geetestImg = ImgTest.getGeetestImg(img_slice_binary, ImgTest.imgArray); BufferedImage geetestImg2 = ImgTest.getGeetestImg(img_bg_slice_binary, ImgTest.imgArray); //获得图片移动位置(目前还有问题,需改用第三方图片识别) deCAPTCHA =ImgTest.deCAPTCHA(geetestImg,geetestImg2); System.out.println(deCAPTCHA); } catch (IOException | FetchException e) { e.printstacktrace(); } HtmlDivision div_slider_knob = get_div_slider_knob(page,"gt_slider_knob gt_show");//获取要移动div HtmlPage mouSEOver = (HtmlPage) div_slider_knob.mouSEOver(); HtmlPage mouseDownPage = (HtmlPage)div_slider_knob.mouseDown(); div_slider_knob = get_div_slider_knob(mouseDownPage,"gt_slider_knob gt_show moving"); mouseMoveX(deCAPTCHA, div_slider_knob, mouseDownPage); HtmlPage newPage =(HtmlPage)div_slider_knob.mouSEOver(); // newPage =(HtmlPage)div_slider_knob.mouseDown(); System.out.println(newPage.asXml()); div = (HtmlDivision)newPage.getElementById("captcha"); HtmlElement htmlElement = div.getElementsByAttribute("div", "class", "gt_slice gt_show moving").get(0); System.out.println(htmlElement); newPage =(HtmlPage)div_slider_knob.mouseUp();//触发js,轨迹没有生成 System.out.println("---------------"); System.out.println(newPage.asXml()); if (newPage.getElementById("captcha")!=null) {//错误重试 //gePageInfor(newPage); } } private void mouseMoveX(int deCAPTCHA, HtmlDivision div_slider_knob, HtmlPage mouseDown) { MouseEvent mouseEvent = new MouseEvent(div_slider_knob, MouseEvent.TYPE_MOUSE_MOVE, false, false, false, MouseEvent.BUTTON_LEFT); mouseEvent.setClientX( mouseEvent.getClientX()+((deCAPTCHA!=0)?deCAPTCHA:99)); //移动x坐标 ScriptResult scriptResult = mouseDown.getDocumentElement().fireEvent(mouseEvent); } private HtmlDivision get_div_slider_knob(HtmlPage page,String classstring) { return (HtmlDivision)(((HtmlDivision) page.getElementById("captcha")).getElementsByAttribute("div", "class", classstring).get(0)); } private String getimgurl(String[] img_slice, HtmlDivision div, boolean isNeedCheckPostion) { String url =""; int[] postion = new int[2]; boolean empty = div.getElementsByAttribute(img_slice[0],img_slice[1],img_slice[2]).isEmpty(); if (div.hasChildNodes() && !empty) { List elementsByAttribute = div.getElementsByAttribute(img_slice[0],img_slice[1],img_slice[2]); for(int i = 0;i

对比图片获取位移方法(deCAPTCHA)是错的我就不放代码了,下面是其中还原图片用的方法,目前是其实审查元素后你就明白怎么还原这个图片了,这里是每次读的10px,58px 

public static BufferedImage getGeetestImg(byte[] binary, int[][] imgArray) throws IOException { BufferedImage img = ImageIO.read(new ByteArrayInputStream(binary)); List list = new ArrayList(); for (int i=0;i>>1; for (int i = 0; i

2.使用selenium

后来我想着是我模拟鼠标这个动作哪里有问题,我就又找到了selenium(2.42.2),他也能操作htmlunit关键他的鼠标动作好像封装比较完全

但是我尝试了以后发现了这个,HtmlUnitMouse这个动作没有实现

public void mouseMove(Coordinates where, long xOffset, long yOffset) { throw new UnsupportedOperationException("Moving to arbitrary X,Y coordinates not supported."); }

好吧,于是调用chrome吧

System.setProperty("webdriver.chrome.driver","C:\chromedriver.exe"); Proxy proxy = new Proxy(); //设置代理服务器地址 proxy.setHttpProxy("127.0.0.1:8888"); // DesiredCapabilities capabilities = DesiredCapabilities.htmlUnitWithJs(); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability(CapabilityType.PROXY, proxy); // final WebDriver driver = new HtmlUnitDriver(capabilities); WebDriver driver = new ChromeDriver(capabilities); driver.get("http://www.qixin.com/login"); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); checkPage(driver,"return $('.gt_cut_fullbg_slice');"); // 获取 网页的 title System.out.println("1 Page title is: " + driver.getTitle()); // 通过 id 找到 input 的 DOM String pageSource = driver.getPageSource(); System.out.println(pageSource); org.openqa.selenium.JavascriptExecutor executor = (org.openqa.selenium.JavascriptExecutor)driver; boolean equals = executor.executeScript("return document.readyState").equals("complete"); int moveX =99;//移动位置 if (equals) { WebElement element = driver.findElement(By.className("gt_slider_knob"));//(".gt_slider_knob")); Point location = element.getLocation(); element.getSize(); Actions action = new Actions(driver); // action.clickAndHold().perform();// 鼠标在当前位置点击后不释放 // action.clickAndHold(element).perform();// 鼠标在 onElement 元素的位置点击后不释放 // action.clickAndHold(element).moveByOffset(location.x+99,location.y).release().perform(); //选中source元素->拖放到(xOffset,yOffset)位置->释放左键 action.dragAndDropBy(element, location.x+moveX,location.y).perform(); // action.dragAndDrop(element,newelement).perform(); pageSource = driver.getPageSource(); } //更新cookie Set cookies = driver.manage().getCookies(); Set cookies2 = new HashSet(); for (org.openqa.selenium.Cookie cookie : cookies) { cookies2.add((Cookie) new Cookie(cookie.getDomain(), cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getExpiry(), true)); } for (Cookie cookie : cookies2) { org.apache.http.cookie.Cookie httpClient = cookie.toHttpClient(); } System.out.println(pageSource);

这样提交的表单确实是有轨迹的,这里移动位置我先写了个固定值,可以由上面图片还原,以及一些开源的图片识别工具识别出位置。以上应该就能解决这个滑动验证码了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

Java 介入极验滑动验证码

Java 介入极验滑动验证码

 

1.是否开启验证码接口

接口名:/api3/account/captcha/open

http://localhost:8080/api3/account/captcha/open

参数非空:mobileNo;countryNo;

请求方式:get

 

2.预处理验证码接口

接口名:/api3/account/captcha/start

无参数:

请求方式:get

 

3.获取验证码接口

接口名:/api3/account/captcha/verify

参数非空:geetest_challenge,geetest_validate,geetest_seccode,

mobileNo,countryNo。

请求方式:post

{"success":1,"gt":"b46d1900d0a894591916ea94ea91bd2c","challenge":"aca5d5a08c397aba47a973a1f968e9af"}

 

@RequestMapping("/StartCaptchaServlet")
    protected void StartCaptchaServlet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {

        GeetestLib gtSdk = new GeetestLib(GeetestConfig.getCaptcha_id(), GeetestConfig.getPrivate_key());

        String resStr = "{}";

        //自定义userid
        String userid = "test";

        //进行验证预处理
        int gtServerStatus = gtSdk.preProcess(userid);

        //将服务器状态设置到session中
        request.getSession().setAttribute(gtSdk.gtServerStatusSessionKey, gtServerStatus);
        //将userid设置到session中
        request.getSession().setAttribute("userid", userid);

        resStr = gtSdk.getResponseStr();

        PrintWriter out = response.getWriter();
        out.println(resStr);

    }

    @RequestMapping("/VerifyLoginServlet")
    protected void VerifyLoginServlet(HttpServletRequest request,
                          HttpServletResponse response) throws ServletException, IOException {

        GeetestLib gtSdk = new GeetestLib(GeetestConfig.getCaptcha_id(), GeetestConfig.getPrivate_key());

        String challenge = request.getParameter(GeetestLib.fn_geetest_challenge);
        String validate = request.getParameter(GeetestLib.fn_geetest_validate);
        String seccode = request.getParameter(GeetestLib.fn_geetest_seccode);

        //从session中获取gt-server状态
        int gt_server_status_code = (Integer) request.getSession().getAttribute(gtSdk.gtServerStatusSessionKey);

        //从session中获取userid
        String userid = (String)request.getSession().getAttribute("userid");

        int gtResult = 0;

        if (gt_server_status_code == 1) {
            //gt-server正常,向gt-server进行二次验证

            gtResult = gtSdk.enhencedValidateRequest(challenge, validate, seccode, userid);
            System.out.println(gtResult);
        } else {
            // gt-server非正常情况下,进行failback模式验证

            System.out.println("failback:use your own server captcha validate");
            gtResult = gtSdk.failbackValidateRequest(challenge, validate, seccode);
            System.out.println(gtResult);
        }




        if (gtResult == 1) {
            // 验证成功
            PrintWriter out = response.getWriter();
            Map<String,Object> data = new HashMap<String, Object>();
            try {
                data.put("status", "success");
                data.put("version", gtSdk.getVersionInfo());
            } catch (Exception e) {
                e.printStackTrace();
            }

            JsonSerializer json = new JsonSerializer();
            out.println(json.serialize(data.toString()));
        }
        else {
            // 验证失败
            Map<String,Object> data = new HashMap<String, Object>();
            try {
                data.put("status", "fail");
                data.put("version", gtSdk.getVersionInfo());
            } catch (Exception e) {
                e.printStackTrace();
            }
            PrintWriter out = response.getWriter();
            JsonSerializer json = new JsonSerializer();
            out.println(json.serialize(data.toString()));
        }


//
//        if (gtResult == 1) {
//            // 验证成功
//            PrintWriter out = response.getWriter();
//            JSONObject data = new JSONObject();
//            try {
//                data.put("status", "success");
//                data.put("version", gtSdk.getVersionInfo());
//            } catch (JSONException e) {
//                e.printStackTrace();
//            }
//            out.println(data.toString());
//        }
//        else {
//            // 验证失败
//            JSONObject data = new JSONObject();
//            try {
//                data.put("status", "fail");
//                data.put("version", gtSdk.getVersionInfo());
//            } catch (JSONException e) {
//                e.printStackTrace();
//            }
//            PrintWriter out = response.getWriter();
//            out.println(data.toString());
//        }

    }

 

Java中关于selenium处理极验滑动验证码的示例

Java中关于selenium处理极验滑动验证码的示例

本篇文章主要介绍了java selenium处理极验滑动验证码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题,我按照这思路去大概实现了一下。

1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过)

我用的是java,我首先先想到了用直接用htmlunit,我做了点初始化


private void initWebClient() {
    if (webClient != null) {
      return;
    }
    webClient = new WebClient(BrowserVersion.FIREFOX_24);
     webClient.getOptions().setProxyConfig(new ProxyConfig("127.0.0.1",8888));
    webClient.getOptions().setActiveXNative(true);
    webClient.getOptions().setUseInsecureSSL(true); // 配置证书
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setCssEnabled(true);
    webClient.setCssErrorHandler(new SilentCssErrorHandler());
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    CookieManager cookieManager = new CookieManager();
    List<org.apache.http.cookie.Cookie> httpCookies = client.getCookies();//其方式获取的cookie
    for (org.apache.http.cookie.Cookie cookie : httpCookies) {
      cookieManager.addCookie(new com.gargoylesoftware.htmlunit.util.Cookie(cookie));
    }
    webClient.setCookieManager(cookieManager);
  }
登录后复制

初始化代理,cookie..然后就能正常调用了

立即学习“Java免费学习笔记(深入)”;


HtmlPage page = webClient.getPage("http://www.qixin.com/login");//企信宝
gePageInfor(page);
登录后复制

下面就是我获取图片,还原图片并且模拟拖拽,(这里我觉得是有些问题的,可能是拖拽我模拟的不对导致触发的js并没有生成正确的轨迹,还请大家帮忙看看哪里错了)


private void gePageInfor(HtmlPage page) {
    String[] img_slice={"p", "class", "gt_cut_fullbg_slice"};
    String[] img_bg_slice={"p", "class", "gt_cut_bg_slice"};
    Htmlpision p = (Htmlpision) page.getElementById("captcha");
    int deCAPTCHA = 0;
    try {
      byte[] img_slice_binary = client.get(getImgUrl(img_slice, p, true)).getBinary();//获取图片byte
      byte[] img_bg_slice_binary = client.get(getImgUrl(img_bg_slice, p, false)).getBinary();
      //获取还原后的图片
      BufferedImage geetestImg = ImgTest.getGeetestImg(img_slice_binary, ImgTest.imgArray);
      BufferedImage geetestImg2 = ImgTest.getGeetestImg(img_bg_slice_binary, ImgTest.imgArray);
      //获得图片移动位置(目前还有问题,需改用第三方图片识别)
      deCAPTCHA =ImgTest.deCAPTCHA(geetestImg,geetestImg2);
      System.out.println(deCAPTCHA);
    } catch (IOException | FetchException e) {
      e.printStackTrace();
    }
    Htmlpision p_slider_knob = get_p_slider_knob(page,"gt_slider_knob gt_show");//获取要移动p
    HtmlPage mouseOver = (HtmlPage) p_slider_knob.mouseOver();
    HtmlPage mouseDownPage = (HtmlPage)p_slider_knob.mouseDown();
    p_slider_knob = get_p_slider_knob(mouseDownPage,"gt_slider_knob gt_show moving");
    mouseMoveX(deCAPTCHA, p_slider_knob, mouseDownPage);
    HtmlPage newPage =(HtmlPage)p_slider_knob.mouseOver();
//    newPage =(HtmlPage)p_slider_knob.mouseDown();
    System.out.println(newPage.asXml());
    p = (Htmlpision)newPage.getElementById("captcha");
    HtmlElement htmlElement = p.getElementsByAttribute("p", "class", "gt_slice gt_show moving").get(0);
    System.out.println(htmlElement);
    newPage =(HtmlPage)p_slider_knob.mouseUp();//触发js,轨迹没有生成
    System.out.println("---------------");
    System.out.println(newPage.asXml());    
    if (newPage.getElementById("captcha")!=null) {//错误重试
      //gePageInfor(newPage);
    }
  }

  private void mouseMoveX(int deCAPTCHA, Htmlpision p_slider_knob, HtmlPage mouseDown) {
    MouseEvent mouseEvent = new MouseEvent(p_slider_knob, MouseEvent.TYPE_MOUSE_MOVE, false, false, false, MouseEvent.BUTTON_LEFT);
    mouseEvent.setClientX( mouseEvent.getClientX()+((deCAPTCHA!=0)?deCAPTCHA:99));  //移动x坐标
    ScriptResult scriptResult = mouseDown.getDocumentElement().fireEvent(mouseEvent);
  }
  private Htmlpision get_p_slider_knob(HtmlPage page,String classString) {
    return (Htmlpision)(((Htmlpision) page.getElementById("captcha")).getElementsByAttribute("p", "class", classString).get(0));
  }

  private String getImgUrl(String[] img_slice, Htmlpision p, boolean isNeedCheckPostion) {
    String url ="";
    int[] postion = new int[2];
    boolean empty = p.getElementsByAttribute(img_slice[0],img_slice[1],img_slice[2]).isEmpty();
    if (p.hasChildNodes() && !empty) {
      List<HtmlElement> elementsByAttribute = p.getElementsByAttribute(img_slice[0],img_slice[1],img_slice[2]);  
      for(int i = 0;i<elementsByAttribute.size();i++){
        Htmlpision p_img = (Htmlpision)elementsByAttribute.get(i);
        String style = p_img.getAttribute("style");
        String[] imge_url_position = style.split(";");
        if(StringUtils.isBlank(url)){//确认url
          url = StringUtils.replacePattern(imge_url_position[0], ".*\\(", "").replace(")", "");
        }
        if (isNeedCheckPostion) {//确认图片切割postion,两张图切割方式一样 background-position: -157px -58px
//          String[] positionS = StringUtils.split(StringUtils.remove(imge_url_position[1], "px").replace("-", "").replaceAll(".*:", ""), null);
          String[] positionS = StringUtils.split(StringUtils.removePattern(imge_url_position[1], "[^\\d+ \\s]"),null);
          postion[0] = Integer.parseInt(positionS[0]);
          postion[1] = Integer.parseInt(positionS[1]);
          int[] is = ImgTest.imgArray[i];
          if (is[0]!=postion[0]||is[1]!=postion[1]) {
            logger.debug("更新分割postion");
            ImgTest.imgArray[i] = postion;
          }
          System.out.println(ImgTest.imgArray);
          isNeedCheckPostion= false;
        }
      }
    }
    return url;
  }
登录后复制

对比图片获取位移方法(deCAPTCHA)是错的我就不放代码了,下面是其中还原图片用的方法,目前是其实审查元素后你就明白怎么还原这个图片了,这里是每次读的10px,58px


public static BufferedImage getGeetestImg(byte[] binary, int[][] imgArray) throws IOException {
    BufferedImage img = ImageIO.read(new ByteArrayInputStream(binary));
    List<BufferedImage> list = new ArrayList<>();
    for (int i=0;i< imgArray.length;i++) {  
      BufferedImage subimage = img.getSubimage(imgArray[i][0], imgArray[i][1], 10, 58);
      list.add(subimage);
//      ImageIO.write(subimage, "jpg", new File("d:\\image\\imgs"+i+".jpg"));
    }
    BufferedImage mergeImageUp = null;
    BufferedImage mergeImageDown = null;
    int mid = list.size()>>>1;
    for (int i = 0; i <mid-1 ; i++) {
      mergeImageUp = mergeImage(mergeImageUp==null?list.get(i):mergeImageUp, list.get(i+1), true);        
    }
    for(int i = mid;i<list.size()-1;i++){
      mergeImageDown = mergeImage(mergeImageDown==null?list.get(i):mergeImageDown,list.get(i+1), true);
    }
    img = mergeImage(mergeImageUp, mergeImageDown, false);
    return img;
  }
   public static BufferedImage mergeImage(BufferedImage img1,
        BufferedImage img2, boolean isHorizontal) throws IOException {
      int w1 = img1.getWidth();
      int h1 = img1.getHeight();
      int w2 = img2.getWidth();
      int h2 = img2.getHeight();
      // 从图片中读取RGB
      int[] ImageArrayOne = new int[w1 * h1];
      ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
      int[] ImageArrayTwo = new int[w2 * h2];
      ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);

      // 生成新图片
      BufferedImage DestImage = null;
      if (isHorizontal) { // 水平方向合并
        DestImage = new BufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB);
        DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
        DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
      } else { // 垂直方向合并
        DestImage = new BufferedImage(w1, h1 + h2,
            BufferedImage.TYPE_INT_RGB);
        DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
        DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
      }

      return DestImage;
    }
登录后复制

2.使用selenium

后来我想着是我模拟鼠标这个动作哪里有问题,我就又找到了selenium(2.42.2),他也能操作htmlunit关键他的鼠标动作好像封装比较完全

但是我尝试了以后发现了这个,HtmlUnitMouse这个动作没有实现


 public void mouseMove(Coordinates where, long xOffset, long yOffset) {
  throw new UnsupportedOperationException("Moving to arbitrary X,Y coordinates not supported.");
 }
登录后复制

好吧,于是调用chrome吧


System.setProperty("webdriver.chrome.driver","C:\\chromedriver.exe");
    Proxy proxy = new Proxy(); 
    //设置代理服务器地址 
    proxy.setHttpProxy("127.0.0.1:8888"); 
//    DesiredCapabilities capabilities = DesiredCapabilities.htmlUnitWithJs();
    DesiredCapabilities capabilities = DesiredCapabilities.chrome(); 
    capabilities.setCapability(CapabilityType.PROXY, proxy);
//    final WebDriver driver = new HtmlUnitDriver(capabilities);   
    WebDriver driver = new ChromeDriver(capabilities);
    driver.get("http://www.qixin.com/login");
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
     checkPage(driver,"return $(&#39;.gt_cut_fullbg_slice&#39;);");
    // 获取 网页的 title
    System.out.println("1 Page title is: " + driver.getTitle());
    // 通过 id 找到 input 的 DOM
    String pageSource = driver.getPageSource();
    System.out.println(pageSource);
    org.openqa.selenium.JavascriptExecutor executor = (org.openqa.selenium.JavascriptExecutor)driver;
    boolean equals = executor.executeScript("return document.readyState").equals("complete");
    int moveX =99;//移动位置
    if (equals) {
      WebElement element = driver.findElement(By.className("gt_slider_knob"));//(".gt_slider_knob"));
      Point location = element.getLocation();
      element.getSize();
      Actions action = new Actions(driver); 
      //       action.clickAndHold().perform();// 鼠标在当前位置点击后不释放
//       action.clickAndHold(element).perform();// 鼠标在 onElement 元素的位置点击后不释放
//       action.clickAndHold(element).moveByOffset(location.x+99,location.y).release().perform(); //选中source元素->拖放到(xOffset,yOffset)位置->释放左键
       action.dragAndDropBy(element, location.x+moveX,location.y).perform();
//      action.dragAndDrop(element,newelement).perform();
      pageSource = driver.getPageSource();
    }
    //更新cookie
    Set<org.openqa.selenium.Cookie> cookies = driver.manage().getCookies();
    Set<Cookie> cookies2 = new HashSet<>();
    for (org.openqa.selenium.Cookie cookie : cookies) {
      cookies2.add((Cookie) new Cookie(cookie.getDomain(), cookie.getName(), cookie.getValue(), cookie.getPath(), cookie.getExpiry(), true));
    }
    for (Cookie cookie : cookies2) {
      org.apache.http.cookie.Cookie httpClient = cookie.toHttpClient();
    }
    System.out.println(pageSource);
登录后复制

这样提交的表单确实是有轨迹的,这里移动位置我先写了个固定值,可以由上面图片还原,以及一些开源的图片识别工具识别出位置。以上应该就能解决这个滑动验证码了

以上就是Java中关于selenium处理极验滑动验证码的示例的详细内容,更多请关注php中文网其它相关文章!

今天关于Thinkphp极验滑动验证码实现步骤解析极验滑动验证码破解接口的介绍到此结束,谢谢您的阅读,有关95行代码极验滑动验证码?是远远不够的!大牛石锤!、Java selenium处理极验滑动验证码示例、Java 介入极验滑动验证码、Java中关于selenium处理极验滑动验证码的示例等更多相关知识的信息可以在本站进行查询。

本文标签: