美文网首页Python学习
随记-点选验证码

随记-点选验证码

作者: DragonFangQy | 来源:发表于2024-03-01 09:45 被阅读0次

    文字验证码(点击文字)

    • 模板匹配(从一张图片中寻找 icon),放弃,目前准确率不高,且处理过程复杂

      • 灰度处理
      • 将 complete_image_path 截取并另存为 target_image_path, verify_image_path
      • 将 target_image_path 截取并另存为 icon
      • 从 verify_image_path 中找到 icon
    • 借助 ddddocr

      • ddddocr
      • 直接将 complete_image_path,target_image_path,verify_image_path 丢给 ddddocr 获取结果

    主要代码

    save_image

    
    
    def save_image(style_value):
        """
            保存图片(目标图片 和 验证图片)
        """
        
        # 获取验证图片
        bg_img_url = re.search(r"""url\("(?P<url>.*?)"\);""", style_value)
        bg_img_width = re.search(r""".*width:.*?(?P<width>.*?)px;""", style_value)
        bg_img_height = re.search(r""".*height:.*?(?P<height>.*?)px;""", style_value)
        bg_img_right = re.search(r""".*right:.*?(?P<right>.*?)px;""", style_value)
        bg_img_top = re.search(r""".*top:.*?(?P<top>.*?)px;""", style_value)
     
        complete_image_path = None
        image_name = ""
    
        size_info = {}
        if bg_img_url:
            url = bg_img_url.groupdict().get("url", "")
            re_image_name = re.search(r""".*/(?P<image_name>.*?).jpg\?""", url)
    
            if re_image_name:
                temp_key = "image_name"
                image_name = re_image_name.groupdict().get(temp_key, "")
    
                size_info.update(bg_img_width.groupdict())
                size_info.update(bg_img_height.groupdict())
                size_info.update(bg_img_right.groupdict())
                size_info.update(bg_img_top.groupdict())
    
            data = requests.get(url, verify=False)
    
            complete_image_path = f"{base_path}{image_name}_complete.jpg"
    
            # 保存验证图片(原图)
            with open(complete_image_path, "wb") as wbf:
                wbf.write(data.content)
        
        image_obj = cv2.imread(complete_image_path)
    
        height, width, channel = image_obj.shape
    
        for element_key, element_value in size_info.items():
            size_info[element_key] = int(element_value)
    
        point = (0, height-size_info["height"], size_info["width"], height)
        image_crop_target = image_obj[height-size_info["height"]:height, 0:size_info["width"]]
        image_crop_verify = image_obj[0:height-size_info["height"], 0:width]
        
        # 保存目标图片
        target_image = f"{image_name}_target.jpg"
        target_image_path = f"{base_path}{target_image}"
        # cv2.imshow("image_crop", image_crop_target)
        # cv2.waitKey(0)
        cv2.imwrite(target_image_path, image_crop_target)
        
        # 保存verify图片
        verify_image = f"{image_name}_verify.jpg"
        verify_image_path = f"{base_path}{verify_image}"
        # cv2.imshow("image_crop", image_crop_target)
        # cv2.waitKey(0)
        cv2.imwrite(verify_image_path, image_crop_verify)
    
        return complete_image_path, target_image_path, verify_image_path
    
    

    save_image_crop

    
    def save_image_crop(image_path, width_size = 26):
        """
            裁切目标图片
        """
        
        image_obj = Image.open(image_path)
    
        width, height = image_obj.width, image_obj.height 
    
        left_top_point = [] # 左上
        for i in range(0, width, width_size):
            left_top_point.append((i, 0))
    
        right_bottom_point = [] # 右下
        for i in range(width_size, width, width_size):
            right_bottom_point.append((i, height))
     
        crop_target_list = []
        min_len = min(len(left_top_point), len(right_bottom_point))
        for i in range(min_len):
    
            temp_list = []
            temp_list.extend(left_top_point[i])
            temp_list.extend(right_bottom_point[i])
    
            point = tuple(temp_list) 
            image_crop = image_obj.crop(point)
            
            re_image_name = re.search(r""".*/(?P<image_name>.*?).jpg""", image_path)
    
            image_name = ""
            if re_image_name:
                temp_dict = re_image_name.groupdict()
                image_name = temp_dict["image_name"] 
    
            image_name_list = image_name.split("_")
            image_name_list.append(str(i))
    
            new_image_name = "_".join(image_name_list)
            new_image_path = f"{base_path}/{new_image_name}.jpg"
    
            image_crop.save(new_image_path)
            crop_target_list.append(new_image_path)
        return crop_target_list, height
        
    

    object_detection

    
    def object_detection(complete_image_path):
        det = ddddocr.DdddOcr(det=True, show_ad=False)
    
        with open(complete_image_path, 'rb') as f:
            image = f.read()
    
        poses = det.detection(image)
        print(poses) 
            
        im = cv2.imread(complete_image_path)
    
        for box in poses:
            x1, y1, x2, y2 = box
            im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)
    
        cv2.imshow("object_detection", im)
        cv2.waitKey(0)
    
    

    main

    
    if __name__ == "__main__":
        driver = get_driver()  
        
        driver.get('https://www.bixxxxli.com/')
    
        click_element(driver, """ //div[@class="header-login-entry"] """)
        click_element(driver, """ //div[@class="login-tab-item"] """)
        input_element(driver, """ //div[@class="login-sms-wp__cid"]/../input """, "15266666666")
        click_element(driver, """ //div[@class="login-sms-wp__cid"]/../div[@class="login-sms-send clickable "] """)
    
        style_value = get_element_value(driver, """ //div[@class="geetest_widget"]//div[@class="geetest_tip_img"] """, "style")
        complete_image_path, target_image_path, verify_image_path = save_image(style_value)
    
        object_detection(complete_image_path)
        object_detection(target_image_path)
        object_detection(verify_image_path)
        print
        
    

    Source Code


    到此结  DragonFangQy 2024.03.02

    本博文仅供学习参考之用,不得用于其他任何目的。如有任何内容侵犯到您的隐私或权益,敬请立即联系我,我将及时删除或修正相关内容。感谢您的理解与支持,期待与您共同维护一个友善、尊重知识产权的网络环境。

    相关文章

      网友评论

        本文标题:随记-点选验证码

        本文链接:https://www.haomeiwen.com/subject/ankczdtx.html