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

Python 通过Playwright+OpenCV破解滑动验证码 实例

由于公司最近需要对接某业务系统,涉及到部分数据需要提交至其它平台业务系统,只有其它平台账户,没有接口,因此做此开发。首先通过OpenCV计算出验证验证码滑块距离,根据距离,使用 Playwright 利用滑动距离模拟登录

 下面展示Python  通过 Playwright 滑动及登录过程
  1. 首先下载 安装 Playwright
pip install playwright
  1. 安装浏览器驱动(此步骤会在本地安装二进制浏览器:火狐、谷歌等)
	python -m playwright install
  1. Playwright 录制脚本(通过脚本录制,不需要写代码,通过鼠标事件将代码输出到文件当中)
python -m playwright codegen -o "D:test.py"
  1. 主要代码展示
import re
from playwright.sync_api import Playwright, sync_playwright
import time
import random
from result  import error_result, success_result
from position import get_gap_positiondef perform_slide(page, max_retries=3):"""执行滑块验证,支持自动重试"""retry_count = 0while retry_count < max_retries:try:page.wait_for_selector("#circle", state="visible", timeout=2000)page.wait_for_selector("#bg_canvas", state="visible", timeout=2000)# 计算缺口位置try:image_data = page.evaluate("document.getElementById('bg_canvas').toDataURL('image/png').split(',')[1]")gap_x = get_gap_position(image_data)except Exception as e:print(f"缺口检测失败,使用默认偏移量: {e}")gap_x = 50  # 备用值# 模拟拖动slider = page.query_selector("#circle")slider_bbox = slider.bounding_box()start_x = slider_bbox["x"] + slider_bbox["width"] / 2start_y = slider_bbox["y"] + slider_bbox["height"] / 2target_x = start_x + gap_x + 8page.mouse.move(start_x, start_y)page.mouse.down()steps = random.randint(15, 30)for i in range(steps):x = start_x + (target_x - start_x) * (i / steps)y = start_y + random.uniform(-2, 2)page.mouse.move(x, y)#time.sleep(random.uniform(0.01, 0.02))page.mouse.up()# 检查成功if page.query_selector(".popup-success"):print("验证成功!")return Trueelse:retry_count += 1print(f"验证失败,第 {retry_count} 次重试...")time.sleep(0.5)except Exception as e:print(f"滑动过程中出错: {e}")retry_count += 1return Falsedef login_with_slide(username: str,password: str,login_url: str = "http://test.com/",max_slide_retries: int = 3
) -> dict:"""执行带滑块验证的登录,并返回登录接口的 JSON 数据"""with sync_playwright() as playwright:browser = playwright.webkit.launch(headless=True)context = browser.new_context()page = context.new_page()page.set_default_timeout(5000)login_response = Nonedef handle_response(response):nonlocal login_responseif "login2" in response.url and response.status == 200:try:print("登录接口响应:", response.json())login_response = login_result(response.json())except ValueError:return error_result("接口返回非json数据")page.on("response", handle_response)try:page.goto(login_url)page.get_by_role("textbox", name="请输入统一社会信用代码或身份证号").fill(username)page.get_by_role("textbox", name="请输入密码").fill(password)page.get_by_role("button", name="登录").click()if not perform_slide(page, max_slide_retries):return error_result("滑块验证失败")# 等待登录接口响应page.wait_for_timeout(500)  # 简单延迟,确保响应已捕获return login_response or  error_result("未获取到登录异常")except Exception as e:return  error_result("f登录异常: {}"+str(e))finally:page.close()context.close()browser.close()def login_result(response: dict) -> dict:if response.get("result")==0:return success_result("成功",response.get("data",{}).get("userDetail"))return error_result("登录失败,接口信息异常")
if __name__ == "__main__":result = login_with_slide(username="admin",password="hpg123789")print("最终结果:", result)
http://www.dtcms.com/a/318083.html

相关文章:

  • 【Python】命令行工具实现监控ctrl+c与运行时长终止任务
  • 2024学年云南省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书
  • FreeRTOS临界资源保护方法
  • 商派小程序商城(小程序/官网/APP···)的范式跃迁与增长再想象
  • android NDK 报错日志解读和还原报错方法名
  • Mybatis的高级特性
  • 【自动化运维神器Ansible】playbook核心组件之tags深度解析
  • 第一性原理科学计算服务器如何选择配置-CPU选择篇
  • thinkpad E14重装win 10系统
  • 云端软件工程智能代理:任务委托与自动化实践全解
  • Spring Boot Actuator 监控功能的简介及禁用
  • Java面试题036:一文深入了解VUE(1)
  • 批量提问程序开发方案:基于Python的百度文小言接口实现
  • 学习嵌入式之硬件——ARM体系
  • vue margin与padding对比
  • 用户体验设计中微投入设计:用户不知不觉付出的 3 种方式
  • 【24】C++实战篇——【 C++ 外部变量】 C++多个文件共用一个枚举变量,外部变量 extern,枚举外部变量 enum
  • Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!
  • 直播间自动发言工具的开发
  • OpenAI/gpt-oss开源模型部署与使用全指南
  • 三维偏序 -- cdq 套 cdq
  • 蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor
  • 【YOLOv8改进 - C2f融合】C2f融合EBlock(Encoder Block):低光增强编码器块,利用傅里叶信息增强图像的低光条件
  • 分类数据集 - 水稻叶病虫害分类数据集下载
  • Java面试宝典:Java内存模型与对象可达性判定原理
  • Python爬虫实战:研究spiderfoot工具,构建网络情报收集系统
  • java 之 继承
  • jdk动态代理如何实现
  • 【补题】Codeforces Round 779 (Div. 2) C. Shinju and the Lost Permutation
  • 【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good