基于Python实现的滑动验证码自动识别工具源码

滑动验证码识别

今天的目标地址是字节的巨量纵横,目前东家是一家广告营销型的公司,专注于在各大平台投放信息流广告。巨量纵横为字节跳动的广告平台,用于管理推广账户。今天破解一下这个平台的登陆入口,为今后的数据爬取开个头。

涉及工具技术

  • selenium
  • pandas
  • numpy
  • opencv
  • Pillow
# python 库安装
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

开始

-w377

滑动验证码就是上图这种东西,验证方式就是用鼠标拖动到缺口阴影位置松手即可。

逻辑比较简单,目前要处理的核心问题就是怎么找到这个阴影位置,因为可能有不同的图片而且图片中缺口阴影的位置也不确定。

问题可以简化为:如何找到背景图中缺口的准确位置

分析

首先通过浏览器检查工具,看一下能获得哪些信息。

-w1131

首先可以获得滑块和缺口图片的链接,还可以获取滑块图片的高度

我们先将缺口图片下载下来,通过简单的图像变换看一下有什么特征可以利用。下面Python代码可用于下载图片。

from urllib import requestimg = 'https://p6-catpcha.byteimg.com/tos-cn-i-188rlo5p4y/7fcb5c88410943579af133942e8f9249~tplv-188rlo5p4y-2.jpeg'request.urlretrieve(img, './img.jpg')

将图片保存下来之后,使用较为通用的处理方法先观察一下图片特点,首先灰度处理,再手动调整阈值观察二值化后的图片。

-w945

通过观察可以发现带缺口图片附近有一圈白色痕迹,我们就是要获取到白色方框的左半部分距离整个图片左边的距离。

通过观察二值化后的图片特征,我想到一个办法,就是通过这张二值化后的图片,遍历每一个像素点,找到连续的、在垂直方向均为白色的位置。理论上是可行的,可能验证码图片样本不够,可能会有些图片白色部分较多,比如这张银色的车,白色的色块就比较多。

-w376

滤波

因为我们只需要缺口的左边位置的坐标,所以可以通过具有提取边缘特征的水平梯度Prewitt卷积核来处理图片。通过测试我选取了下面这个3x3的卷积核。

⎡⎣⎢111000−2−2−2⎤⎦⎥[10−210−210−2]

通过opencv库处理原图,可以发现图片缺口左边部分的边缘被突出显示了出来。 

-w861

结果

有了如上的矩阵就简单了,按照之前的思路,找到垂直方向的白线就可以拿到缺口的坐标。

遍历图片每一个点,将白色点的x坐标存入一维数组中,再求该数列的众数就能得出缺口的坐标啦!

偷个懒,众数的不优雅表达 pd.Series(np.array(res_list)).mode()[0]

-w986

切图

为了更高的准确率,我们之前还能拿到滑块图片的高度,我们可以将验证码无用部分,也就是缺口部分上下方图片切除掉。

可以通过selenium库 img.value_of_css_property("top") 方法获取页面元素属性,拿到滑块图片的高度,通过后面测量,与原图大概是1.65倍(这个不知道是什么单位的倍数,下面会展示计算方法),滑块高度大约110像素。numpy切片的代码就不放了。切出来的图片类似这样,再进行上面的操作,脑补是能减少误判(没测过😊)

immg1

immg2

控制浏览器

核心难点突破之后就简单多了,使用selenium这个库来控制浏览器,使用代码的方式操纵鼠标键盘。

拟合

拟合: 形象的说,拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。

程序计算出的缺口位置,和页面上滑块移动的位置有偏差。拖动滑块位置并通过浏览器控制台可以看到滑块贴合缺口时对应的移动位置。

我收集了几组页面滑块位置与程序计算的位置。(可能有点多)

页面(y)程序(x)
246407
190315
221366
190316
97164
152255
241398
226374

不知道页面和程序输出的为啥相差这么多,可能两数是有什么关系,但是看不懂前端代码,也懒得分析,就假设几个未知数,解一下方程吧。

假设 二元一次方程

y=ax+b

或者 二元二次方程

y=ax2+bx+c

,我记得次方越高,拟合的就会越好。 最后按一元一次解得 a=1.65

控制浏览器

这部分要使用selenium库,控制浏览器,我使用的是Chrome,关于如何安装selenium以及Chrome控制器驱动程序chrome driver,可以参考百度或者csdn帖子。

需要查看自己电脑上的chrome版本和chrome driver的版本一致。

-w740

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word表格图片批处理参考程序

使用word写文档大概率是要图文并茂,要把图片表格的格式统一才能行文美观,使用批处理统一处理图片和表格是一个很好的方案,这里提供一段我自己使用的宏定义程序供大家参考。 ALTF11 宏 Sub ASIC表格样式()ASIC表格样式 宏For i 1 To Active…

Go 程序编译过程(基于 Go1.21)

版本说明 Go 1.21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程,Go1.21 版本可以看这个:https://github.com/golang/go/tree/release-branch.go1.21/src/cmd/compile 大致过程如下: 解析 (cmd/compile/internal/synt…

【数电笔记】06-码制

目录 说明: 二进制代码 1. 二 - 十进制码 2. 常用二 - 十进制代码表 2.1 例题 可靠性代码 1. 格雷码 2. 奇偶校验码 3. 8421奇偶校验码表 说明: 笔记配套视频来源:B站;本系列笔记并未记录所有章节,只对个人认…

SAP_ABAP_内表数据重复问题,解决思路

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读516次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!https://blog.csdn.net/j…

解决Mysql中出现的Too many connections问题

目录 一、背景二、解决办法三、解释四、参考 一、背景 公司有一张表,数据量是8万左右,然后关联使用的还有好几张表,处理一条数据都会多次和Mysql数据库交互,我的目的是从数据库中查询数据,进行数据整合之后就把数据放…

ESP32-Web-Server编程-简单的照片浏览器

ESP32-Web-Server编程-简单的照片浏览器 概述 从本节开始我们开始制作一些有趣的多媒体 Web 的示例。 当你希望在网页上展示一些广告、照片,或者你的开发板带摄像头,能够采集一些图片,这时你希望可以通过手头的浏览器查看图片,…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日,两市股指盘中弱势下探,午后止跌回升,沪指、创业板指翻红,北证50指数再度跳水。到收盘,沪指微涨0.07%报3031.64点,深成指跌0.07%报9720.57点,创业板指涨0.19%报1926.28点&#xf…

如何打印社保参保凭证

西安市: 陕西政务服务网: 个人服务 珠海市: 广东政务服务网: 用户登录 | 珠海市人力资源和社会保障网上服务平台 武汉市: 湖北政务服务网: 湖北政务服务网

vue: 线上项目element-ui的icon偶尔乱码问题

线上环境偶尔会复现, 具体: 一般使用不会出现这个问题,因为一般引入的是element-ui的css文件,问题出在于为了主题色变化啊,需要用到scss变量引入了scss文件。 import “~element-ui/packages/theme-chalk/src/index”…

python代码,要求选中XML中 <string> 标签中的文本并且将其首字母改为大写

当你说 "选中XML中 <string> 标签中的文本并且将其首字母改为大写" 时&#xff0c;我理解你是希望从一个XML文件中提取 <string> 标签中的文本&#xff0c;然后将每个字符串的首字母改为大写。 下面是一个简单的Python代码示例&#xff0c;使用xml.etre…

Python练习题(四)

本文主要是【Python】——Python练习题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff1a;狠狠沉淀&a…

Dockerfile build速度巨慢优化

通过Dockerfile创建容器的时候&#xff0c;有时候会遇到编译巨慢的情况&#xff0c;而docker run的方式却不会 跟踪定位下问题&#xff0c;注意到编译的时候日志打印 Sending build context to Docker daemon 7.188GB 为啥会这么大的文件&#xff0c;查了一下发现是log日志的…

调和阶段setState干了什么?

在React中&#xff0c;setState 是用来更新组件的状态的方法之一。 在React的生命周期中&#xff0c;setState 调用的时机对于组件的更新非常重要。通常&#xff0c;setState 调用会在组件的更新阶段之后触发&#xff0c;而不会立即生效。React会将多个 setState 调用合并成一…

图像语义分割算法(FCN/U-net)

Some definitions &#xfeff; 与目标检测不同&#xff0c;语义分割任务不但要对图片中的物体的位置和类别进行预测&#xff0c;还要精确地描绘出不同类物体之间的边界&#xff08;注意是不同类物体&#xff0c;而不是不同物体。若对同一类的不同物体也进行区分&#xff0c;则…

iptables防火墙之SNAT与DNET

NAT 1.SNAT&#xff1a;让内网可以访问外网 2.DNAT&#xff1a;让外网可以访问到内网的机器 网关服务器&#xff0c;要开启路由功能 内核功能&#xff1a; sysctl -a 列出所有参数 内核参数&#xff0c;然后grep可以查看到默认的内核参数 内核参数配置文件 /etc/sysctl.…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

L1-018:大笨钟

题目描述 微博上有个自称“大笨钟V”的家伙&#xff0c;每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律&#xff0c;所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的&#xff0c;如果正好在某个整点敲&#xff0c;那么“当”数就等于那个整点数…

Java笔记

md5加密 spring框架我我们提供了一个工具类DigestUtils 调用类中的md5digestAsHes对密码进行加密 但是要将密码转成bytes数组 password DigestUtils.md5DigestAsHex(password.getBytes()); 对象的属性拷贝 BeanUtils.copyProperties(有数据的对象&#xff0c;空对象)&#…

python毕业设计论文选题管理系统b615y

毕业论文管理方式效率低下&#xff0c;为了提高效率&#xff0c;特开发了本毕业论文管理系统。本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分&#xff0c;具体功能分析如下&#xff1a; &#xff08;1&#xff09;导师功能模块&#xff1a;…

微信小程序自定义数据实现级联省市区组件

前言 在微信小程序中&#xff0c;官方文档提供的省市区组件&#xff0c;可以让用户更加方便快捷地选择省市区&#xff0c;但是官方提供的组件有一个缺点&#xff0c;无法自定义数据&#xff0c;但如果项目中需要使用自己的数据&#xff0c;显然就得寻找其它的组件实现。 官方组…