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

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

时间:2024-05-24 16:26:20浏览次数:22  
标签:文库 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/139055304

相关文章

  • tdmpc2 Failed to make environment
    问题描述https://github.com/nicklashansen/tdmpc2readme文档的例子是pythontrain.pytask=dog-runsteps=7000000,然后我想跑下metaworld中的assembly-v2任务,就得到下面的错误$pythontrain.pytask=assemblyValueError:Failedtomakeenvironment"assembly":ple......
  • Docker安装Portainer(docker容器管理工具)
    1.拉取镜像dockerpullportainer/portainer-ce:latest2. 启动portainer(默认端口9000)dockerrun-d\--nameportainer\-p9000:9000\--restart=always\-v/var/run/docker.sock:/var/run/docker.sock\-vportainer_data:/data\--privileged=true\portaine......
  • Ollama+Open WebUI本地搭建大模型并发布公网分享好友体验AI交互
    文章目录前言1.运行Ollama2.安装OpenWebUI2.1在Windows系统安装Docker2.2使用Docker部署OpenWebUI3.安装内网穿透工具4.创建固定公网地址前言本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装OpenWebUI结合cpolar内网穿透软件,实......
  • AI现状与未来
    现状在当今社会,人工智能(AI)正如一个蹒跚学步的孩子,虽然有些“智障”,但却充满了无限的可能性。现有的AI技术已经在许多领域展现出了显著的优势,但在处理复杂、具备高度创造性和情感理解的任务时,仍然显得有些力不从心。AI与人类的成长逻辑完全不同。对于人类来说,知识的积累和学习......
  • AI大模型怎么学?你算问对人了
    AI大模型发展得如火如荼,可以遇见未来的千行百业都会被AI重塑,想要跟上AI科技发展的浪潮,唯有学习AI,认识AI,应用AI。于是整理了目前市面上关于AI大模型的学习资料,供你学习时选择适合自己的资料。遗憾的是书籍和课程笔者未全部看过(后续会继续分享AI实践、已阅书籍和学习课程的相......
  • 华为云受邀出席AICon2024 分享AI Agent在企业生产中的技术实践
    近日,InfoQ在北京举办行业技术盛会——AICon全球人工智能开发与应用大会2024,华为云aPaaS首席架构师陈星亮受邀出席,和技术爱好者分享AIAgent在企业生产中的技术实践。大模型技术发展浪潮下,AIAgent成为新一代AI原生应用范式。当前,在问答、交互类应用中,大模型+AIAgent已经给用......
  • Python生成随机验证码
    importrandomfromPILimportImage,ImageDraw,ImageFont,ImageFilterdefcheck_code(width=120,height=30,char_length=5,font_file='Monaco.ttf',font_size=28):code=[]"""Image.new方法用于创建一个新的图像对象。mo......
  • CF Round946 (Div. 3)C:map的map<pair<int,int>int>映射 + 性质
    BeautifulTriplePairs题目描述Polycarpwasgivenanarray$a$of$n$integers.Hereallylikestriplesofnumbers,soforeach$j$($1\lej\len-2$)hewrotedownatripleofelements$[a_j,a_{j+1},a_{j+2}]$.Polycarpconsidersapa......
  • 使用本地大语言模型和Langchain手搓免费的AI搜索问答助手
    1概述大语言模型虽然已经有了很多的背景知识,但针对模型训练之后新产生的内容,或者领域内的知识进行提问,大模型本身通常无法准确给出回应,一个常用的解决方法是,借助检索增强生成(RAG),将能够用于回答问题的相关上下文给到大模型,利用大模型强大的理解和生成能力,来缓解这个问题。本文主......
  • DdddOcr 带带弟弟OCR通用验证码和 JAVA调用
    本文主要参考DdddOcr发布的最新版本启动服务端,以及JAVA如何和服务端对接。DdddOcr,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。DdddOcr、最简依赖......