js逆向案例五-字符类验证码

目录

      • 案例:一二三四
      • 五、字符验证码的逆向(⭐⭐⭐)
        • 1、案例插曲_验证码识别ocr库
          • (1) 字符验证码特点
          • (1) pytesseract / tesserocr安装与使用(不推荐)
          • (2) muggle-ocr安装与使用(推荐)
          • (3) ddddocr安装与使用(推荐)
          • (4) easyocr安装与使用(推荐)
          • (5) paddleocr安装与使用(推荐)
        • 2、案例13_验证码去噪及识别
        • 3、案例插曲_tensorflow与pytorch

案例:一二三四

  • js逆向案例一二
  • js逆向案例三
  • js逆向案例四

五、字符验证码的逆向(⭐⭐⭐)

1、案例插曲_验证码识别ocr库

  • ocr识别库种类有哪些,点击参考来自大佬的文章
(1) 字符验证码特点
  • 字符验证码:指用数字、字母、汉字和标点符号等字符作为元素的图片验证码,主要由数字、大写字母、彩色斜线、彩色噪点和彩色背景组成,图像分为3层,最底层为背景色,字符(数字和大写字母)层在背景色之上,干扰(斜线和噪点)层则在最上面,如以下验证码;
    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述在这里插入图片描述

  • 计算型验证码:计算型验证码在字符验证码的基础上增加了数学运算,它也是将人类视觉和计算机视觉的差异作为区分用户的依据,如以下验证码
    在这里插入图片描述 在这里插入图片描述

  • 难点:部分验证码带有彩色背景斜线、噪点、字符扭曲、角度旋转和文字重叠,图片中的字符颜色与背景颜色并没有强烈的反差

  • 解决方法:降低斜线和噪点对文字的干扰,增强背景色与字符颜色的反差,也就是对图片进行灰度处理(去掉彩色)和二值化处理(降低干扰、增强颜色反差)

  • 二值化处理:其实是根据阈值调整原图的像素值,将大于阈值的像素点颜色改为白色,小于阈值的像素点改为黑色,这样就能够达到增强颜反差的目的

(1) pytesseract / tesserocr安装与使用(不推荐)
  • 此类ocr识别不是很推荐,毕竟依赖了tesseract-ocr.exe,可作为了解

  • tesserocr需安装依赖tesseract-ocr.exe,可用于识别字母中文,中文需指定参数lang=‘chi_sim’

    pip install tesserocr -i https://mirrors.aliyun.com/pypi/simple
    
  • tesserocr识别之python解析使用如下,有两种二选一

    import tesserocr
    code = tesserocr.file_to_text('img_3.jpg')
    print(code)  
    
    import tesserocr
    from PIL import Image
    code = tesserocr.image_to_text(Image.open('img_3.jpg'))
    print(code)
    # 识别中文
    code = tesserocr.image_to_text(Image.open('img_4.jpg'), lang='chi_sim')
    print(code)
    
  • pytesseract需安装依赖tesseract-ocr.exe,可用于识别字母中文,中文需指定参数lang=‘chi_sim’

    pip install pytesseract -i https://mirrors.aliyun.com/pypi/simple
    
  • pytesseract识别之python解析使用如下

    import pytesseract
    from PIL import Image
    code = pytesseract.image_to_string(Image.open('img_3.jpg'))
    print(code)
    # 识别中文
    code = pytesseract.image_to_string(Image.open('img_4.jpg'), lang='chi_sim')
    print(code)
    
  • 可以选择训练字体模型: 起因:看一张原图识别如下,有部分错别字,所以我们需要训练字体进行优化,可以生成一套自己的字体
    在这里插入图片描述 在这里插入图片描述

    • 如何训练,点击参考这篇文章,最终将生成的zwp.traineddata文件放到tessdata下面,然后识别的时候语言选择该字体。生成box文件原文章中的改成这个tesseract zwp.test.exp0.tif zwp.test.exp0 -l chi_sim --psm 7 batch.nochop makebox,双击jTessBoxEditorFX的.bat文件要等几秒才出现
    • 实践训练出来识别也是失败的,暂未知原因,不管了,哈哈,差不多是这么个流程。最后不推荐这种训练,我们看下面的模块更好用
      js逆向案例五-字符类验证码_第1张图片
      js逆向案例五-字符类验证码_第2张图片
(2) muggle-ocr安装与使用(推荐)
  • 官方文档https://pypi.org/project/muggle-ocr/已经下架,目前可以通过下面的方法安装;可用于识别字母数字中文
    pip install muggle-ocr -i https://mirrors.aliyun.com/pypi/simple
    
  • muggle-ocr识别之python解析使用如下
    import muggle_ocr
    
    
    class ImageIdentify:
        @staticmethod
        def muggle_identify(captcha_bytes, ocr=False):
            """
            使用预置模型,预置模型包含了[ModelType.OCR, ModelType.Captcha] 两种
            其中 ModelType.OCR 用于识别普通印刷文本, ModelType.Captcha 用于识别4-6位简单英数验证码
            :param captcha_bytes: 验证码
            :param ocr: 是否使用ocr识别
            :return:
            """
            if ocr:
                sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
            else:
                sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
            return sdk.predict(image_bytes=captcha_bytes)
    
        @staticmethod
        def muggle_by_yaml_identify(captcha_bytes):
            """
            使用自定义模型
            支持基于 https://github.com/kerlomz/captcha_trainer 框架训练的模型
            训练完成后,进入导出编译模型的[out]路径下, 把[graph]路径下的pb模型和[model]下的yaml配置文件放到同一路径下。
            将 conf_path 参数指定为 yaml配置文件 的绝对或项目相对路径即可,其他步骤一致,如下示例:
            """
            sdk = muggle_ocr.SDK(conf_path="D:\Software\python37\operation18.yaml")
            text = sdk.predict(image_bytes=captcha_bytes)
            return text
    
    
    with open(r'./img/img_1.jpg', 'rb') as f:
        print(ImageIdentify.muggle_identify(f.read(), True))
    	print(ImageIdentify.muggle_identify(f.read()))
    	print(ImageIdentify.muggle_by_yaml_identify(f.read()))
    
  • 可以选择训练字体模型
    • 可查看up主视频解析讲解训练和部署,或者看文档介绍,或者看我下面简要的操作步骤,更详细的还是看上面的两个

    • 使用captcha_trainer项目源码训练模型,下载源码并解压
      js逆向案例五-字符类验证码_第3张图片

    • 然后安装一些项目环境依赖,上述下载的文件解压后可看见requirements.txt,建个虚拟环境安装进行安装依赖库pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt,框架默认安装TensorFlow-GPU版,建议使用GPU进行训练,如需换用CPU训练则需替换 requirements.txt 文件中的tensorflow-gpu 为tensorflow,其他无需改动。

    • 下载好安装包(GPU训练需要),注意下载runfile类型的安装包,deb安装会自动安装默认驱动:显卡NVIDIA 驱动下载 , CUDA 下载地址,cuDNN 下载地址(其中cuDNN需要注册NVIDIA账号且登陆,下载deb安装包))

    • 准备验证码训练样本如下:验证码命名必须是验证码_MD5的形式,如下图,修改验证码统一命名

      import hashlib
      import os
      
      path = r"E:\Samples\case4\true"
      filelist = os.listdir(path)
      for item in filelist:
          src = os.path.join(os.path.abspath(path), item)
          print(src)
          with open(src, "rb") as f:
              _id = hashlib.md5(f.read()).hexdigest()
          dst = os.path.join(os.path.abspath(path), f'{item.split(".")[0]}_{_id}.jpg')
          os.rename(src, dst)
      

      js逆向案例五-字符类验证码_第4张图片

    • 训练集样本数量准备注意事项:详细看这篇文章

    • 然后运行当前目录下的app.py,即可看到可视化操作界面,如何具体操作可看可查看up主视频第12分钟开始解析讲解训练和部署,以及参数设置的注意事项,点击 [Start Training] 开始训练,中途若需终止训练可点击 [Stop] 停止,若是未达到结束条件而终止任务,可以手动点击 [Compile] 编译
      js逆向案例五-字符类验证码_第5张图片

    • 训练完成后,在该框架下projects的项目名称下的out目录里可以找到.pb和.yaml文件,才是将该两个文件复制到muggle_ocr相同的目录下
      js逆向案例五-字符类验证码_第6张图片
      js逆向案例五-字符类验证码_第7张图片

    • 训练模型后的调用方法,将训练模型和muggle_ocr原有的模型放在同一个目录下,然后调用的时候指定conf_path即可正常调用自己的模型
      js逆向案例五-字符类验证码_第8张图片

(3) ddddocr安装与使用(推荐)
  • ddddocr安装:识别数字、字母验证码
    pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  • ddddocr识别之python解析使用如下,可选择是否使用gpu
    import ddddocr
    ocr = ddddocr.DdddOcr()
    with open(r'./img/img_3.jpg', 'rb') as f:
    	print(ocr.classification(f.read()))
    
  • ddddocr识别之目标检测
    import ddddocr
    ocr = ddddocr.DdddOcr(det=True, show_ad=False)
    word_ocr = ddddocr.DdddOcr(show_ad=False)
    with open(r'./image/8320423853e84b499be0b81d40c7f259.jpg', 'rb') as f:
        content = f.read()
    xy_list = ocr.detection(content)
    img = Image.open(BytesIO(content))
    draw = ImageDraw.Draw(img)
    words = []
    for row in xy_list:
        # 框字
        x1, y1, x2, y2 = row
        draw.line(([(x1, y1), (x1, y2), (x2, y2), (x2, y1), (x1, y1)]), width=1, fill="red")
        # 裁剪出单个字
        corp = img.crop(row)
        img_byte = BytesIO()
        corp.save(img_byte, 'png')
        # 识别出单个字
        word = word_ocr.classification(img_byte.getvalue())
        words.append(word)
    img.show()
    print(dict(zip(words, xy_list)))
    
    js逆向案例五-字符类验证码_第9张图片
(4) easyocr安装与使用(推荐)
  • easyocr安装:支持80多种语言的识别,据该文章介绍,精度优于PaddleOCR
    pip install easyocr -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  • easyocr识别之python解析使用如下,第一次运行时加载稍长,需要在线下载检测模型和识别模型,之后就正常了,可选择是否使用gpu
    reader = easyocr.Reader(['ch_sim', 'en'], gpu=False)  # need to run only once to load model into memory
    print(reader.readtext('./img/img_7.png', detail=0))
    
(5) paddleocr安装与使用(推荐)
  • paddleocr安装:注意此版本为CPU版本
    pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  • paddleocr识别之python解析使用如下
    from paddleocr import PaddleOCR, draw_ocr
    from PIL import Image
    
    
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    result = ocr.ocr(captcha_path, cls=True)
    for line in result:
        print(line)
    image = Image.open(captcha_path).convert('RGB')
    boxes = [line[0] for line in result]
    txts = [line[1][0] for line in result]
    scores = [line[1][1] for line in result]
    im_show = draw_ocr(image, boxes, txts, scores)
    im_show = Image.fromarray(im_show)
    im_show.show()
    

2、案例13_验证码去噪及识别

  • ① 对图片验证码降噪、二值化,适用于提取字段颜色与背景颜色完全相同的验证码,效果如下
    在这里插入图片描述 在这里插入图片描述

  • ② 9领域法,以一点为中心, 即数字九宫格键,去除周边黑点小于阈值的噪点,效果如下
    在这里插入图片描述 在这里插入图片描述

  • 详细代码见github

3、案例插曲_tensorflow与pytorch

  • 还没学,后面再补上

你可能感兴趣的:(SpiderCrawl,javascript,ocr,验证码,python)