破译滑块验证间距 破译sf顺丰滑块验证

废话不多说直接开干!

在这里插入图片描述

from selenium import webdriver
# 导入配置
from selenium.webdriver.chrome.options import Options
import time
from PIL import Image
# 导入动作链
from selenium.webdriver.common.action_chains import ActionChains
import random, string
# 定义计算移动距离的函数
def get_difference(image1,image2):"""循环每一个点,计算出对应的像素值"""# 外层循环循环长度for i in range(image1.width):# 内层循环循环宽度for j in range(image1.height):# 找出缺口if not is_similar(image1,image2,i,j):return i# 定义找出缺口位置的函数
def is_similar(image1,image2,x,y):# 计算RGB值pixel1 = image1.getpixel((x,y))pixel2 = image2.getpixel((x,y))# 设置一个容差范围,设置30位容差范围if abs(pixel1[0] - pixel2[0]) >30 and abs(pixel1[1] - pixel2[1]) > 30 and abs(pixel1[2] - pixel2[2])>30:return Falsereturn True# 定义获取运动轨迹函数
def get_tracks(distance):"""v = v0+atx = v0t+1/2at**2"""# 定义存放运动轨迹的列表tracks = []# 定义初速度v = 0# 定义单位时间t = 0.5# 定义匀加速运动和匀减速运动的分界线mid = distance * 4/5# 定义当前位移current = 0# 为了一直移动,定义循环while current < distance:if mid > current:a = 2else:a = -3v0 = v# 计算位移x = v0 * t + 1/2*a*t**2# 计算滑块当前位移current += x# 计算末速度v = v0+a*ttracks.append(round(x))return tracks# 实例化Options对象
options = Options()# 启动开发者模式
options.add_experimental_option('excludeSwitches',['enable-automation'])
options.add_experimental_option('useAutomationExtension',False)# 2. 调用浏览器
driver = webdriver.Chrome(executable_path=r'D:\chorme\Chrome\Application\chromedriver.exe',options=options)# 将webdriver属性干掉
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'}
)# 最大化窗口
driver.maximize_window()# 3. 请求
driver.get(url='https://www.sf-express.com/we/ow/chn/sc/waybill/waybill-detail/SF1638641302904')# 出现滑块验证码
# 发现:每一个滑块移动的距离都是不同的,差距也比较大,所以,不能够写一个固定的移动距离
# 思路:将移动距离计算出来
# 核心:
# 1. 找出无缺口的图片
# 2. 使用有缺口的图片和无缺口的图片做对比
# 目的:获取移动的距离(确定缺口位置)# 休眠,等待验证码加载
time.sleep(3)# 截图,获取有缺口图片
driver.switch_to.frame('tcaptcha_iframe')
# elements = driver.find_element_by_xpath('//*[@id="tcWrap"]')
driver.save_screenshot('quekou.png')# 找到图片
# driver.switch_to.frame('tcaptcha_iframe')
element = driver.find_element_by_xpath('//*[@id="tcWrap"]')# 获取图片位置
# loaction:获取元素位置
# size:获取元素大小
print(element.location)
print(element.size)# 计算截图范围
left = element.location['x']
right = element.location['x'] + element.size['width']
top = element.location['y']
bottom = element.location['y'] + element.size['height']# 打开图片
im = Image.open('quekou.png')
# # 开始局部截图
im = im.crop((left+502,top+150,right+502,bottom+150))
im.save('quekou_jubu.png')# 执行js,显示无缺口图片
# driver.execute_script('document.getElementsByClassName("geetest_canvas_fullbg")[0].style="display:block"')
driver.find_element_by_xpath('//*[@id="slideBlock"]')
#
# # 截取无缺口图片
driver.save_screenshot('wuque.png')
#
im = Image.open('wuque.png')
# 开始局部截图
im = im.crop((left+560,top+710,right,bottom))
# im.save('wuque_jubu.png')# 将两张图片进行对比,计算移动距离
# wuque_jubu = Image.open('wuque_jubu.png')
# quekou_jubu = Image.open('quekou_jubu.png')
# distance = get_difference(wuque_jubu,quekou_jubu)
# 142 150 155ua_list = [  142,150, 155,160]for ii in ua_list:distance = ii# 获取滑块huakuai = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')ActionChains(driver).click_and_hold(on_element=huakuai).perform()ActionChains(driver).move_by_offset(xoffset=(distance+54)*0.8,yoffset=0).perform()tracks = get_tracks((distance+54)*0.2)for track in tracks:ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()time.sleep(1)# 释放鼠标ActionChains(driver).release().perform()time.sleep(5)try:status = driver.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[2]/div[3]/div[2]/div/div[2]/div/ul[1]/li[1]/span').texttime = driver.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[2]/div[3]/div[2]/div/div[2]/div/ul[1]/li[3]/span').textcontent = driver.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[2]/div[3]/div[2]/div/div[2]/div/ul[1]/li[4]/span').textprint(status,time,content)driver.quit()breakexcept Exception:passprint('succ')

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

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

相关文章

雷达电子箔条干扰和雷达诱饵简介

一、JAMMING 利用箔条、角反射器和诱饵进行机械干扰。 1、箔条(Chaff) 箔条是一种雷达干扰,在这种干扰中,飞机或其他目标散布一团薄薄的铝、金属化玻璃纤维或塑料,它们要么作为一组主要目标出现在雷达屏幕上,要么以多次回击淹没屏幕。 图1 箔条 2、箔条的雷达散射截面…

linux系统中三个重要的结构体

第一​&#xff1a;struct inode结构体 struct inode { struct hlist_node i_hash; struct list_head i_list; /* backing dev IO list */ struct list_head i_sb_list;​ //主次设备号 dev_t i_rdev;​ struct list_head i_devices; //用联合体是因为该…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果&#xff0c;话不多说&#xff0c;先来看看视频效果吧&#xff1a;链接 在这里具体的代码就不放出来了&#xff0c;还是利用了uniapp的 uni.createAnimation 方法&#xff0c;因为cover-view 不支持一些css 的动画效果&#xff0c;所以这…

如何使用百度“云一朵”来分析PDF文件

PDF 文件是一种常见的文件格式&#xff0c;用于存储文档、图像和其他内容。在许多情况下&#xff0c;我们需要对 PDF 文件进行分析&#xff0c;以提取其中的信息。百度“云一朵”提供了一个 PDF 分析 API&#xff0c;可以帮助我们轻松地对 PDF 文件进行分析。 在本博客文章中&…

基于Java的企业人事管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

进程互斥的软件实现方法,硬件实现方法以及互斥锁

1.进程互斥的软件实现方法 1.单标志法 1.算法思想: 两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。 也就是说每个进程进入临界区的权限只能被另一个进程赋予。 2.例子 因此&#xff0c;该算法可以实现“同一时刻最多只允许一个进程访问临界区”。 3.主要…

Polygon Mide状态模型:解决状态膨胀,而不牺牲隐私和去中心化

1. 引言 前序博客有&#xff1a; Polygon Miden&#xff1a;扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型Polygon Miden交易模型&#xff1a;Actor模式 ZKP &#xff1e; 并行 隐私 在Polygon Miden交易模型&#xff1a;Actor模…

定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容是51单片机中的定时器以及按键控制LED流水灯模式&定时器时钟&#xff0c;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&#xff01;&#xff01; 定时器 按键控制LED流水灯模式 定时器时钟 源代…

微服务技术栈-Docker应用部署

文章目录 前言一、数据卷二、Docker 应用部署1、MySQL部署2、Tomcat部署3、Nginx部署4、Redis部署5、Kafka部署 总结 前言 之前文章讲到过&#xff0c;docker运行程序的过程就是去仓库把镜像拉到本地&#xff0c;然后用一条命令把镜像运行起来变成容器&#xff0c;接下来我们将…

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

vue 使用 创建二维数组响应数据 渲染 echarts图标

目前我遇到的情况就是用动态的二维数组数据渲染echarts图标&#xff0c;我们从后端收到的接口一般是个一维数组&#xff0c;需要手动构建并且保证响应式。接下来我做了个案例 一、案例总逻辑 1. 先创建一个vue项目 2. 添加 echarts依赖 3. 模拟数据请求&#xff0c;构建二维数组…

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言&#xff1a; 在数字时代&#xff0c;数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒&#xff08;以下简称DevicData病毒&#xff09;是这场战斗中的新敌人&#xff0c;它能够以毁灭性的方式加密您的数据&#xff0c;迫使您在数据和时间之间做出艰难的选择…

59. 螺旋矩阵 II

题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1a;n …

基于SpringBoot的房屋租赁管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 屋主管理 房屋信息管理 房屋租赁公告 租用订单管理 房屋信息管理 保洁管理 房屋信息 租用订单管理 取消订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 互联网发展至今&#xff0c;无论是其理论还是…

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…

OpenWrt使用Privoxy插件修改UA

OpenWrt使用privoxy修改UA 1.安装privoxy插件 SSH连接到路由器 更新插件列表 update opkg安装插件 opkg install privoxy luci-app-privoxy luci-i18n-privoxy-zh-cn重启路由器 2.配置privoxy 打开配置页面 文件和目录 访问和控制 转发 杂项 日志 编辑配置 浏览器打开 …

代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作思路思路2代码 72. 编辑距离思路代码 583. 两个字符串的删除操作 Leetcode 思路 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。递推公…

云原生Kubernetes:简化K8S应用部署工具Helm

目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…

volatile关键字使用总结

先说结论 1. volatile关键字可以让编译器层面减少优化&#xff0c;每次使用时必须从内存中取数据&#xff0c;而不是从cpu缓存或寄存器中获取 2. volatile关键字不能完全禁止指令重排&#xff0c;准确地说是两个volatile修饰的变量之间的命令不会进行指令重排 3. 使用volati…

常用Redis界面化软件

对于Redis的操作&#xff0c;前期有过介绍【Centos 下安装 Redis 及命令行操作】。而在Redis的日常开发调试中&#xff0c;可使用可视化软件方便进行操作。 本篇主要介绍Redis可视化的两款工具&#xff1a;Redis Desktop Manager和AnotherRedisDesktopManager。 1、Redis Desk…