python识别极验4滑块验证码实战

闲得无聊,趁着休息研究了一下极验4滑块验证码的安全性,是否有机器识别、自动化拖拽的可能性。首先看一下效果

 如何识别验证码

1、下载图片

下载图片可以参考博客《采集极验4滑块验证码图片数据》

 2、标记图片

3、标记滑动距离

 

实现代码

__author__ = "dengxinyan"import io
import re
import time
import json
import base64
import random
import requests
import urllib
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ChromeOptions
from selenium.webdriver import FirefoxOptions# PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)return base64_str# 验证码识别接口
def shibie(img):url = "http://www.detayun.cn/openapi/verify_code_identify/"data = {# 用户的key"key":"nWrzPFUgFuqXQrCJJUM6",# 验证码类型"verify_idf_id":"23",# 样例图片"img_base64":PIL_base64(img),"img_byte": None,# 中文点选,空间语义类型验证码的文本描述(这里缺省为空字符串)"words":""}header = {"Content-Type": "application/json"}# 发送请求调用接口response = requests.post(url=url, json=data, headers=header)print(response.text)return response.json()def run(headless=False):# 保存已经下载过的图片,防止重复img_url_list = []# 配置参数option = FirefoxOptions()if headless:option.add_argument('--headless')else:option.add_argument('--window-size=100,100')driver = webdriver.Firefox(executable_path=r'webdriver\geckodriver.exe', options=option)# 伪装浏览器driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => false,});")navigator_webdriver = driver.execute_script("return navigator.webdriver")driver.execute_script("Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5],});")plugins_length = driver.execute_script("return navigator.plugins.length")# 发送请求driver.get('https://www.geetest.com/adaptive-captcha-demo')# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//button[contains(text(),"一点即过验证")]'))# 创建 ActionChains 对象action = ActionChains(driver)# 向窗口发送按键事件,例如向下滚动 1000pxaction.send_keys([Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN, Keys.DOWN], 1000)action.perform()for i in range(5):# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//button[contains(text(),"一点即过验证")]'))# 找到【滑动拼图验证】元素tag1 = driver.find_element_by_xpath('//button[contains(text(),"一点即过验证")]/..')# 点击tag1.click()time.sleep(1)# 等待【滑动拼图验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//button[contains(text(),"滑动拼图验证")]'))# 找到【滑动拼图验证】元素tag1 = driver.find_element_by_xpath('//button[contains(text(),"滑动拼图验证")]/..')# 点击tag1.click()time.sleep(1)# 等待【点击按钮开始验证】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[@aria-label="点击按钮开始验证"]'))# 找到【点击按钮开始验证】元素tag2 = driver.find_element_by_xpath('//div[@aria-label="点击按钮开始验证"]')# 点击tag2.click()# 等待【验证码大图】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[contains(@class,"geetest_bg")]'))while 1:try:# 找到【注册】元素tag7 = driver.find_element_by_xpath('//div[contains(@class,"geetest_bg")]')# 获取 img 标签的 src 属性style = tag7.get_attribute('style')# 提取图片链接img_url = re.findall('url[(]"(.+?)"[)]', style)[0]breakexcept:continue# 请求获取图片response = requests.get(url=img_url)img = Image.open(BytesIO(response.content))# img = base64_PIL(base64_str)# 保存图片img.save('temp_img/{}.jpg'.format(int(time.time() * 1000)))img_url_list.append(img_url)# 验证码识别接口result = shibie(img)if result['code'] != 200:print(result)returnmove_x = int(result['data']['res_str'].replace('滑动', '').replace('px', ''))print('结果:', move_x)time.sleep(2)# 找到滑块 geetest_btn# 等待【找到滑块】元素出现WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[contains(@class,"geetest_btn")]'))# 找到【找到滑块】元素tag8 = driver.find_elements_by_xpath('//div[contains(@class,"geetest_btn")]')[1]print(tag8)# 滑动滑块action = ActionChains(driver)action.click_and_hold(tag8).perform()# 计算实际滑动距离 = 像素距离 + 前面空白距离move_x = move_x - 15action.move_by_offset(move_x, 0)# n = (random.randint(3, 5))# move_x = move_x / n# for i in range(n):#     action.move_by_offset(move_x, 0)#     time.sleep(0.02)action.release().perform()# 判断是否滑动成功time.sleep(2)if __name__ == '__main__':run(headless=False)

极验4滑块验证码识别我也封装成了API接口,可以提供给大家免费调用:得塔云

总结

1、和极验3相比,极验4大图反爬能力变弱了。因为极验3图片链接很快就会失效。

2、和极验3相比,极验4图片的解析难度变小了。因为极验3的图片是打乱的,还需要拼图。

3、极验4滑动过程也没有验证滑动轨迹

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

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

相关文章

【C++】C++11

文章目录 C111. 统一的列表初始化1.1 {}初始化 2. 声明2.1 auto2.2 decltype2.3 nullptr 3. 右值引用和移动语义3.1 左值引用和右值引用3.2 左值引用与右值引用比较3.3 右值引用使用的场景和意义3.4 完美转发 4. 可变参数模板5. lambda表达式5.1 函数对象与lambda表达式 6. 线程…

STM32入门之创建工程模板

1.STM32固件库的结构图如下。从图中可以看出,我们在配置STM32的固件库时需要配置用户层、CMSIS层的文件。配置库文件即正确的配置这些函数的文件。CMSIS(Cortex Microcontroller Software Interface Standard)是ARM公司提供的微控制器软件接口标准,所有使…

macos M1安装多个版本jdk

1、安装jdk 8 到 oracle 官网 https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 找到 macOS x64 DMG Installer 后面的下载链接下载安装包 java的jdk 都安装在以下目录 ls /Library/Java/JavaVirtualMachines/jdk-1.8.jdk jdk-1…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前,我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写,由王立柱和刘志红翻译。全书通俗易懂,内容丰富,是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

C++初探

目录 经典开头 — C的历史 作用域运算符 using的用法 命名空间 - namespace 命名空间的基本使用 特殊的命名空间 - 无名命名空间 全部展开和部分展开 std — C所有的标准库都在std命名空间内 省缺值 - 默认参数 占位参数 内联函数 - inline 函数重载 函数重载的用…

【Unity2D】相机移动以及设置相机边界

添加相机 添加相机时,首先需要在unity中添加 Cinemachine 包 第一次使用这个包时,需要在Package Manager中搜索并安装 安装Camera Mechine包后,添加2D Camera 设置跟随对象为Ruby (从Hierarchy中将Ruby拖动到Follow中&#xff0…

kafka 2.1.1 java的消费者客户端如何获取数据源码

KafkaConsumer 一、kakfa消费者暴露给业务系统获取数据的方法1 首先从缓冲区队列取数,没有数据则请求服务端来获取数据1.1循环从队列中取数,给到空或者已被提取的nextInLineRecords(1)当nextInLineRecords的数据被提取时,就把nextInLineRecor…

c函数学习

函数的概念 函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定义函数的参数和返回值 函数的分类 从定义角度分类:库函数(c库实现的),自定义函数&…

一、大数据技术之Flume(简介)

第1章 Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。 1.2 Flume基础架构 Flume组成架构如下图所示。 1.2.1 Agent Agent是一个JVM进程&…

微信小程序23__flex布局 相关的3种居中: 水平居中_垂直居中_水平垂直居中

3 种居中方式, 在页面布局中经常用到, 现作一记录。 第一种 水平居中 类似这样写法 display: flex; flex-direction: column; //垂直布局 align-items: center; // 水平居中 justify-content: space-a…

NLP实战8:图解 Transformer笔记

目录 1.Transformer宏观结构 2.Transformer结构细节 2.1输入 2.2编码部分 2.3解码部分 2.4多头注意力机制 2.5线性层和softmax 2.6 损失函数 3.参考代码 🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有&#…

vue 路由守卫

全局路由守卫 beforeEach 路由跳转前触发to 代表 到那个页面去from 代表从哪个页面来next 表示放行 beforeResolve 表示 组件解析后触发的钩子 afterEach 表示路由跳转完成之后i触发的钩子 全局路由钩子执行顺序 beforeEach > beforeResolve>afterEach 局部路由…

在外远程NAS群晖Drive - 群晖Drive挂载电脑磁盘同步备份【无需公网IP】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

【Hadoop 01】简介

目录 1 Hadoop 简介 2 下载并配置Hadoop 2.1 修改/etc/profile 2.2 修改hadoop-env.sh 2.3 修改core-site.xml 2.4 修改hdfs-site.xml 2.5 修改mapred-site.xml 2.6 修改yarn-site.xml 2.7 修改workers 2.8 修改start-dfs.sh、stop-dfs.sh 2.9 修改start-yarn.sh、s…

Elemui表单合并

原代码形式 <template><el-table:data"tableData"borderstyle"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-columnprop"name"label…

TC3XX - MCAL知识点(十):ICU EB-tresos配置说明与代码浅析

目录 1、概述 2、EB-tresos配置 2.1、实验目标 2.2、MCU配置 2.2.1、McuGtmTimAllocationConf 2.2.2、GtmClusterConf 2.2.3、McuClockSettingConfig 2.3、ICU配置 2.3.1、IcuOptionalApis

leetcode 399. 除法求值

给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题&#xff0c;其中 queries[j]…

Java: 转换流

转换流 1.定义 是字符流和字节流之间的桥梁。 分为&#xff1a; 字符转换输入流&#xff08;InputStreamReader&#xff09;字符转换输出流&#xff08;OutputStreamWrite&#xff09; 2.作用 1.作用1:指定字符集读写 在jdk11时&#xff0c;这种方式被淘汰了。 案例1&…

.NET各版本支持的操作系统

借助虚拟机和测试机&#xff0c;检测各版本操作系统对.NET的支持情况。 安装操作系统后&#xff0c;实测安装相应运行时并能够运行星尘代理为通过。 测试平台&#xff1a;VMware Workstation 镜像来源&#xff1a;MSDN I Tell You 参考&#xff1a; .NET Framework 版本和…

WebGL 概念和基础入门

WebGL 概念和基础入门 WebGL 是什么 对于 WebGL 百度百科给出的解释是 WebGL 是一种 3D 绘图协议&#xff0c;而对此维基百科给出的解释却是一种 JavaScript API。由于 WebGL 技术旨在帮助我们在不使用插件的情况下在任何兼容的网页浏览器中开发交互式 2D 和 3D 网页效果&…