

发布于 2024-03-27 22:462782浏览基于开源项目: https://github.com/Starry-OvO/rotate-captcha-crack
Python >=3.8 建议使用python3.10(影刀的python版本是3.7无法安装,所以需要在本地安装额外的python环境,通过接口的方式让影刀调用)
安装与配置(项目支持cpu与gpu模式)
使用前安装好troch cuda
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121项目安装说明:
下载项目到本地进入项目使用下方命令安装
pip install .模型下载名为RotNetR的即可
测试代码:
import torch
from PIL import Image
from rotate_captcha_crack.common import device
from rotate_captcha_crack.const import DEFAULT_CLS_NUM
from rotate_captcha_crack.model import RotNetR, WhereIsMyModel
from rotate_captcha_crack.utils import process_captcha
def load_model_and_predict(model_path, image_path):
# Load model
cls_num = DEFAULT_CLS_NUM
model = RotNetR(cls_num=cls_num, train=False)
model.load_state_dict(torch.load(model_path))
model = model.to(device="cpu")
model.eval()
# Load and process image
img = Image.open(image_path)
img_ts = process_captcha(img)
img_ts = img_ts.to(device="cpu")
# Predict
predict = model.predict(img_ts)
degree = predict * 360
print(f"预测旋转角度: {degree}°")
if __name__ == "__main__":
# 模型路径
model_path=r"D:\Work\python_project\旋转验证码识别\models\RotNetR\best.pth"
# 旋转验证码图片
image_path=r"D:\Work\python_project\旋转验证码识别\img\638465369943014784.png"
load_model_and_predict(model_path, image_path)
# 滑块移动距离计算:(滑轨的宽度-滑块的宽度)/360*预测的旋转角度
接口服务(flask):
from flask import Flask, request, jsonify
import torch
from PIL import Image
from rotate_captcha_crack.const import DEFAULT_CLS_NUM
from rotate_captcha_crack.model import RotNetR
from rotate_captcha_crack.utils import process_captcha
# 创建Flask应用实例
app = Flask(__name__)
# 定义一个路由,用于处理POST请求
@app.route('/predict', methods=['POST'])
def predict():
# 检查请求中是否包含文件
if 'file' not in request.files:
return jsonify({'error': 'No file part'}), 400
# 获取请求中的文件
file = request.files['file']
# 检查文件名是否为空
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
# 打开并处理验证码图片
img = Image.open(file)
img_ts = process_captcha(img)
img_ts = img_ts.to(device=device)
# 创建模型实例
model = RotNetR(cls_num=DEFAULT_CLS_NUM, train=False)
# 加载模型参数
model.load_state_dict(torch.load(model_path, map_location=device))
# 设置模型为评估模式
model.eval()
# 使用模型进行预测
predict = model.predict(img_ts)
# 将预测结果(旋转角度)转换为整数
degree = predict * 360
# 根据预测结果旋转图片
img = img.rotate(
-degree, resample=Image.Resampling.BILINEAR, fillcolor=(255, 255, 255)
)
# 返回旋转角度
return jsonify({'degree': degree})
# 如果当前脚本为主程序,则启动Flask应用
if __name__ == '__main__':
# 设置设备为CPU(cpu)模式/GPU(cuda)模式
device="cpu"
# 设置模型路径
model_path=r"D:\Work\models\RotNetR\best.pth"
app.run(debug=True)
请求示例:
def send_request(image_path):
url = 'http://localhost:5000/predict'
files = {'file': open(image_path, 'rb')}
response = requests.post(url, files=files)
return int(response.json()["degree"])影刀示例(百度指数登录)

requests_degree.py

元素

预测的成功率并不是百分之百建议加上循环以及登录成功的判断(实际测试百度指数登录验证的成功率还可以基本上一两次就成功了),有兴趣的盆友可以自行尝试其他地方的旋转验证