随记-点选验证码

文字验证码(点击文字)

  • 模板匹配(从一张图片中寻找 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 = Noneimage_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.shapefor 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 = boxim = 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF真入门教程30--顺风物流单据管理系统

1、教程回顾 到现在为止&#xff0c;真入门系列教程已完成了29刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;提供一个完整有效的综合项目&#xff0c;本项目采用的是…

c++知识点之 --this

在成员函数中存在。struct和class每个成员函数都隐含一个名为this的指针形参&#xff0c;并且它是该成员函数的第一个参数&#xff0c;当某个对象调用成员函数时&#xff0c;就会把该对象的地址传给被调用成员函数的隐式形参this。 this是一个指针 &#xff0c;存放的是当前对象…

加密与安全_深入了解Hmac算法(消息认证码)

文章目录 PreHMAC概述常见的Hmac算法Code随机的key的生成 KeyGeneratorHmacMD5用Hmac算法取代原有的自定义的加盐算法 HmacMD5 VS MD5HmacSHA256 Pre 加密与安全_深入了解哈希算法中我们提到&#xff0c; 存储用户的哈希口令时&#xff0c;要加盐存储&#xff0c;目的就在于抵…

操作系统系列学习——CPU管理的直观想法

文章目录 前言CPU管理的直观想法 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【…

OpenLayers线性渐变和中心渐变(径向渐变)

目录 1.前言2.添加一个面要素3.线性渐变3.1 第一个注意点3.2 第二个注意点 4.中心渐变&#xff08;径向渐变&#xff09;5.总结 1.前言 OpenLayers官网有整个图层的渐变示例&#xff0c;但是没有单个要素的渐变示例&#xff0c;我们这里来补充一下。OpenLayers中的渐变是通过fi…

python defaultdict

python中的dict是一个重要的数据类型&#xff0c;知道如何使用这个数据类型很简单&#xff0c;但是这个类型使用过程中容易进入一些误区&#xff0c;这篇文章主要对defaultdict方法的讲解&#xff0c;深入的了解dict数据类型。 字典&#xff08;dictionary&#xff09;数据类型…

编译链接实战(22)C/C++代码覆盖率统计报告生成

文章目录 GCOV 工具简介gcov 使用lcov相关编译选项 GCOV 工具简介 gcov是一个测试代码覆盖率的工具&#xff0c;它是 gcc 自带的查看代码覆盖率的工具。 与GCC结合使用&#xff0c;可以分析您的程序以帮助创建更高效、运行更快的代码&#xff0c;并发现程序中未经测试的部分。…

PCIE 4.0 L0s/L1/L2

L0是PCIE设备正常工作的状态&#xff0c;当设备链路处于非工作状态可以跳转大相应的低功耗状态&#xff0c;L0s是一种可以快速恢复到L0的低功耗状态&#xff1b;L1必须经过Reovery状态才可以恢复到L0状态&#xff1b;L2需要从Detect开始逐步进入到L0状态。它们的恢复时间依次延…

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统)

麒麟银河操作系统V10部署ffmpeg(也能用于Linux系统) 部署ffmpeg用来处理视频的各种操作 想使用ffmpeg&#xff0c;要先安装nasm&#xff0c;yasm&#xff0c;x264之后&#xff0c;否则会报错 nkvers 查看麒麟操作系统版本 cat /proc/version #查看linux版本信息 uname -a …

Android修行手册-Chaquopy中opencv、numpy的初步应用

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配

文章目录 前言第13章 SpringBoot整合WebFlux13.1 响应式编程与Reactor13.1.1 命令式与响应式13.1.2 异步非阻塞13.1.3 观察者模式13.1.4 响应性13.1.5 响应式流13.1.6 背压13.1.7 Reactor13.1.7.1 Publisher13.1.7.2 Subscriber13.1.7.3 Subscription13.1.7.4 Processor13.1.7.…

BF算法实现(Python,C++)

BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配&#xff0c;若相等&#xff0c;则继续比较S的第二个字符和 T的第二个字符&#xff1b;若不相等&#xff0c;则比…

Leetcoder Day32| 贪心算法part05

763.划分字母区间 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例&#xff1a; 输入&#xff1a;S "ababcbacadefegdehijhklij"输出&#xff1a;[9,7…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月2日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月2日 星期六 农历正月廿二 1、 气象局&#xff1a;3月份仍有5次冷空气影响我国&#xff1b;全国多地或提前入春。 2、 央行&#xff1a;将外籍来华人员移动支付单笔交易限额由1000美元提高到5000美元。 3、 神舟十七号航…

全量知识系统问题及SmartChat给出的答复 之8 三套工具之3语法解析器 之1

Q19. 问题 : 解释单词解释单词occupied 的字典条目 (word-def occupiedinterest 5type EBsubclass SEBtemplate (script $Demonstrateactor nilobject nildemands nilmethod (scene $Occupyactor nillocation nil))fill (((actor) (top-of *actor-s…

【源码】imx6ull实现触摸屏单点实验

一、本实验实验的器材&#xff1a; 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件&#xff1a; 仓库代码&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 23_multitouch &#xff1a;驱动代…

aws平台的ec2实例 GNU/Linux系统安装docker流程

在AWS EC2实例上安装Docker的流程与其他GNU/Linux系统基本相同。以下是在AWS EC2实例上安装Docker的一般步骤&#xff1a; 登录到AWS EC2实例&#xff1a; 使用SSH或者其他远程登录方式登录到你的GNU/Linux实例。 更新系统包管理器&#xff1a; 对于基于Amazon Linux的系统&am…

常见Prometheus exporter部署

常见Prometheus exporter部署 Prometheus部署Node exporterProcess exporterRedis exporterMySQL exporterOracleDB exporter Prometheus部署 本地部署&#xff1a; wget https://github.com/prometheus/prometheus/releases/download/v*/prometheus-*.*-amd64.tar.gz tar xv…

java的jar打包docker镜像,启动加载

测试环境&#xff0c;打包镜像 1,把jar包复制/data/liu/mssda.jar, cd到这个目录下 2&#xff0c;创建Dockerfile文件&#xff0c;jdk17版本&#xff0c;内容如下 jdk8版本 FROM openjdk:8-jre-alpine WORKDIR /app COPY . /app CMD ["java", "-jar",…

最大奇约数(c++题解)

内存限制&#xff1a; 128 MiB时间限制&#xff1a; 100 ms标准输入输出题目类型&#xff1a; 传统评测方式&#xff1a; 文本比较 题目描述 定义函数f(x)表示x的最大奇约数&#xff0c;这里x表示正整数。例如&#xff0c;f(20) 5&#xff0c;因为20的约数从小到大分别有&am…