过某站点选验证码

查看 96|回复 9
作者:superTian   
一、验证码分析
每次查看数据详情都会弹出验证码,该验证码图片和目标字符都在下面接口返回。


image-20240112172148008.png (182.64 KB, 下载次数: 0)
下载附件
2024-1-13 10:30 上传

点选完之后会请求数据接口,观察入参ClickText疑似目标字符的坐标点


image-20240112173138355.png (23.79 KB, 下载次数: 0)
下载附件
2024-1-13 10:30 上传

Ctrl+Shift+F搜索一下ClickText找到该参数生成位置如下,简单分析了并验证了一下确为目标字符的中心点坐标。验证码本身比较简单,重点关注下怎么实现获取坐标点。


image-20240112174243284.png (43.77 KB, 下载次数: 0)
下载附件
2024-1-13 10:35 上传

二、实现方式分析
一顿搜完事发现ddddocr在1.3.0版本更新了目标检测功能,官方介绍如下:


image-20240112175219069.png (399.82 KB, 下载次数: 0)
下载附件
2024-1-13 10:36 上传

调用det.detection方法会返回所有文字的坐标集


image-20240112175446750.png (141.97 KB, 下载次数: 0)
下载附件
2024-1-13 10:37 上传

虽然有了所有文字的坐标集,但是我只需要三个目标字符的坐标 并且还要是有序的 怎么办?
我的思路是
[ol]
  • 先根据识别文字坐标集的顺序 把所有字扣下来 稍作处理后按顺序拼接保存成一张新的图片。
  • 识别处理后的图片得到所有文字。如果不做第一步 直接识别效果不理想。
  • 根据目标文字去匹配该字符的坐标集
  • 根据坐标计算中心点
    [/ol]
    1、扣字 处理图片:
    def splicing_strings(image_path: str, boxes: list) -> Image.Image:
        """
        根据坐标集将所有字符处理后拼接为一张新的图片
        :param image_path: 原图地址
        :param boxes: 字符坐标集
        :return:
        """
        original_image = Image.open(image_path)
        new_image = Image.new("RGB", (len(boxes) * 40, 40))  # 40是预设的每个字的宽度,高度
        for idx, box in enumerate(boxes):
            cropped_region = original_image.crop(box)
            cropped_region = cropped_region.convert("L")  # 转换为灰度
            cropped_region = ImageOps.autocontrast(cropped_region)  # 自动调整对比度
            cropped_region = cropped_region.point(lambda x: 0 if x
    执行完后得到效果如图:


    image-20240112180423939.png (5.47 KB, 下载次数: 0)
    下载附件
    2024-1-13 10:37 上传

    2、识别文字
    ocr = ddddocr.DdddOcr(show_ad=False)
    ...
    # 将splicing_strings的结果丢给ocr.classification
    text = ocr.classification(image)
    assert len(text) == len(boxes), '识别失败'
    print(text)
    得到结果:灰庚祸羡浪
    3、根据目标文字去匹配该字符的坐标集
    首先获取目标字符在text中的索引,然后在坐标集里面取该索引的坐标集 即为该目标字符的坐标集
    for target in targets:
        x1, y1, x2, y2 = boxes[text.index(target)]
    4、计算中心坐标
    points = []
    for index, target in enumerate(targets):
        assert target in text, '识别失败'
        x1, y1, x2, y2 = boxes[text.index(target)]
        center_point = (x2 - x1) // 2 + x1, (y2 - y1) // 2 + y1
        points.append(f'{index + 1}:{center_point[0]},{center_point[1]}')
    result = '-'.join(points)
    最后整理下代码成功拿到数据


    image-20240112230608943.png (24.21 KB, 下载次数: 0)
    下载附件
    2024-1-13 10:41 上传

    坐标, 下载次数

  • superTian
    OP
      


    镇江小白123 发表于 2024-1-15 13:34
    dddd之前看都到1.48了吧,怎么这里还用1.30

    文中提到:一顿搜完事发现ddddocr在1.3.0版本更新了目标检测功能。他就是现在是2.48版本 这个功能也是1.30版本加进去的啊,文中也没说我用的1.3.0啊,我用的1.4.11版本
    镇江小白123   

    dddd之前看都到1.48了吧,怎么这里还用1.30
    风之子martin   

    感谢楼主整理分享,有时间学习下
    hk9186   

    暖贴回复加加活力~
    思路很有逻辑,这能不能实现油猴脚本js
    bclx   

    所以该怎么入门来学习这方面啊楼主!!
    ALin596   

    感谢楼主分享,思路很清晰
    Learn3days   

    感谢楼主分享
    KirchoffNZ   

    detection识别文字坐标的精度高么?
    lookfeiji   

    赞一个刚入门又有学习练手素材了
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部