抖音小店、巨量登入,滑动验证码识别

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

抖音旗下很多平台都用的是这个验证方式,包括巨量,抖店等平台,均可以使用下面这种方式。

涉及工具技术

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

开始

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

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

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

分析

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

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

我们先将缺口图片下载下来,通过简单的图像变换看一下有什么特征可以利用。下面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')

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

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

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

滤波

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

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

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

结果

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

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

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

切图

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

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

控制浏览器

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

拟合

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

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

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

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

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

假设 二元一次方程

𝑦=𝑎𝑥+𝑏y=ax+b

或者 二元二次方程

𝑦=𝑎𝑥2+𝑏𝑥+𝑐y=ax2+bx+c

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

控制浏览器

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

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

 

源码

本文代码已上传至github,欢迎交流与star。

未完待续...

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: Java自动,首先需要了解录机制。一般而言,平台的录可以通过发送POST请求的方式进行。 在Java中实现自动的过程如下: 1. 导相关的库文件:Java的网络请求一般使用第三方库,例如Apache的HttpClient库。 2. 创建HttpClient对象:HttpClient是Java中处理HTTP请求的核心类,可以通过HttpClientBuilder来创建一个HttpClient对象。 3. 创建HttpPost对象:HttpPost是HttpClient中用于发起POST请求的类,需要传录接口的URL。 4. 设置请求参数:录接口可能需要传递用户名和密码等参数,可以使用NameValuePair存储参数,并将其添加到请求对象中。 5. 执行请求:调用HttpClient对象的execute方法,传HttpPost对象,即可执行请求。 6. 处理返回结果:根据请求的返回结果,进行相关的处理。一般而言,录接口会返回一个表示录成功与否的结果,可以通过解析返回的JSON数据或者检查返回的HTTP状态码来判断录是否成功。 7. 获取录后的相关信息:如果录成功,可以通过发送其他的请求获取的相关数据,例如用户信息、广告资源等。 需要注意的是,在自动之前,需要确保已经获得了录所需的账号和密码,并且对应的录接口的URL和参数等信息已经清楚。另外,由于平台可能会对录进行安全验证,例如要求使用验证码等,因此在实现自动录时需要考虑这些额外要求。 ### 回答2: Java自动是指使用Java编程语言来实现自动平台的功能。 是一家拥有庞大流的移动广告平台,广告主可以通过该平台投放广告。为了提高操作效率和用户体验,可以使用Java编写一个自动的程序来进行操作。 首先,需要使用Java的网络编程库,如HttpClient或OkHttp,来实现模拟录的功能。通过发送HTTP请求,可以模拟用户在浏览器中输用户名和密码进行录的操作。 其次,需要分析平台的录接口和参数,了解录所需的参数和请求方式。根据录接口的要求,使用Java代码构建录请求,设置相应的请求头和请求体参数。 然后,发送录请求,并获取服务器返回的响应。根据响应的内容进行判断,如果录成功,可以继续进行后续操作;如果录失败,则需要根据返回的错误信息进行处理或重新录。 最后,将上述代码打包成可执行的Java程序,可以通过命令行或其他方式运行程序,实现自动平台的功能。 需要注意的是,自动平台可能涉及到验证码、录频率限制等问题,需要针对具体情况进行处理,如使用OCR技术识别验证码,设置录间隔时间等。 总之,使用Java编写自动的程序需要掌握Java网络编程、HTTP请求的发送与接收、参数设置等相关知识,以及对平台录接口的了解和分析能力。 ### 回答3: Java 自动是指使用 Java 编程语言实现自动网站的功能。是一个新闻资讯类的网站,用户可以通过该网站获取最新的新闻、热点话题等信息。 要实现自动网站,首先需要解析网页的录表单,获取录需要的参数,如用户名、密码等。然后使用 Java 的 HTTP 请求库,如 HttpClient 或 HttpURLConnection,构建 POST 请求,将录参数以表单形式提交给网站的录接口。 接着需要处理录过程中的一些异常情况,如录失败、验证码等。对于录失败的情况,可以根据返回的错误信息进行判断,如密码错误、用户名不存在等。对于需要验证码的情况,可以使用第三方的验证识别库,如Tesseract-OCR,对验证码进行自动识别并填充到录表单中。 在录成功之后,可以通过检查录响应中的 Cookie 或 Session ID,将其保存在本地,以便后续的请求使用。这样可以保持会话的持续性,避免每次请求都需要重新网站。 最后,可以通过 Java 的 HTML 解析库,如 Jsoup,对网站的页面进行解析,获取所需要的新闻信息,并进行相应的处理,如展示在界面上或保存到本地。 总之,通过使用 Java 编程语言以及相关的网络请求和解析库,可以实现自动网站的功能,从而方便用户获取最新的新闻资讯。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sajor_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值