news 2026/11/6 1:17:46

Pillow识别极验消消乐验证码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pillow识别极验消消乐验证码

前言

该文章为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系作者删除~

正文


识别思路:

  1. 总共有9张图片,每张图片计算摘要信息,变成一个3行3列的矩阵。
  2. 去尝试每个图片上下左右互换,判断行和列的图片是否相等。以此循环

图片先存到本地,并按规则命名,这里用一个自动化程序搞下来,命名规则和顺序如下:

defget_img():tab=Chromium().latest_tab tab.get("https://www.geetest.com/adaptive-captcha")tab.ele(".tab-item tab-item-3").click()ele=tab.ele("@class:geetest_btn_click").click()images=tab.eles("@class:geetest_item")row=1col=1forimginimages:pattern=r'url\("([^"]+)"\)'match=re.search(pattern,img.attr("style"))ifmatch:url=match.group(1)resp=requests.get(url)withopen(f"img{row}{col}.png","wb")asf:f.write(resp.content)ifrow==3:row=1col+=1else:row+=1

# 加载所有9张拼图碎片图片(命名格式为img11.png, img12.png,...,img33.png)imgs=[]foriinrange(1,4):# 行号1-3forjinrange(1,4):# 列号1-3imgs.append(Image.open(f"img{i}{j}.png"))# 加载图片并添加到列表# 获取单张图片的宽度和高度(假设所有图片大小相同)width,height=imgs[0].size# 创建一个大背景图(3x3拼图)bg=Image.new('RGB',(width*3,height*3))# 将9张小图拼接成3x3的大图foriinrange(3):# 行循环forjinrange(3):# 列循环# 计算当前图片在列表中的索引(行优先顺序)# 将图片粘贴到对应位置bg.paste(imgs[i*3+j],(j*width,i*height))# 计算每张图片的MD5哈希值(用于唯一标识每张图片)md5_list=[]forimginimgs:data=img.tobytes()# 将图像转换为字节数据md5_list.append(hashlib.md5(data).hexdigest())# 计算MD5哈希值# 将MD5列表转换为3x3的numpy数组(与拼图布局对应)md5_list=np.array(md5_list).reshape([3,3])defidentify_slide(md5_list):""" 识别需要交换的拼图块位置 参数: md5_list: 3x3的MD5哈希值矩阵 返回值: 包含两个坐标的列表,表示需要交换的两个拼图块的位置 [[源行,源列], [目标行,目标列]] """result=[[0,0],[0,0]]# 初始化结果# 遍历所有拼图块foriinrange(3):# 行循环forjinrange(3):# 列循环# 尝试向上交换ifi-1>=0:# 检查是否在上边界内# 临时交换两个位置的MD5值md5_list[i-1][j],md5_list[i][j]=md5_list[i][j],md5_list[i-1][j]# 检查交换后是否形成完整的行或列(三个相同MD5值)# 检查第i-1行是否全部相同 或 第i行是否全部相同if(md5_list[i-1][0]==md5_list[i-1][1]==md5_list[i-1][2])or\(md5_list[i][0]==md5_list[i][1]==md5_list[i][2]):result[0]=[i,j]# 源位置result[1]=[i-1,j]# 目标位置returnresult# 还原交换md5_list[i-1][j],md5_list[i][j]=md5_list[i][j],md5_list[i-1][j]# 尝试向下交换(逻辑同上)ifi+1<=2:md5_list[i+1][j],md5_list[i][j]=md5_list[i][j],md5_list[i+1][j]if(md5_list[i+1][0]==md5_list[i+1][1]==md5_list[i+1][2])or\(md5_list[i][0]==md5_list[i][1]==md5_list[i][2]):result[0]=[i,j]result[1]=[i+1,j]# 注意这里应该是i+1而不是i-1(原代码有误)returnresult md5_list[i+1][j],md5_list[i][j]=md5_list[i][j],md5_list[i+1][j]# 尝试向左交换ifj-1>=0:md5_list[i][j-1],md5_list[i][j]=md5_list[i][j],md5_list[i][j-1]# 检查列是否全部相同if(md5_list[0][j-1]==md5_list[1][j-1]==md5_list[2][j-1])or\(md5_list[0][j]==md5_list[1][j]==md5_list[2][j]):result[0]=[i,j]result[1]=[i,j-1]returnresult md5_list[i][j-1],md5_list[i][j]=md5_list[i][j],md5_list[i][j-1]# 尝试向右交换(逻辑同上)ifj+1<=2:md5_list[i][j+1],md5_list[i][j]=md5_list[i][j],md5_list[i][j+1]if(md5_list[0][j+1]==md5_list[1][j+1]==md5_list[2][j+1])or\(md5_list[0][j]==md5_list[1][j]==md5_list[2][j]):result[0]=[i,j]result[1]=[i,j+1]returnresult md5_list[i][j+1],md5_list[i][j]=md5_list[i][j],md5_list[i][j+1]returnresult# 返回找到的交换位置# 创建新的背景图(用于显示结果)bg=Image.new('RGB',(width*3,height*3))# 识别需要交换的拼图块result=identify_slide(md5_list)print("需要交换的位置:",result)# 打印交换建议# 执行交换(在图片列表中交换两个图片的位置)imgs[result[0][0]*3+result[0][1]],imgs[result[1][0]*3+result[1][1]]=\ imgs[result[1][0]*3+result[1][1]],imgs[result[0][0]*3+result[0][1]]# 重新拼接交换后的完整图片foriinrange(3):forjinrange(3):bg.paste(imgs[i*3+j],(j*width,i*height))# 显示交换后的完整图片bg.show()

代码功能说明:

  1. 图片加载与预处理:
  • 加载9张拼图碎片图片(3x3排列)

  • 计算每张图片的MD5哈希值作为唯一标识

  1. 交换位置识别:
  • 尝试每个拼图块与相邻块(上、下、左、右)的交换

  • 检查交换后是否能形成完整的一行或一列(三个相同MD5值)

  • 找到满足条件的第一个交换对

  1. 执行交换与结果显示:
  • 在图片列表中交换两个图片的位置

  • 重新拼接完整的3x3图片

  • 显示交换后的结果

最后

欢迎联系作者交流更多

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 1:17:06

07:输出浮点数

/*** 题目名称&#xff1a;输出浮点数 <p>* 题目来源&#xff1a;http://noi.openjudge.cn/ch0101/07/ <p>* 程序功能&#xff1a;按题目要求以不同的格式化输出一个双精度浮点数** author 潘磊&#xff0c;just_panleijust.edu.cn* version 1.0*/// 本题Java无法A…

作者头像 李华
网站建设 2026/11/6 1:16:28

JS逆向-某乎x-zse-96参数(2025-4-3)

前言 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系作者删除~ 很久没写博客了&#xff0c;今天玩一下某乎的x-zse-96参数&#xff0c;不知道跟去年的有没有变化 正文 …

作者头像 李华
网站建设 2026/11/6 1:15:58

碧蓝航线自动脚本Alas使用指南:委托科研大世界全自动挂机教程

碧蓝航线自动脚本Alas使用指南&#xff1a;委托科研大世界全自动挂机教程 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript Az…

作者头像 李华
网站建设 2026/11/6 1:13:44

TranslucentTB:免费的任务栏透明与模糊,内存只占几 MB

TranslucentTB&#xff1a;免费的任务栏透明与模糊&#xff0c;内存只占几 MB 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你精心选的…

作者头像 李华
网站建设 2026/11/6 1:13:44

LinkSwift 网盘直链免登录下载:8 大网盘取直链一步到位

LinkSwift 网盘直链免登录下载&#xff1a;8 大网盘取直链一步到位 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华