Selenium 破解腾讯滑动验证

发表于:2019-7-19 10:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Quan.Zhou    来源:博客园

  什么是Selenium
  WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API,能以最佳的方式与浏览器进行交互。
  支持的浏览器:
  Mozilla Firefox
  Google Chrome
  Microsoft Internet Explorer
  Opera
  Safari
  Apple iPhone
  Android browsers
  如何破解呢?
  1.  破解思路/方案
  首先我也是在网上找了很多破解滑动验证的文章,主要看了下Github上面滑动验证破解学习的代码(python):https://github.com/dzhongyi/crack-geetest
  代码虽然是python的,但是思路很明确,于是我就去看了下菜鸟教程的语法,大致思路如下
  1.找到滑动验证码的原图与出现缺块凹槽的验证码图片
  2.两张图片循环进行像素点对比,然后找到像素点色差比较大点就能
  确定缺块凹槽的位置,计算偏移度
  3.根据计算的偏移度将滑块移动到缺块凹槽处
  如何找到对应的原图和凹槽图呢?
  F12看了下QQ控件滑动验证的对应的图片,去查找元素里面去找这个图片地址
  凹槽图很容易被我们找到,
  凹槽图查找元素直接在页面上可以找到
  同样【Network】中也能找到请求的地址图片
  
  然后我们目前只能看到凹槽图,有人会发现【Network】中还有一个地址后面index=2的图片,其实它不是原图,它是滑块
  于是大家回去【source】去找,也会发现都没有看到原图的地址呢?
  难道没法找到原图的地址吗?
  其实不是的,大家可以试试把上面那么长的地址后面index=1改为index=0,你就会发现这个图就是原图哦!
  那么接下来就是对比像素得到缺块凹槽的位置
  代码如下:
   1   /// <summary>
  2
  3         /// 比较两张图片的像素,确定阴影图片位置
  4
  5         /// </summary>
  6
  7         /// <param name="oldBmp"></param>
  8
  9         /// <param name="newBmp"></param>
  10
  11         /// <returns></returns>
  12
  13         public static int GetArgb(Bitmap oldBmp, Bitmap newBmp)
  14
  15         {
  16
  17             //由于阴影图片四个角存在黑点(矩形1*1)
  18
  19             for (int i = 0; i < newBmp.Width; i++)
  20
  21             {
  22
  23
  24
  25                 for (int j = 0; j < newBmp.Height; j++)
  26
  27                 {
  28
  29                     if ((i>=0&&i<=1)&&((j>=0&&j<=1)||(j>= (newBmp.Height-2)&&j<=(newBmp.Height - 1))))
  30
  31                     {
  32
  33                         continue;
  34
  35                     }
  36
  37                     if ((i >= (newBmp.Width-2) && i <= (newBmp.Width - 1)) && ((j >= 0 && j <= 1) || (j >= (newBmp.Height - 2) && j <= (newBmp.Height - 1))))
  38
  39                     {
  40
  41                         continue;
  42
  43                     }
  44
  45
  46
  47                     //获取该点的像素的RGB的颜色
  48
  49                     Color oldColor = oldBmp.GetPixel(i, j);
  50
  51                     Color newColor = newBmp.GetPixel(i, j);
  52
  53                     if (Math.Abs(oldColor.R - newColor.R) > 60 || Math.Abs(oldColor.G - newColor.G) > 60 || Math.Abs(oldColor.B - newColor.B) > 60)
  54
  55                     {
  56
  57                         return i;
  58
  59                     }
  60
  61
  62
  63
  64
  65                 }
  66
  67             }
  68
  69             return 0;
  70
  71         }
  72
  73
  其中细心的同学会发现为啥比较像素点的时候,出现continue跳出的情况的呢?
  在凹槽图的四个角,有四个黑点,如果每个单位点去判断,会导致导致像素会0的时候跳出循环,得到的偏移量自然就是0了,所以这肯定是有问题的,那么我是把这四个角的理解成1*1的矩形块,所以在这个块里的像素点直接跳出,不用比较
  那么我们计算出了偏移量,如何移动滑块呢?
  不用急,了解Selenium就知道,它提供的有Actions这个类,下面有很多可以移动的方法
  你可以直接调用DragAndDropToOffset移动元素到一定的偏移量
  或者你可以使用ClickAndHold鼠标左键单击并不松开,然后MoveByOffset移动一定的偏移量,最后Release释放即可
  然后中途我遇见一些bug
  在使用PhantomJS+Selenium的时候,iframe中Actions对象所有的移动相关的方法都对元素不起任何作用,很痛苦呀,我在stackoverflow中发现很多人也都遇到这样的情况,但是也都没有明确的答案,最后还是放弃了PhantomJS+Selenium,选择了Chrome+ Selenium形式进行测试,发现也还是没有效果,于是换了其他电脑的Chrome浏览器试了试,发现居然可以了,可以肯定的是这个可能跟Chrome版本有关,高版本反而没法玩,哎……,最近Selenium.Chrome.WebDriver这个组件更新到了2.35,貌似解决了这个问题
  其实破解验证码是进行爬虫系列操作的第一步也是最为关键的一步
  源码:https://github.com/0zhouquan0/QQ_LoginTest
  效果图:

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号