python web自动化(验证码处理)

news2024/10/5 16:10:22

1.解决验证码问题的常⻅⼏种⽅式

1) Debug模式启动浏览器(浏览器复⽤):

原理:浏览器是有缓存记录的,只需要 沿⽤已经保存有登录记录的浏览器 进⾏后续的操作就⾏

2)识别法:

原理:对验证码的图⽚进⾏字符识别,其原理就是通过 识别算法解析图⽚ ,其解析的精准度取决于图⽚的复杂程度注: 精准度不⾼,如果图⽚越复杂,失败率越

3)接⼝法:

原理:开发⼈员提供⼀个测试接⼝,通过这个 接⼝获取 到图⽚验证码⽐如:在服务端提供⼀个可被客户端使⽤的接⼝,只要客户端传递过来⾃⼰的SessionID,该接⼝就返回此时正确的Session

注: 新增了接⼝,存在安全的问题,⼀般只在测试环境使⽤

4)移除法:

跟开发协商,在测试的时候,直接 关闭验证码功能

5)暗号法:

跟开发协商,提供 万能验证码 来进⾏访问(只建议在测试环境使⽤,涉及到安全问题)

6) Cookie跳过验证码:

原理:⼿动登录,然后获取登录成功的cookie,在⽤代码做后续操作的时候,把 cookie附带 进去,已达到鉴权的⽬的

注: cookie是有过期时间的,可以跟开发协商延⻓时间等

2.Debug模式启动浏览器(浏览器复⽤)

        1.在桌⾯ 右键点击 google浏览器,然后选择 属性

        2.复制 ⽬标 ⾥⾯的路径, 不要包含chrome.exe ,示例: C:\Program Files (x86)\Google\Chrome\Application\

        3.把复制的 路径配置到系统环境变量 Path中

        4.在D盘下⾯,新建⼀个txt⽂本,输⼊内容: chrome.exe --remote-debugging-port=9222 ,然后保存后并修改⽂件名字(包括后缀名)为: chrome.bat (出现提示信息, 同意即可 )

        5.如果配置成功,双击chrome.bat⽂件,会打开⼀个新的浏览器窗⼝

                具体的操作步骤:
                1)先运⾏代码,确保不会出 Chrome正受到⾃动测试软件的控制。 提示:
                

                2)⼿动进⾏登录的操作,然后上述代码注释,在运⾏后续的⽤例代码
                

# driver.get("https://cart.taobao.com/cart.htm")
#
# driver.find_element_by_id('fm-login-id').send_keys('自己的淘宝账号')
# driver.find_element_by_id('fm-login-password').send_keys('自己的淘宝密码')
# driver.find_element_by_xpath("//div[@class='fm-btn']").click()

        3)浏览器复⽤模式下:如果需要切换窗⼝,需要特殊处理:

                1.在⻚⾯上,点击回到第⼀个窗⼝

                2.运⾏窗⼝切换代码

3.Cookie跳过验证码

                ⼿动打开浏览器进⾏登录操作,然后登录成功后打开F12(开发者⼯具)获取cookie值
                操作路径: F12打开开发者⼯具--->Application--->cookies

                注: 登录时有勾选下次⾃动登录的请勾选,浏览器提示是否保存⽤户密码时请选择确定,这样获取的cookie成功登陆的机率⽐较⾼
                

""""""
import time

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("http://novel.hctestedu.com/")
time.sleep(3)

# 通过已经获取到登录成功的cookie完成后续的操作(不是固定的,每一个项目都是不一样,可以跟开发咨询,实在不行的话:一个个的去试)
driver.add_cookie({"name": "Authorization",
                   "value": "eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2OTc2MzQyNzIsInN1YiI6IntcImlkXCI6MTcwNTQ3Njk3MDgzMzAyMjk3NixcInVzZXJuYW1lXCI6XCIxNzc5ODk4OTg5OFwiLFwibmlja05hbWVcIjpcIjE3Nzk4OTg5ODk4XCJ9IiwiY3JlYXRlZCI6MTY5NzAyOTQ3Mjg0NX0.ZBv7-MntLdEqB48a9ErhkKt9-3RgD-XtA5oNqUQ8qdScnxVnjq6BFCcqIrKhSD94DccYPzebCu650Ql92OoqEw"})

# 刷新当前页面
driver.refresh()
time.sleep(5)

"""
cookie有时间限制的,这个时间是开发设置的,可以和开发协商(加长)
"""

4.JS处理⽅案

        滑动解锁问题使⽤ActionChains功能,⽤⿏标按住滑块并移动
                

ActionChains(driver)\
.click_and_hold(slider_button)\
.move_by_offset(delta_x,0)\
.perform()

         我们有一个处理验证码滑动的网页

        

""""""
import time

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get(r"E:\Python\pythonProjects\Webtest0524\day6\04 JS处理方案\验证码样例.html")

# 定位到滑动按钮
button=driver.find_element(By.CLASS_NAME,"captcha-slider")


# 定位滑动条
button_tiao=driver.find_element(By.CLASS_NAME,"captcha-container")

# 获取滑动条的宽度
wide=button_tiao.size["width"]


# 模拟拖动滑动条
# ActionChains(driver).click_and_hold(button).move_by_offset(wide,0).perform()


# 加一些步骤,使滑动的效果慢一些
action = ActionChains(driver)
action.click_and_hold(button).perform()
while True:
    try:
        action.move_by_offset(5, 0).perform()
    except:
        print("超出移动的范围之外了!")
        break
    time.sleep(0.1)

# 释放所有的actions,不然鼠标一直都是按住的状态
ActionBuilder(driver).clear_actions()

   5.OpenCV 图像预处理:灰度化和⼆值化

                1)图像⼆值化基本原理:

        对灰度图像进⾏处理,设定阈值,在阈值中的像素值将变为1(⽩⾊部分),阈值为的将变为           0(⿊⾊部分)

                2)图像⼆值化处理步骤

                        1.先对彩⾊图像进⾏去噪:

             

//img为原图
cv.pyrMeanShiftFiltering(image, 10, 100)

                我们的原图是这个                

                去完噪之后就变成如下: 可以明显的发现背景变得模糊


                        2.先对彩⾊图像进⾏灰度化

                        

# 对图片进行灰度处理
grayscale_picture = cv.cvtColor(denoised_picture, cv.COLOR_BGR2GRAY)
cv.imwrite("grayscale_picture.png", grayscale_picture)

//img为原图, imgGray为灰度图
cvtColor(img, imgGray);

                        

                        3.对灰度图进⾏⼆值化

                        

# 对图像进行二值化处理(管道符 |)
threshold_value, binary_picture = cv.threshold(grayscale_picture, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
print("获取的阙值: ", threshold_value)
cv.imwrite("binary_picture.png", binary_picture)


//imgGray为灰度图, result为⼆值图像
//100~255为阈值,可以根据情况设定
//在阈值中的像素点将变为0(⽩⾊部分),阈值之外的像素将变为1(⿊⾊部分)。
threshold(imgGray, result, 100, 255, CV_THRESH_BINARY)

                
                        

6.OCR图像识别

                原理:(Optical Character Recognition,光学字符识别)技术,将图⽚、照⽚上的⽂字                    内容,直接转换为⽂本

                

# 使⽤opencv读取图像(cv.imread)之后是BGR格式的,使⽤PIL读取图像(Image.open))之后是RGB格式的。
image = Image.open(file_name)
# 运⾏tesseract对图⽚进⾏OCR识别
img_str = pytesseract.image_to_string(image)

        tesseract库安装与配置环境变量(识别字幕)_tesseract ocr环境变量-CSDN博客

                这时图像识别配置的网址

        

               识别到了验证码

实战:

我们用这个网站进行实战训练

        

""""""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import cv2 as cv
import pytesseract
from PIL import Image

driver = webdriver.Chrome()

driver.get("http://120.25.127.201:18001/user/register.html")

# 准备测试数据
username = "181665852331"
password = "123456"

# 输入注册信息
driver.find_element(By.ID,"txtUName").send_keys(username)
driver.find_element(By.ID,"txtPassword").send_keys(password)

"""
对验证码进行处理
"""

# 保存验证码的截图
driver.find_element(By.ID,"chkd").screenshot("verification_code.png")

# 原图
master_drawing = cv.imread("verification_code.png")
# print("原图: ", master_drawing)

# 对图片进行去噪处理
denoised_picture=cv.pyrMeanShiftFiltering(master_drawing,10,100)


# 对图片进行灰度处理
gry_picture=cv.cvtColor(denoised_picture,cv.COLOR_BGR2GRAY)
cv.imwrite("gray_picture.png",gry_picture)

# 对图像进行二值化处理(管道符 |)
binary_picture=cv.threshold(gry_picture,0,255,cv.THRESH_BINARY)
cv.imwrite("binary_picture.png",binary_picture)

# 使用PIL打开图像转化为图像对象,并使用pytesseract进行图像识别
captcha_picture = Image.open(binary_picture)
verification_code = pytesseract.image_to_string(captcha_picture)

# 输入验证码
driver.find_element(By.ID,"TxtChkCode").send_keys(verification_code)

# 点击登录按钮
driver.find_element(By.ID,"btnRegister").click()

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

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

相关文章

pycharm中,出现SyntaxError: Non-ASCII character ‘\xe4‘ in file... 的问题以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 在pycharm中,使用python中编写中文字符时,会提示如下错误信息: SyntaxError: Non-ASCII character \xe4 in file ...... on line 8, but no encoding declared; see http://python.org/dev…

网上比较受认可的赚钱软件有哪些?众多兼职选择中总有一个适合你

在这个互联网高速发展的时代,网上赚钱似乎成了一种潮流。但是,你是否还在靠运气寻找赚钱的机会?是否还在为找不到靠谱的兼职平台而苦恼? 今天,就为你揭秘那些真正靠谱的网上赚钱平台,让你的赚钱之路不再迷…

MySQL--InnoDB体系结构

目录 一、物理存储结构 二、表空间 1.数据表空间介绍 2.数据表空间迁移 3.共享表空间 4.临时表空间 5.undo表空间 三、InnoDB内存结构 1.innodb_buffer_pool 2.innodb_log_buffer 四、InnoDB 8.0结构图例 五、InnoDB重要参数 1.redo log刷新磁盘策略 2.刷盘方式&…

S1E45:单链表1 课后作业

测试题:0. 相比起数组来说,单链表具有哪些优势呢? 答:长度非固定,可以申请添加长度 答案:对于数组来说,随机插入或者删除其中间的某一个元素,都是需要大量的移动操作,而…

基于tcp实现自定义应用层协议

认识协议 协议(Protocol) 是一种通信规则或标准,用于定义通信双方或多方之间如何交互和传输数据。在计算机网络和通信系统中,协议规定了通信实体之间信息交换的格式、顺序、定时以及有关同步等事宜的约定。简易来说协议就是通信…

网络工程师---第三十八天

ISIS: ISIS含义:中间系统到中间系统IS-IS。 ISIS特点:①内部网关协议IGP(Interior Gateway Protocol),用于自治系统内部; ②IS-IS也是一种链路状态协议,使用最短路径优先SPF算法进…

电子阅览室在管理时需注意什么

关于如今的绝大多数人来说,想必都听说过“电子阅览室”这一概念。它首要运用在校园中,给学生们供给愈加丰厚的常识储藏。它也是一个独立的局域网,在校园网络中作为重要的一个组成部分而存在。但是,一个好的电子阅览室是需求满意运…

python文件IO基础知识

目录 1.open函数打开文件 2.文件对象读写数据和关闭 3.文本文件和二进制文件的区别 4.编码和解码 读写文本文件时 读写二进制文件时 5.文件指针位置 6.文件缓存区与flush()方法 1.open函数打开文件 使用 open 函数创建一个文件对象,read 方法来读取数据&…

Docker学习(4):部署web项目

一、部署vue项目 在home目录下创建项目目录 将打包好的vue项目放入该目录下,dist是打包好的vue项目 在项目目录下,编辑default.conf 内容如下: server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {r…

[JAVASE] 类和对象(六) -- 接口(续篇)

目录 一. Comparable接口 与 compareTo方法 1.1 Comparable接口 1.2 compareTo方法的重写 1.2.1 根据年龄进行比较 1.2.2 根据姓名进行比较 1.4 compareTo 方法 的使用 1.3 compareTo方法的缺点(重点) 二. Comparator接口 与 compare方法 2.1 Comparator接口 2.2 compare 方法…

使用AWR对电路进行交流仿真---以整流器仿真为例

使用AWR对电路进行交流仿真—以整流器仿真为例 生活不易,喵喵叹气。马上就要上班了,公司的ADS的版权紧缺,主要用的软件都是NI 的AWR,只能趁着现在没事做先学习一下子了,希望不要裁我。 本AWR专栏只是学习的小小记录而…

2024.5.25期末测试总结

成绩&#xff1a; 配置&#xff1a; 可能与实际有些出入 题目&#xff1a; 第一题&#xff1a; 代码思路&#xff1a; 一道模拟题&#xff0c;按照公式计算出sumpow(2,i)&#xff0c;判断sum>H&#xff0c;输出 代码&#xff1a; #include<bits/stdc.h> using name…

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置 1、基础配置1.1、信令服务配置1.2、白名单1.3、黑名单1.4、流媒体服务配置 2、搭建GB28181视频直播平台 1、基础配置 LiveGBS相关信令服务配置和流媒体服务配置都在这里…

Spark运行模式详解

Spark概述 Spark 可以在多种不同的运行模式下执行&#xff0c;每种模式都有其自身的特点和适用场景。 部署Spark集群大体上分为两种模式&#xff1a;单机模式与集群模式。大多数分布式框架都支持单机模式&#xff0c;方便开发者调试框架的运行环境。但是在生产环境中&#xff…

机器人支持回调接口配置(详细教程)

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 一、前言 今天&#xff0c;给大家介绍一下&#xff0c;如何在机器人中配置回调地址和接口编写。很多时候我们可能有这样的场景&#xff0c;收到消息后&#xff0c;想自己处理一下消息的内…

【微服务】springboot 构建镜像多种模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型 我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊…

HTTP协议、URL、HTTPS协议 ----- 讲解很详细

本章重点 理解应用层的作用, 初识HTTP协议 了解HTTPS协议 一、HTTP协议 1.认识url 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的&#xff0c;但实际上&#xff0c;已经有大佬们定义了一些现成的&#xff0c;又非常好用的应用层协议&#xff0c;供我们直接参考使…

明星IP切片带货爆单营,0基础搞定IP切片带货短视频(69节课)

把握带货趋势&#xff0c;了解切片流程&#xff0c;剪辑带货创收营 课程目录&#xff1a; 01第一章实操链路-第一节IP选择.mp4 02第一章实操链路-第二节账号准备.mp4 03第一章实操链路-第四节开通权限.mp4 04第一章实操链路-第五节货品准备.mp4 05第一章实操链路-第六节素…

AI重塑保险业未来:机器学习在风险评估、欺诈检测与客户服务中的深度应用

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…