基于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 request

img = '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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 源码编译

一,虚拟机安装 ​ 1.1 进入https://cn.ubuntu.com/download中文官网下载iso镜像 1.2 这里我们下载Ubuntu 18.04 LTS 1.3虚拟VM机安装ubuntu系统,注意编译源码需要至少16G运行内存和400G磁盘空间,尽量设大点 二 配置编译环境 2.1 下载andr…

进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file

错误如下所示: FATAL CONFIG FILE ERROR (Redis 6.2.6) Reading the configuration file, at line 1 >>> include/myredis/redis.conf Bad directive or wrong number of arguments出现错误的原因是.conf文件中命令之间缺少空格,如下所示&…

Sharding-Jdbc(4):Sharding-Jdbc分库

1 新建数据库 创建ds_0数据库和ds_1数据库,在两个数据库新建表如下: CREATE TABLE t_order (order_id bigint(20) NOT NULL,user_id bigint(20) NOT NULL,PRIMARY KEY (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin; 2 新建maven项目…

GAMES101:作业2记录

总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣。所以这一次我们继续推进一步——在屏幕上画出一个实心三角形,换言之,栅格化一个三角形。上一次作业中,在视口变化之后&#xff0…

yolo.txt格式与voc格式互转,超详细易上手

众所周知,yolo训练所需的标签文件类型是.txt的,但我们平时使用标注软件(labelimage等)标注得到的标签文件是.xml类型的,故此xml2txt之间的转换就至关重要了,这点大家不可能想不到,但是网上的文章提供的代码大多数都是冗余,或者难看,难以上手,故此作者打算提供一个相对…

51单片机PWM讲解

前言 51单片机我已经很久没用过了,毕竟是十年前的产物了,但是由于工作室的学弟学妹需要学习,加之马上就要举行循迹小车比赛,很多人反映看不懂PWM,或者看了不会用,于是写一篇文章简单介绍一下。 PWM普遍应…

“B2B+OMS方案”,赋能家电巨头构建BC订单一体化能力,促进业务增长|徐礼昭

某国际知名家电电器品牌,年营收超过5000亿元。该电器企业其整体业务分三大类:线上线下B2B2C业务、线下B2B业务以及DTC零售业务。 随着业务的发展,该电器品牌对2B业务及DTC业务的数字化系统能力支撑需要更加全面和立体,以适应业务…

5个优质免费自然语言处理学习资源 | 语言技术导航

探索并利用我们的5个免费自然语言处理(NLP)学习资源,更有效地理解和实施自然语言处理技术。适合初学者和进阶者,涵盖基础理论到实际应用。 近年来,随着人工智能(AI)解决方案的商业应用&#xff…

前后端数据传输格式(上)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 作为后端,写…

springboot足球社区管理系统

springboot足球社区管理系统 成品项目已经更新!同学们可以打开链接查看!需要定做的及时联系我!专业团队定做!全程包售后! 2000套项目视频链接:https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekj…

【论文阅读】Bayes’ Rays:神经辐射场的不确定性量化

【论文阅读】Bayes’ Rays:神经辐射场的不确定性量化 1. Introduction2. Related work3. Background3.2. Neural Laplace Approximations 4. Method4.1. Intuition4.2. Modeling perturbations4.3. Approximating H4.4. Spatial uncertainty 5. Experiments & A…

多线程(初阶七:阻塞队列和生产者消费者模型)

一、阻塞队列的简单介绍 二、生产者消费者模型 三、模拟实现阻塞队列 一、阻塞队列的简单介绍 首先,我们都知道,队列是先进先出的一种数据结构,而阻塞队列,是基于队列,做了一些扩展,在多线程有就非常有意…

Task中Wait()和Result造成死锁

在使用Task的时候,一不留神就会造成死锁,而且难以发现,尤其是业务繁多的情况下,一个Task嵌套另一个Task的时候,下面就演示一下,在什么情况下,会产生Wait()和Result的死锁,因此&#…

Java系类 之 String、StringBuffer和StringBuilder类的区别

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…

07、基于LunarLander登陆器的强化学习案例(含PYTHON工程)

07、基于LunarLander登陆器的强化学习(含PYTHON工程) 开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 基于TENSORFLOW2.10 0、实践背景 gym的LunarLander是一个用于…

【论文 | 联邦学习】 | Towards Personalized Federated Learning 走向个性化的联邦学习

Towards Personalized Federated Learning 标题:Towards Personalized Federated Learning 收录于:IEEE Transactions on Neural Networks and Learning Systems (Mar 28, 2022) 作者单位:NTU,Alibaba Group,SDU&…

【设计模式-4.1】行为型——观察者模式

说明:本文介绍设计模式中行为型设计模式中的,观察者模式; 商家与顾客 观察者模式属于行为型设计模式,关注对象的行为。以商家与顾客为例,商家有商品,顾客来购买商品,如果商家商品卖完了&#…

go语言学习-并发编程(并发并行、线程协程、通道channel)

1、 概念 1.1 并发和并行 并发:具有处理多个任务的能力 (是一个处理器在处理任务),cpu处理不同的任务会有时间错位,比如有A B 两个任务,某一时间段内在处理A任务,这时A任务需要停止运行一段时间,那么会切换到处理B任…

DockerFile常用保留字指令及知识点合集

目录 DockerFile加深理解&#xff1a; DockerFile常用保留字指令 保留字&#xff1a; RUN&#xff1a;容器构建时需要运行的命令 COPY&#xff1a;类似ADD&#xff0c;拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 …

【动态规划】LeetCode-面试题 17.16. 按摩师

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…