当前位置: 首页 > news >正文

滑块验证码之模拟人工滑速

前言

代码直接运行即可

此处是用的selenium模拟,主要记录的难点是如何 模拟人工滑速
具体原理和利用到的东西都有做注释,逻辑完整,小白还是可以尝试理解的

一、正常简单模拟滑动

目标网址:点击

import base64
import time
import ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import Bydef text_dis(bg, fg):slide = ddddocr.DdddOcr(det=False, ocr=False)with open(bg, 'rb') as f:target_bytes = f.read()with open(fg, 'rb') as f:background_bytes = f.read()res = slide.slide_comparison(target_bytes, background_bytes) # 计算出距离return res.get('target')[0]def get_slide():options = webdriver.ChromeOptions()# 对于老版本的浏览器不行options.add_argument('--disable-blink-features=AutomationControlled')driver = webdriver.Chrome(chrome_options=options)driver.maximize_window()driver.get('https://www.geetest.com/demo/slide-bind.html')driver.find_element(By.ID, 'username').send_keys('13697028751')  # 输入框输入账号和密码driver.find_element(By.ID, 'password').send_keys('19961227ai')time.sleep(2)driver.find_element(By.CSS_SELECTOR, 'div.btn').click()  # 点击登录time.sleep(2)img_src = driver.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");')print(img_src)im_base64 = img_src.split(',')[1]im_bytes = base64.b64decode(im_base64)print(im_base64)print(im_bytes)print('-----------------------------------')with open('./bg.png', 'wb') as f:f.write(im_bytes)temp = driver.execute_script("return document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/png');")print(temp)temp_base64 = temp.split(',')[1]temp_bytes = base64.b64decode(temp_base64)with open('./temp.png', 'wb') as f:f.write(temp_bytes)distance = text_dis('bg.png', 'temp.png')  # 计算出距离print('距离:', distance)# 拖动滑块slide = driver.find_element(By.CSS_SELECTOR, 'div.geetest_slider_button')action_chains = webdriver.ActionChains(driver)# 点击,准备拖拽action_chains.click_and_hold(slide)  # 鼠标左键点击但不释放action_chains.pause(0.2)action_chains.move_by_offset(distance - 10, 0)action_chains.pause(0.8)action_chains.move_by_offset(10, 0)action_chains.pause(1.4)action_chains.move_by_offset(-10, 0)action_chains.release()action_chains.perform()time.sleep(20)get_slide()

扩展

selenium常用模拟操作

1、行为控制
perform --- 执行所有准备好的Action
reset_actions --- 清空所有准备好的Action  #  该方法在 selenium 3.141.0版本不生效
pause --- 设置Action之间的动作时间间隔2、鼠标操作
click 

相关文章:

  • Navicat 技术指引 | GaussDB 数据查看器
  • virtualList 封装使用 虚拟列表 列表优化
  • 15.1 自动化黑屏监测系统
  • Windows power shell for循环
  • Vue2系列 — 渲染函数 (render + createElement)
  • 卷积神经网络(Inception V3)识别手语
  • 关于AssetBundle禁用TypeTree之后的一些可序列化的问题
  • ArgoWorkflow教程(一)---DevOps 另一选择?云原生 CICD: ArgoWorkflow 初体验
  • 音频采集的相关基础知识
  • 【数据结构初阶(4)】栈的基本操作实现
  • 【DevOps】Git 图文详解(七):标签管理
  • 基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码
  • 基于Springboot+Vue选课系统
  • PTA 海盗分赃
  • Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂
  • 4个实用的微服务测试策略
  • angular2开源库收集
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Centos6.8 使用rpm安装mysql5.7
  • Docker容器管理
  • Git学习与使用心得(1)—— 初始化
  • k个最大的数及变种小结
  • learning koa2.x
  • PaddlePaddle-GitHub的正确打开姿势
  • passportjs 源码分析
  • Python实现BT种子转化为磁力链接【实战】
  • Rancher-k8s加速安装文档
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 程序员该如何有效的找工作?
  • 从零开始在ubuntu上搭建node开发环境
  • 简单易用的leetcode开发测试工具(npm)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 树莓派 - 使用须知
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 用Python写一份独特的元宵节祝福
  • ​flutter 代码混淆
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​低代码平台的核心价值与优势
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (30)数组元素和与数字和的绝对差
  • (C++)八皇后问题
  • (备份) esp32 GPIO
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (三分钟)速览传统边缘检测算子
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)c52学习之旅-静态数码管
  • (正则)提取页面里的img标签
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)项目管理杂谈-我所期望的新人
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息