登录接口带验证码自动化(tesseract-OCR)
登录接口是很多网站和应用程序中必不可少的一部分。为了增加安全性,很多登录接口还会加入验证码的验证步骤,以防止恶意登录行为。
通常,遇到这样情况时有以下解决办法
1、使用万能验证码:如果遇到前台输入的是万能验证码,那就不要做验证码校验直接通过;
2、特定用户跳过验证码:如果遇到指定用户登录,那么不管输入什么验证码,验证码校验都通过;
3、通过OCR识别解决验证码问题;
4、将token变为变量,后续时长更新;
本文主要介绍第三种方式:
安装Pillow和pytesseract模块
pip install pytesseract -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
安装tesseract-OCR
下载地址Index of /tesseracthttps://digi.bib.uni-mannheim.de/tesseract/
网站较慢,可从网盘获取
通过网盘分享的文件:tesseract-ocr-w64-setup-v5.3.0.20221214.exe
链接: https://pan.baidu.com/s/1DdDZsANpdY3Yg2uDxXbZgw 提取码: 4742
下载最新版本即可,直接next安装完成,
配置环境变量
1、添加到环境变量的系统变量(PATH)去(根据实际填写)
2、增加一个TESSDATA_PREFIX变量名,变量值是 实际安装路径\tessdata
3、打开终端,输入:tesseract -v,可以看到版本信息
代码演示
def test_get_token(self):
json_path = read_json_path()
path = get_yaml_data(read_yaml_file())["Token"]["get_uuid"]["path"]
# 发送 GET 请求,请求路径由 self.select_env() 方法返回的环境URL与 path 拼接而成
re = requests.get(self.select_env() + path)
# 将响应转换为 JSON 格式
response_data = re.json()
---------------此处开始是相关的代码
# 获取Base64编码的图片数据
img_data = response_data["img"].split(",")[1]
# 将Base64字符串解码为字节数据
img_bytes = base64.b64decode(img_data)
# 创建一个图像对象
img = Image.open(BytesIO(img_bytes))
# 进行图像增强处理
img = img.convert("L") # 转为灰度图像
img = img.filter(ImageFilter.MedianFilter()) # 去噪声
# 可以尝试不同的阈值来改进图像处理
threshold = 180 # 调整阈值进行实验
img = img.point(lambda p: p > threshold and 255)
# 配置参数,增强验证码识别的准确性
custom_config = r'--oem 3 --psm 6'
# 使用pytesseract进行验证码识别
captcha_text = pytesseract.image_to_string(img, config=custom_config)
print(captcha_text)
# 显示图像,查看图像质量
img.show()
---------------此处是相关的代码的结束
headers = read_json_file_dict(f'{json_path}/json/token_data.json', 'header')
logging.info(f" headers 是 {headers}")
data = read_json_file_dict(f'{json_path}/json/token_data.json', 'body')
public_key = read_file(f"{json_path}/cipher_public.pem")
username = encryption(self._USERNAME, public_key)
password = encryption(self._PASSWORD, public_key)
# 去除前后的空格和换行符
code = captcha_text.replace("\n", "")
uuid = response_data["uuid"]
logging.info(f" username 是 {username}")
logging.info(f" password 是 {password}")
logging.info(f" uuid 是 {uuid}")
logging.info(f" code 是 {code}")
data["uuid"] = uuid
data["username"] = username
data["usercode"] = username
data["password"] = password
data["code"] = code
# 将字典转换成 JSON 格式的字符串
data = json.dumps(data)
logging.info(f" data是 {data}")
path = get_yaml_data(read_yaml_file())["Token"]["get_token"]["path"]
logging.info(f" path 是 {path}")
# 发送 POST 请求,请求路径由 self.select_env() 方法返回的环境URL与 path 拼接而成
re = requests.post(self.select_env() + path, headers=headers, data=data)
# 将响应转换为 JSON 格式
response_data = re.json()
token = response_data["data"]["access_token"]
return token
注意,
运行前,需修改pytesseract.py文件中
tesseract_cmd 的实际路径
说明
我演示的环境中,验证码会通过base64进行编码,所以我们先做的就是将接口中的编码信息拿到,然后进行解码操作,再将解码信息创建为图片对象,然后进行ocr识别,最后将识别的信息填入登录请求体中;
最后
免费的ocr不好使,哈哈哈,尽量选择第一、二种方式;或者使用付费的ocr进行识别,增加准确度;