opencv 识别微信登录验证滑动块位置


Posted in Javascript onAugust 07, 2018

目标

识别微信登录新账号,需要拖动滑块验证时,目标块相对于图片的位置

前提相关信息:

  • 滑块与目标位置的距离是随机的,且在一定范围内,设其最大最小值为[min, max]
  • 滑块滑到距离目标左右10个单位的误差内也可以通过验证
  • 每次的滑块验证码有三次重试的机会,如果三次验证不过,微信会自动换验证码
  • 可以无限次数刷新验证码
  • 应用机器学习应该能达到出色的识别率,但考虑到时间+学习成本,不采用机器学习的方式

相关图片信息

截图 - 通过android自带的截图工具截取验证的界面,在代码中为screenshot.jpg

opencv 识别微信登录验证滑动块位置

opencv 识别微信登录验证滑动块位置

opencv 识别微信登录验证滑动块位置

三种方案

1.随机拖动

基本思路:

每次验证码的三次重试机会,分别采用min + 10, (min + max)/2, max - 10三个位置进行拖动。

若不通过,则刷新验证码,重复上述过程

优点:

  • 单张验证码通过率下等
  • 不用截图、下载图片与滑块图
  • 不需要加入python-opencv层
  • 因为可以无限重试,试的次数多了就能过

缺点:

  • 判断的位置是根据min、max推断出来的大致范围
  • min、max的值如果变化得很明显,那么程序也要响应修改min与max的值

2.根据颜色识别图片目标位置 (我打算采用这个方案)

基本思路:

根据目标位置的颜色的规律性(一般都是灰黑灰黑的),制定一个颜色范围

opencv 识别微信登录验证滑动块位置

从图片中用inRange将图片转换成黑白图,白色部分为原图中符合颜色范围的区域

用findContours找出所有轮廓,根据轮廓所涉及的元素点的最多的几项判断目标位置的大致范围

代码实现

# 读取截图
screenshot = cv2.imread('screenshot.jpg')
# 筛选出符合颜色区间的区域
inRange = cv2.inRange(screenshot, np.array([90, 90, 90]), np.array([115, 115, 115]))
# 从图中找出所有的轮廓
_, cnts, _ = cv2.findContours(inRange.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对所有轮廓做排序,排序依据是每个轮廓包含的点的数量
cnts.sort(key=len, reverse=True)
# 取前两个轮廓(有些图片目标位置不一定是第一个轮廓)
for cnt in cnts[0: 2]:
  xSum = 0
  xCounter = 0
  for position in cnt:
    xCounter += 1
    xSum += position[0][0]
  # 算出所有点的X坐标平均值,并在此基础上做一个60像素的偏移,这个偏移可以根据自己手机进行调整
  x = int(xSum / xCounter - 60)
  # 在截图上画一条红线,表示识别的x坐标位置
  cv2.line(screenshot, (x, 0), (x, 500), (0, 0, 255), 5)
cv2.imshow("screenshot", screenshot)
cv2.waitKey(0)

优点:

  • 单张验证码通过率中等
  • 不用下载图片与滑块图

缺点:

  • 判断的位置仍然是大致范围,较第一种随机位置范围精确性有较大提升
  • 需要加入python-opencv层
  • 需要截图
  • 根据滑块识别目标位置

基本思路:

滑块与目标位置的区别在于,目标位置加了一层灰黑色透明前景色,图片处理时先给滑块图片加上相同的灰黑色透明前景色

opencv 识别微信登录验证滑动块位置
opencv 识别微信登录验证滑动块位置

用处理过的滑块去匹配目标位置

代码实现:

# 读取滑块图片,并给其加上相同的灰黑色透明前景色,再进行灰化
block = cv2.imread('block.jpg')
blockCopy = block.copy()
w, h = block.shape[:-1]
cv2.rectangle(blockCopy, (0, 0), (w, h), (47, 47, 47), -1)
cv2.addWeighted(blockCopy, 0.7, block, 0.3, 0, block)
block = cv2.cvtColor(block, cv2.COLOR_RGB2GRAY)
# 读取验证码图片,并灰化
captcha = cv2.imread('captcha.jpg')
captchaGray = cv2.cvtColor(captcha, cv2.COLOR_RGB2GRAY)
# 寻找captcha中匹配block的位置
res = cv2.matchTemplate(captchaGray, block, cv2.TM_SQDIFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 在最符合的画一个矩形
cv2.rectangle(captcha, min_loc, (min_loc[0] + w, min_loc[1] + h), (0, 0, 255), -1)
cv2.imshow('block', block)
cv2.imshow("captcha", captcha)
cv2.waitKey(0);

优点:

  • 单张验证码通过率高
  • 如果判断成功,位置一般很精确

缺点:

  • 需要加入python-opencv层
  • 需要下载原图、滑块图(原图、滑块图的下载还没研究)
  • 判断不成功的时候,判断的位置一般偏离目标位置较大

总结

三种方案中第二种拥有不错的验证率,且较第三种只需要对验证界面进行截图,开发较容易。
综上所述,第二种方案是我认为较好的方法。

Javascript 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
Dec 08 Javascript
javascript中使用正则计算中文长度的例子
Apr 29 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
如何动态加载外部Javascript文件
Dec 02 Javascript
Spring MVC中Ajax实现二级联动的简单实例
Jul 06 Javascript
正则表达式替换html元素属性的方法
Nov 26 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
Jul 12 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
详解HTML5 使用video标签实现选择摄像头功能
Oct 25 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
vue和小程序项目中使用iconfont的方法
May 19 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 #Javascript
深入浅析var,let,const的异同点
Aug 07 #Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 #Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 #Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 #Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 #Javascript
js实现图片上传并预览功能
Aug 06 #Javascript
You might like
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
PHP 实现重载
2021/03/09 PHP
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python微元法计算函数曲线长度的方法
2018/11/08 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
岗位竞聘演讲稿
2014/01/10 职场文书
探亲假请假条
2014/04/11 职场文书
保密工作责任书
2014/04/16 职场文书
中药学专业求职信
2014/05/31 职场文书
就业意向书
2014/07/29 职场文书
商品陈列协议书
2014/09/29 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
Pandas数据结构之Series的使用
2022/03/31 Python