百度文库AI中文成语点选识别

最近百度文库又出了新验证码。在出现AI旋转验证码之后,又出现了AI中文成语点选。看样子验证码的未来发展路径是全面走向AI。出现这样的情况是谁都不想看到的。由于AI的随机性,未来识别可能会越来越难。

下图就是百度最新的AI中文成语点选的样例图

图片

没有办法,我们只能用AI去打败AI。经过我们不懈努力,我们终于完成了这款验证码的识别工作。经过几天多轮的测试。正确率达到了惊人的98%左右。

废话不多说,直接上代码。我这里使用的是python+selenium的方式,大家直接运行,可以更加直观看到点击识别的效果。如果想使用js逆向,请各位大神自行研究。

python版本是3.7,selenium==3.141.0

import os
import io
import sys
import time
import random
import base64
import requests
from io import BytesIO
from PIL import Image, ImageDraw
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver import FirefoxOptions# 用户的key
key = ''
# 记录成功次数
t = 0
# 记录失败次数
f = 0
# 打开邮政页面
option = FirefoxOptions()
# option.add_argument('--headless')
driver = webdriver.Firefox(executable_path=r'webdriver\geckodriver.exe', options=option)#PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)# base64_str = base64.b64encode(byte_data).decode(coding)return base64_str# 接口识别
def shibie(img, word):# 图片转base64img_base64 = PIL_base64(img)# 验证码识别接口url = "http://www.detayun.cn/openapi/verify_code_identify/"data = {# 用户的key"key": key,# 验证码类型"verify_idf_id": "45",# 样例图片"img_base64": img_base64,# 中文点选,空间语义类型验证码的文本描述(这里缺省为空字符串)"words": word,}header = {"Content-Type": "application/json"}# 发送请求调用接口response = requests.post(url=url, json=data, headers=header)# 判断是否正确请求if response.json()['code'] == 200:return eval(response.json()['data']['res_str'])else:print('参数错误,请前往得塔云了解详情:https://www.detayun.cn/tool/verifyCodeHomePage2/?_=1714093687434')print('错误参数:', response.json())return Nonefor i in range(2000):driver.get('https://seccaptcha.baidu.com/v1/webapi/verint/svcp.html?ak=M7bcdh2k6uqtYV5miaRiI8m8x6LIaONq&backurl=https%3A%2F%2Fwenku.baidu.com%2F%3F_wkts_%3D1705066238641&ext=ih2lW9VV3PmxmO%2B%2Bx8wZgk9i1xGx9WH05J9hI74kTEVkpokzRQ8QxLB082MG2VoQUUT15llYBwsC%2BAaysNoPxpuKg0Hkpo4qMzBjXDEGhuQ%3D&subid=pc_home&ts=1705066239&sign=1cebe634245cd92fc9eca10d0850a36b')time.sleep(3)html_str = driver.page_sourceif 'canvas' in html_str:if '请依次点击' in html_str:print('中文验证码')for j in range(2000):# 获取中文WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[@class="b6991750d5 "]'))word_tag = driver.find_element_by_xpath('//div[@class="b6991750d5 "]')# 获取<div>元素及其子元素的文本内容old_word =  word_tag.text  # 用于与刷新后对比words = word_tag.textwords = str(words).replace('请依次点击','').replace('"','').replace(' ','')print('页面点击中文:', words)# 等待画布加载完成WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('/html/body/div/div[2]/div/div/div/div[2]/canvas'))canvas_list = driver.find_elements_by_xpath('/html/body/div/div[2]/div/div/div/div[2]/canvas')# 图片列表img_list = []# 遍历所有的画布元素for canvas in canvas_list:# 使用JavaScript获取canvas的内容,并在WebDriver对象上调用execute_scriptcanvas_content = driver.execute_script("return arguments[0].toDataURL('image/png');", canvas)# 将base64编码的图片内容解码为字节img_bytes = base64.b64decode(canvas_content.split(',')[1])# 将字节转换为图片对象img = Image.open(io.BytesIO(img_bytes))img_list.append(img)# 合并所有图片为一张# 创建一个新的图片对象,用于合并所有的图片merged_img = Image.new('RGBA', (max(img.size[0] for img in img_list), max(img.size[1] for img in img_list)))# 将每个图片合并到merged_img上,保持透明度y_offset = 0for img in img_list:# 计算x偏移量以保持图片对齐(这里假设所有图片宽度相同)x_offset = 0# 将图片合并到merged_img上,保持透明度merged_img.paste(img, (x_offset, y_offset), img)# png图片转# 如果是png图片if str(merged_img.format).lower() == 'png':# 输出颜色模式if merged_img.mode == 'RGBA':# 创建一个新的白色背景图像white_background = Image.new('RGBA', merged_img.size, (255, 255, 255, 255))# 创建一个可以在白色背景上绘图的对象draw = ImageDraw.Draw(white_background)# 将原始的PNG图像粘贴到白色背景上,使用一个全白色的图像作为蒙版white_background.paste(merged_img, mask=merged_img)merged_img = white_background# img = img.convert('RGB')# 转换为JPG格式# 创建一个BytesIO对象output = io.BytesIO()# 将PNG图像转换为JPG格式并保存到BytesIO对象中merged_img.convert('RGB').save(output, 'JPEG')# 通过BytesIO对象创建PIL对象merged_img = Image.open(output)# 识别图片y = shibie(merged_img, words)if y == None:breakprint('识别结果:',y)# 页面点击ele = driver.find_element_by_xpath('//div[@class="b9c1b9d670"]')# 顺序点击文字for point in y:ActionChains(driver).move_to_element_with_offset(ele, point[0], point[1]).click().perform()time.sleep(0.5)# 判断是否成功 apptry:WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@id="app"]'))t += 1print('成功')print('总次数:{},成功:{},失败:{},正确率:{}'.format(t + f, t, f, t / (t + f)))breakexcept:f += 1print('失败')name = int(time.time() * 1000)# 保存合并后的图片到文件merged_img.save('error_img/{}.jpg'.format(name))print('总次数:{},成功:{},失败:{},正确率:{}'.format(t + f, t, f, t / (t + f)))# 点击刷新按钮WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//a[@class="b559997a43 b01b817824"]'))shuaxin_tag = driver.find_element_by_xpath('//a[@class="b559997a43 b01b817824"]')shuaxin_tag.click()# 判断是否刷新成功is_break = Falsefor k in range(20):try:WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[@class="b6991750d5 "]'))except:is_break = Truebreakword_tag = driver.find_element_by_xpath('//div[@class="b6991750d5 "]')# 获取<div>元素及其子元素的文本内容try:if '加载中...' == word_tag.text:time.sleep(1)continueif old_word != word_tag.text:breakelse:time.sleep(1)continueexcept:time.sleep(2)continueif is_break:breaktime.sleep(5)

想了解更多验证码识别,请访问:得塔云

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

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

相关文章

pandas入门

pandas入门 一、pandas简介1.1 pandas介绍1.2 pandas的基本功能 二、pandas快速入门2.1 读取数据2.2 验证数据2.3 建立索引2.4 数据抽取2.4.1 选择列2.4.2 选择行2.4.3 指定行和列 2.5 排序2.6 分组聚合2.7 数据转置2.8 增加列2.9 统计分析 一、pandas简介 1.1 pandas介绍 pa…

深度学习之基于YOLOv5草莓成熟度目标检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 草莓作为一种广受欢迎的水果&#xff0c;其成熟度的判断对于保证草莓的品质和口感至关重要。然…

Redis-五大数据类型-Zset(有序集合)

五大数据类型-Zset&#xff08;有序集合&#xff09; 简介 Zset与Set非常相似&#xff0c;是一个没有重复元素的String集合。 不同之处是Zset的每个元素都关联了一个分数&#xff08;score&#xff09;&#xff0c;这个分数被用来按照从低分到高分的方式排序集合中的元素。集…

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…

红黑树(RBTree)认识总结

一、认识红黑树 1.1 什么是红黑树&#xff1f; 红黑树是一种二叉搜索树&#xff0c;与普通搜索树不同的是&#xff0c;在每个节点上增加一个“颜色”变量 —— RED / BLACK 。 通过对各个节点颜色的限制&#xff0c;确保从 根 到 NIL &#xff0c;没有一条路径会比其他路径长出…

Golang | Leetcode Golang题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

视频改字祝福/豪车装X系统源码/小程序uniapp前端源码

uniapp视频改字祝福小程序源码&#xff0c;全开源。创意无限&#xff01;AI视频改字祝福&#xff0c;豪车装X系统源码开源&#xff0c;打造个性化祝福视频不再难&#xff01; 想要为你的朋友或家人送上一份特别的祝福&#xff0c;让他们感受到你的真诚与关怀吗&#xff1f;现在…

Linux-信号概念

1. 什么是信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送信号通知进程&#xff0c;进程进行后续处理 在日常生活中就有很多例子&#xff0c;比如打游戏方面王者荣耀的“进攻”&#xff0c;“撤退”&#xff0c;“请求集合”&#xff0c;“干得漂亮&#xff01…

【Unity动画系统】动画层级(Animation Layer)讲解与使用

如何使用Unity的Animation Layer和Avater Mask把多个动画组合使用 想让玩家持枪行走&#xff0c;但是手里只有行走和持枪站立的动作。 Unity中最方便的解决办法就是使用动画层级animation layer以及替身蒙版avatar mask。 创建一个动画层级 Weight表示权重&#xff0c;0的话则…

PXE高效批量网络装机

一.PXE概述 PXE批量部署的优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统、配置各种服务远程实现&#xff1a;不需要光盘、U盘等安装介质 PXE&#xff08;Preboot eXcution Environment&#xff09; 预启动执行环境&#xff0c;在操作系统之前运行 …

【从零开始学架构 前言】整体的学习路线

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;在工作6年左右的这个时间点需要有一些先行的理论来指导即将面临的复杂实践&#xff0c;以便在真正面临复杂实践的时候能有所参照。 主要从以下几个方面和顺序来进行学习 架构基础&#xff1a;从架构设计的本质、历史背景…

最详细的IP SSL证书介绍及申请渠道

JoySSL官网 注册码230918 在互联网的广阔舞台上&#xff0c;每个参与其中的设备都需要一个独一无二的标识——IP地址&#xff0c;以实现精准的通信和数据交换。随着网络安全重要性的日益凸显&#xff0c;如何验证和信任这些IP地址的真实性成为了一个核心问题。正是在这样的背景…

(数据分析方法)相关性分析

目录 一、定义 二、相关关系分类 三、数据可视化(散点图) 四、相关分析 4.1 量化指标 4.1.1 相关系数 4.1.1.1 皮尔森&#xff08;Pearson&#xff09;相关系数 4.1.1.2 斯皮尔曼&#xff08;Spearman&#xff09;相关系数 4.1.1.3 肯达尔&#xff08;Kendall&#xff…

JavaScript中的RegExp和Cookie

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f506;RegExp &#x1f3b2; 1 什么是正则表达式 &#x1f3b2;2 创建…

【go项目01_学习记录04】

学习记录 1 集成 Gorilla Mux1.1 为什么不选择 HttpRouter&#xff1f;1.2 安装 gorilla/mux1.3 使用 gorilla/mux1.4 迁移到 Gorilla Mux1.4.1 新增 homeHandler1.4.2 指定 Methods () 来区分请求方法1.4.3 请求路径参数和正则匹配1.4.4 命名路由与链接生成 1 集成 Gorilla Mu…

springboot+vue+elementui实现校园互助平台大作业、毕业设计

目录 一、项目介绍 二、项目截图 管理后台 1.登录&#xff08;默认管理员账号密码均为&#xff1a;admin&#xff09; 2. 用户管理 ​编辑 3.任务管理 互助单&#xff08;学生发布&#xff09; 行政单&#xff08;教师发布&#xff09; ​编辑 审核&#xff08;退回需…

【无标题】不锈钢轴承能耐高温多少度:开启润滑技术新纪元

江苏鲁岳SIAIF品牌的不锈钢耐高温轴承的具体耐高温性能会因轴承的型号、材料、制造工艺等因素而有所不同。然而&#xff0c;一般来说&#xff0c;不锈钢轴承的耐高温性能较高&#xff0c;可以在高温环境下正常工作。 根据相关资料&#xff0c;SIAIF不锈钢耐高温轴承可以在-60℃…

Linux基本指令(下下)

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客续我之前的Linux指令&#xff08;下&a…