快捷搜索:  汽车  科技

python计算有效边界(基于python计算缺口滑块验证码所需滑动距离)

python计算有效边界(基于python计算缺口滑块验证码所需滑动距离)感谢您的阅读,如果喜欢本文欢迎关注和转发,转载需注明出处,本头条号将持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。https://www.runoob.com/numpy/numpy-tutorial.htmlimg = cv2.imdecode(np.fromfile(img_path dtype=np.uint8) cv2.IMREAD_COLOR) # 解决文件路径名带有中文的情况Java 调用服务@Test public void sliderTest() { Map<String String> data = new HashMap<>(); data.put("image" "G:\\verificaPic\\validate-big_2.png

导读:笔者之前是依靠打码平台计算缺口滑块验证码距离,由于平台不太稳定因此最近打算自己实现一个距离计算服务。在网上一阵探索后发现了一个采用 Python 的解决方案识别成功率很高,这里做下分享希望对各位有所帮助。

python计算有效边界(基于python计算缺口滑块验证码所需滑动距离)(1)

典型的缺口滑块验证码

代码实现

基于 python 同时借助强大的 OpenCV(计算机视觉库)、numpy 等库实现。笔者再借助 Flask(一个使用 Python 编写的轻量级 Web 应用框架)将其封装为一个简单的 Web 服务使其功能能够跨语言使用。

from flask import Flask request jsonify import json import cv2 import numpy as np import pandas as pd import math app = Flask(__name__) app.debug = True # x方向一阶导中值 def get_dx_median(dx x y w h): return np.median(dx[y:(y h) x]) # 预处理 def pre_process(img_path): img = cv2.imread(img_path 1) # 从指定的文件中加载图像并返回 1 为彩色图像 img_gray = cv2.cvtColor(img cv2.COLOR_BGR2GRAY) # 转成灰度图像 _ binary = cv2.threshold(img_gray 127 255 cv2.THRESH_BINARY) # 将灰度图像转成二值图像 contours hierarchy = cv2.findContours(binary cv2.RETR_TREE cv2.CHAIN_APPROX_NONE) # 查找轮廓 rect_area = [] rect_arc_length = [] cnt_infos = {} for i cnt in enumerate(contours): if cv2.contourArea(cnt) < 5000 or cv2.contourArea(cnt) > 25000: continue x y w h = cv2.boundingRect(cnt) cnt_infos[i] = {'rect_area': w * h # 矩形面积 'rect_arclength': 2 * (w h) # 矩形周长 'cnt_area': cv2.contourArea(cnt) # 轮廓面积 'cnt_arclength': cv2.arcLength(cnt True) # 轮廓周长 'cnt': cnt # 轮廓 'w': w 'h': h 'x': x 'y': y 'mean': np.mean(np.min(img[y:(y h) x:(x w)] axis=2)) # 矩形内像素平均 } rect_area.append(w * h) rect_arc_length.append(2 * (w h)) dx = cv2.Sobel(img -1 1 0 ksize=5) return img dx cnt_infos # 计算移动的距离 def calculate_distance(img_path): img dx cnt_infos = pre_process(img_path) df = pd.DataFrame(cnt_infos).T df.head() df['dx_mean'] = df.apply(lambda x: get_dx_median(dx x['x'] x['y'] x['w'] x['h']) axis=1) df['rect_ratio'] = df.apply(lambda v: v['rect_arclength'] / 4 / math.sqrt(v['rect_area'] 1) axis=1) df['area_ratio'] = df.apply(lambda v: v['rect_area'] / v['cnt_area'] axis=1) df['score'] = df.apply(lambda x: abs(x['rect_ratio'] - 1) axis=1) result = df.query('x>0').query('area_ratio<2').query('rect_area>5000').query('rect_area<20000').sort_values( ['mean' 'score' 'dx_mean']).head(2) return result.x.values[0] @app.route('/verification/' methods=['post']) def add_stu(): # 计算并将结果响应回去 request_json = json.loads(request.data.decode('utf-8')) result = calculate_distance(request_JSON["image"]) response = { 'code': '0' 'data': { "result" : result } 'message': 'success' } return jsonify(response) if __name__ == '__main__': app.run(host='localhost' port=9091) # 这里指定了地址和端口号。

注意:当执行 img = cv2.imread(img_path 1) 这行代码时 img_path 图片路径中含有中文字符会导致获取不到图像。可通过修改图片存放路径为英文(最佳)或替换为以下代码解决:

img = cv2.imdecode(np.fromfile(img_path dtype=np.uint8) cv2.IMREAD_COLOR) # 解决文件路径名带有中文的情况Java 调用服务

@Test public void sliderTest() { Map<String String> data = new HashMap<>(); data.put("image" "G:\\verificaPic\\validate-big_2.png"); try { String resultString = Jsoup.connect("http://localhost:9091/verification/") .requestBody(JSON.toJSONString(data)) .header("Content-Type" "application/json") .ignoreContentType(true).timeout(120000).post().text(); JSONObject object = JSONObject.parseObject(resultString); System.out.println(object.getJSONObject("data").getString("result")); } catch (Exception e) { throw new RuntimeException("调用验证码图片识别服务发生异常!" e); } }

取得距离结果之后借助 selenium 实现模拟拖动滑块就可破解(这里需要注意不要一次性到位,而是要分多段滑动以防被检测到),由于网上有很多方案此处就不展开具体讨论了。

最后

参考:

https://github.com/godtoy/python-tecent-slider-crack

https://www.runoob.com/numpy/numpy-tutorial.html

感谢您的阅读,如果喜欢本文欢迎关注和转发,转载需注明出处,本头条号将持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。

猜您喜欢: