APP爬虫过滑块验证码的一种思路, 从此不再依赖打码平台

本文介绍了一种避免依赖打码平台,通过分析APP逆向,利用Android WebView组件加载滑块验证码URL,并结合adb命令模拟滑动,实现代理服务器实时处理爬虫触发的滑块验证码的方法。
摘要由CSDN通过智能技术生成

每一个想学习的念头,都有可能是未来的你在向自己求救。 

       最近在学习 APP 逆向的道路上遇到一个 APP,当请求接口频繁的时候,会触发风控提示需要滑动验证码。验证码类型/风格类似下图: 

       经过分析发现,当触发风控后接口返回数据为空(因为一些原因这里就不再展示相应的数据)。但在返回的 response 的 headers 中发现有个可疑的参数,这个参数是一个 URL 地址,通过浏览器打开发现是一个滑块地址。于是开启抓包 -> 触发滑块会发现滑块成功后页面会生成一个新的 cookie ,复制出来尝试携带该 cookie 值继续请求,果然不出意外又可以拿到数据了。

       上面的操作确实已实现了过滑块的目的,但是作为一个程序员,我们大多时候希望将整个过程实现自动化。所以我们先想一下我们可能需要什么东西:

  • 一个浏览器加载 url;
  • selenium/uiautomator2 等自动化操作滑块并拦截 cookie 使用;

可能在平时的工作中我们使用 selenium/u2 这些自动化软件比较多,但考虑到使用 selenium 操作这种简单的滑块略显笨重,所以我决定直接使用 Android WebView 组件来加载滑块 url。

       关于 Android WebView 组件详细介绍请自行搜索,随手放一个链接 -> WebView 基本使用

       接下来需要大家安装 Android studio 软件并会简单的项目编译等操作,打开 Android studio 新建一个APP 项目,新建项目的时候没有什么特别的要求,之后在布局文件里直接添加一个 WebView 组件,因为我们只需要一个 WebView 组件,所以代码很简单,类似下面这样:

定义好组件之后,在 MainActivity.java 文件里通过 findViewById 方法绑定 WebView 视图,接下来我们就可以直接操作 WebView 组件了,我们主要会使用到WebView的loadUrl方法和事件监听 setWebChromeClient。loadUrl 方法主要是让 WebView 这个“小浏览器”加载我们的 url,webView.setWebChromeClient 主要是为通过 WebChromeClien 类的 onProgressChanged 方法监听URL页面是否已经加载完成,onProgressChanged 方法有两个参数,第一个参数是 webview 对象,第二个参数是一个 int 类型,代码着页面加载进度,可以判断当第二个参数值为100时页面已经加载完成,此时我们便可以做滑块操作了。

       期初对于操作滑块,自己想的过于复杂,想到 autoJs/u2 等,但是通过尝试发现通过 adb 命令的 `adb shell input swipe 123 1234 889 1234` 进行模拟滑动最方便。命令中的四个数字其实是两个坐标,在开发这模式中打开`指针位置`这个功能后,触摸屏幕就可以看到当前手指在屏幕上位置坐标。(不要说没有看到,在屏幕最上面显示)。通过 loadUrl 加载验证码地址之后,在 onProgressChanged 方法里执行adb命令,当滑块成功后可以通过 CookieManger 来获取当前页面 cookie。具体代码大致如下:

到这里,我们 url 加载,滑动滑块都已经实现,但是为了让我们 APP 能够实时加载爬虫传过来的滑块 url,所以需要让 APP 在手机上起一个服务让 WebView 的 loadUrl 通过api的方式暴露出去,我这里使用的是 AndroidAsync,当然你也可以使用 NanoHTTPD 这些,这个全看自己喜好。注册一个服务并监听 5600 端口:

在 LoadUrlHandlder 类中简单处理一下路由逻辑,解析 url 参数并调用 MainActivity 的静态方法 loadUrl 操作 WebView :

因为 Android UI 相关的方法都需要在主 UI 线程中进行调用。因此,在 MainActivity 类中的 loadUrl 方法中需要使用 post 方法,讲 WebView 的 loadUrl 操作转移到主线程中,示例代码如下:

      文中涉及到的验证码是我自己在局域网服务器上部署的一个 demo,当滑块成功后会模拟生成一个 cookie,请求测试:

不太会写文章,总感觉还需要补充很多,O(∩_∩)O哈哈~ 有问题可以随时沟通~ 最后放一个本人知识星球二维码日常分享爬虫/逆向/群控等骚操作.

 

以下是使用Airtest解决App滑块验证码问题的简单示例代码,具体实现需要根据具体应用进行调整: ```python from airtest.core.api import * from airtest.cli.parser import cli_setup # 初始化Airtest if not cli_setup(): auto_setup(__file__) # 截取屏幕 screen = snapshot() # 根据图像识别找到滑块验证码的位置 slider = Template(r"slider.png").match_in(screen) # 计算滑块的起点和终点 slider_start = (slider[0] + 20, slider[1] + 20) slider_end = (slider[0] + 300, slider[1] + 20) # 模拟用户滑动操作 touch(slider_start) swipe(slider_start, slider_end, duration=1) # 等待滑块验证码验证通过 wait(Template(r"success.png")) ``` 在这个示例代码中,我们首先使用`snapshot()`方法截取当前屏幕的图像,然后使用`Template()`方法创建一个用于匹配滑块验证码的模板,使用`match_in()`方法在屏幕图像中查找滑块验证码的位置。 接着,我们计算出滑块的起点和终点,然后使用`touch()`方法点击滑块的起点,使用`swipe()`方法模拟用户滑动操作,将滑块滑动到指定位置。 最后,我们使用`wait()`方法等待滑块验证码验证通过,使用`Template()`方法创建一个用于匹配验证通过的模板,当这个模板出现在屏幕上时,表示滑块验证码验证通过。 需要注意的是,这个示例代码只是一个简单的示例,实际应用中可能需要进行更多的调整和优化才能达到更好的效果。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

h1code2

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

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

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

打赏作者

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

抵扣说明:

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

余额充值