首页 > 其他分享 >百度文库最新AI旋转验证码识别

百度文库最新AI旋转验证码识别

时间:2024-06-02 17:29:30浏览次数:11  
标签:文库 img format AI move 验证码 str import

上个月发现百度文库最新出了一个验证码,是AI生成的。内容每次可能都不一样,所以给识别造成 了很大困难。传统的比对放松完全失效。

一、介绍

这个是最近才出的最新验证码,内容主要以工厂、建筑、山峰、机器人、汽车、盆栽植物等为主。如下图所示

优点:

解决了图片种类有限的问题,AI验证码可以随机生成,生成种类无限多,每天都不一样,给识别造成很大困难。

缺点:

AI生成的图片可能不符合逻辑,甚至连真人都识别不了,会给用户体验带来不好的影响。如下图所示

我们经过几周的研究, 终于解决了百度AI旋转验证码的识别问题。下面是我们提供的识别代码,感兴趣的小伙伴可以把它转换成js逆向的方式进行验证。运行下面代码,会直接触发验证码。然后可以看到识别过程。

想要识别更多验证码请查看:得塔云

二、识别代码

下面是我用Python + selenium 实现的自动识别代码。正确率在70%左右。python版本是3.7,selenium==3.141.0。直接运行下面代码,可以直接触发验证码,验证码有很多种,这里我们只会挑选挑选旋转验证码进行识别。其他类型的识别可以访问 :得塔云

import os
import sys
import time
import random
import base64
import requests
import io
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 = '9vMU6EzIgmtfEuZe8iIw'
 
#PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):
    img_format = img.format
    if 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)
 
    return base64_str
 
# 接口识别
def shibie(img):
    # 图片转base64
    img_base64 = PIL_base64(img)
    # 验证码识别接口
    url = "http://www.detayun.cn/openapi/verify_code_identify/"
    data = {
        # 用户的key
        "key": key,
        # 验证码类型
        "verify_idf_id": "44",
        # 样例图片
        "img_base64": img_base64,
    }
    header = {"Content-Type": "application/json"}
 
    # 发送请求调用接口
    response = requests.post(url=url, json=data, headers=header)
    # 判断是否正确请求
    if response.json()['code'] == 200:
        print(response.json())
        return response.json()['data']['angle']
    else:
        print('参数错误,请前往得塔云了解详情:https://www.detayun.cn/tool/verifyCodeHomePage2/?_=1714093687434')
        print('错误参数:', response.json())
        return None
 
 
 
# 浏览器配置
option = FirefoxOptions()
# option.add_argument('--headless')
driver = webdriver.Firefox(executable_path=r'webdriver\geckodriver.exe', options=option)
 
# 记录成功次数
t = 0
# 记录失败次数
f = 0
 
for i in range(200):
    # 打开验证码页面
    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_source
    if 'canvas' in html_str:
        if '曲线' in html_str:
            print('曲线验证码')
 
        elif '数值' in html_str or '数字' in html_str:
            print('数值验证码')
    else:
        print('旋转验证码')
        # 等待图片出现
        WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//img[@class="passMod_spin-background"]'))
        img = driver.find_element_by_xpath('//img[@class="passMod_spin-background"]')
        img_url = img.get_attribute('src')
 
        # 下载图片
        header = {
            "Host": "passport.baidu.com",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
            "Accept": "image/webp,*/*",
            "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
            "Accept-Encoding": "gzip, deflate, br",
            "Connection": "keep-alive",
            "Referer": "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",
            "Cookie": "BAIDUID=A0621DC238F4D936B38F699B70A7E41F:SL=0:NR=10:FG=1; BIDUPSID=A0621DC238F4D9360CD42C9C31352635; PSTM=1667351865; HOSUPPORT=1; UBI=fi_PncwhpxZ%7ETaKAanh2ue0vFk6vHMY02DgvigILJIFul8Z1nzMr9do3SYLtjAUqHSpUz7LvOKV27cIr18-YJryP0Q8j92oo93%7E6hGa0CLdraAlaHUZG-0PW9QrpZkW7MTyUn-yrAq7OmSRBIJ7%7E8gM9pv-; HISTORY=0ece87e30ec8ecccd52ff3d5c42f98002a893bfb73ff358893; BDUSS_BFESS=kwTVdpeFNORXlWVEozbW1kcFhBeHo0ZWQwbVlJNlBvcFhEWWpRZVJQWGhzbnBsSUFBQUFBJCQAAAAAAAAAAAEAAAC13Mct0KHQwl9keHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOElU2XhJVNld1; H_WISE_SIDS=219946_216846_213346_219942_213039_230178_204909_230288_110085_236307_243888_244730_245412_243706_232281_249910_247148_250889_249892_252577_234296_253427_253705_240590_254471_179345_254689_254884_254864_253213_255713_254765_255939_255959_255982_107317_256062_256093_256083_255803_253993_256257_255661_256025_256223_256439_256446_254831_253151_256252_256196_256726_256739_251973_256230_256611_256996_257068_257079_257047_254075_257110_257208_251196_254144_257290_251068_256095_257287_254317_251059_251133_254299_257454_257302_255317_255907_255324_257481_244258_257582_257542_257503_255177_257745_257786_257937_257167_257904_197096_257586_257402_255231_257790_258193_258248_258165_8000084_8000115_8000114_8000126_8000140_8000149_8000166_8000172_8000178_8000181_8000185_8000204; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1700546200; MAWEBCUID=web_VYfxPuQDaKjEzVgXMFgoHouACkpXyjcDpcWwhATKqELuuwEtNy; BAIDUID_BFESS=A0621DC238F4D936B38F699B70A7E41F:SL=0:NR=10:FG=1; H_PS_PSSID=40206_40215_40080_40352_40379_40416_40300_40466_40471_40317; ZFY=j0lpzcgUac2hW5oc8GUPbnW9ug8zMx:B7VJa:AnxqPUaQ:C; BDRCVFR[gltLrB7qNCt]=mk3SLVN4HKm; delPer=0; PSINO=6",
 
        }
        response = requests.get(url=img_url, headers=header)
        img = Image.open(BytesIO(response.content))
        # 识别角度  360度对应238像素
        angle = shibie(img)
 
        # 计算滑动距离
        move_x = int(angle * (238 / 360))
        if move_x >= 238:
            move_x = 237
        elif move_x < 10:
            move_x = 10
 
        print(angle, move_x)
        # 获取滑块
        WebDriverWait(driver, 20).until(lambda x: x.find_element_by_xpath('//div[@class="passMod_slide-btn "]'))
        tag = driver.find_element_by_xpath('//div[@class="passMod_slide-btn "]')
 
        # 滑动滑块
        action = ActionChains(driver)
        action.click_and_hold(tag).perform()
        # 计算实际滑动距离 = 像素距离 + 前面空白距离
        if move_x+11 < 238:
            action.move_by_offset(move_x+11, 5)
            action.move_by_offset(-15, -2)
            action.move_by_offset(4, 3)
        else:
            action.move_by_offset(move_x - 11, 5)
            action.move_by_offset(7, -2)
            action.move_by_offset(4, 3)
        action.release().perform()
 
        # 判断是否成功 app
        try:
            WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@id="app"]'))
            t += 1
            print('成功')
        except:
            f += 1
            print('失败')
            time.sleep(2)
        print('总次数:{},成功:{},失败:{},正确率:{}'.format(t + f, t, f, t / (t + f)))

标签:文库,img,format,AI,move,验证码,str,import
From: https://blog.csdn.net/Dxy1239310216/article/details/139223181

相关文章

  • python系列&AI系列:Gradio库的安装和使用教程
    Gradio库的安装和使用教程Gradio库的安装和使用教程一、Gradio库的安装二、Gradio的使用1、导入Gradio库2、创建Gradio接口3、添加接口到Gradio应用4、处理用户输入和模型输出5、关闭Gradio应用界面三、Gradio的高级用法1、多语言支持2、自定义输入和输出格式3、模型版......
  • python系列&AIi系列(参考性极强):【完全攻略】Gradio:建立机器学习网页APP
    【完全攻略】Gradio:建立机器学习网页APP【完全攻略】Gradio:建立机器学习网页APP前言一、Gradio介绍以及安装1-1、Gradio介绍Gradio:1-2、安装二、快速开始(初步了解)2-1、简单小栗子2-2、多输入多输出2-3、简易聊天机器人三、关键技术3-1、带有样例的输入3-2、提示弹窗3-......
  • 【AI Generated】NaiveUI实战
    NaiveUI实战目录引言准备工作NaiveUI基础3.1安装与配置3.2快速开始常用控件4.1Button按钮4.2Input输入框4.3Select选择框4.4Checkbox复选框4.5Radio单选框4.6Switch开关4.7DatePicker日期选择器4.8TimePicker时间选择器4.9Form表单4.1......
  • 【AI Generated】从零学习Vue.js
    从零学习Vue.js目录引言准备工作Vue.js基础3.1Vue实例3.2模板语法3.3数据绑定3.4计算属性和侦听器3.5Class与Style绑定3.6条件渲染3.7列表渲染3.8事件处理3.9表单输入绑定Vue.js组件4.1组件基础4.2组件注册4.3父子组件通信4.4插槽4.5......
  • AI 助力古诗 MV 音乐:火爆赛道,新手也能轻松掘金
    今天,给大家介绍一个流量超级火爆的赛道——用AI生成古诗MV音乐。古诗作为中华文化的瑰宝,一直以来都以其独特的韵味和深刻的内涵吸引着无数文学爱好者。而现在,通过AI技术,我们可以将古诗与音乐相结合,创造出全新的艺术形式。这种结合不仅能够让古诗焕发出新的生命力,也......
  • Daily Training & 推荐文章
    前言:放一起了。\(\texttt{DailyTraining}\)懒得写详细题解,有冒号及后面的文字的表示做了,只有成套的打算做的才会放进来,有些题是同系列的以前做过的,比较喜欢的题会用\(\texttt{*}\)标出,半颗(\(\degree\))就是普通略好,一颗一般是有趣,两颗一般是有趣或者妙妙,三颗一般是妙妙或者牛......
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
    广度优先搜索(Breadth-FirstSearch,简称BFS)是一种用于图或者树的搜索算法,它的特点是按照“广度”进行搜索,即在扩展搜索路线的时候,BFS会先考虑当前节点的所有邻近节点,也就是说,它逐层地进行搜索。文章目录基本原理实现方法应用场景总结基本原理广度优先搜索的基本......
  • LangChain 0.2 - 构建本地 RAG应用
    本文翻译整理自:BuildaLocalRAGApplicationhttps://python.langchain.com/v0.2/docs/tutorials/local_rag/文章目录一、项目说明二、文档加载三、模型1、LLaMA22、GPT4All3、llamafile四、链式使用五、问答六、检索问答一、项目说明PrivateGPT、llama.cpp、......
  • 【会议征稿,ACM出版】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024,7
    2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC2024)将于2024年7月19-21日在中国·珠海召开。本次会议主要围绕“人工智能、自动化与高性能计算”的最新研究展开,旨在荟聚世界各地该领域的专家、学者、研究人员及相关从业人员,分享研究成果,探索热点问题,交流新的经......
  • 【会议征稿,中国算力大会分会】2024算法、高性能计算与人工智能国际学术会议(AHPCAI 202
    2024算法、高性能计算与人工智能国际学术会议(AHPCAI2024)定于2024年6月21-23日在中国郑州举行。会议主要围绕算法、高性能计算与人工智能等研究领域展开讨论。会议旨在为从事算法、高性能计算与人工智能研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和......