百度文库曲线验证码识别方案

2024-04-15 15:52

本文主要是介绍百度文库曲线验证码识别方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

百度出了如图所示的验证码,需要拖动滑块,与如图所示的曲线轨迹进行重合。经过不断研究,终于解决了这个问题。我把识别代码分享给大家。

下面是使用selenium进行验证的,这样可以看到轨迹滑动的过程,如果需要使用js逆向的大神,可以自行研究,谢谢。

运行下面代码会直接进入验证码页面,可能会出现百度旋转验证码,我会通过刷新的方式,刷出百度曲线轨迹验证码。当出现验证码后会进行识别,然后计算滑动像素距离,然后进行拖动滑块,最后自动判断是否验证通过,并记录正确率,大家可以自行尝试。

具体的代码分享在下发,可能会因为selenium版本不同,导致部分语法略有不同,大家可以使用GPT进行一下转换。

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

二、识别代码

下面代码是我简单写的,有可能会有bug或写得不好的地方也请大神指教。如果对下面代码有疑问也可以给我留言、评论、私信。

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#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)return base64_str# 识别滑动距离
def shibie(img):# 图片转base64img_base64 = PIL_base64(img)# 验证码识别接口url = "http://www.detayun.cn/openapi/verify_code_identify/"data = {# 用户的key"key": "CcoAB3Cd78wXFQ07Zz3",# 验证码类型"verify_idf_id": "43",# 大图"img_base64": img_base64,}header = {"Content-Type": "application/json"}# 发送请求调用接口response = requests.post(url=url, json=data, headers=header)data = response.json()if data['code'] == 200:return data['data']['distance']else:print('状态码异常:',data)return# 运行程序
def run():# 打开邮政页面option = FirefoxOptions()# option.add_argument('--headless')driver = webdriver.Firefox(executable_path=r'webdriver\geckodriver.exe', options=option)# 记录成功次数t = 0#记录失败次数f = 0for 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('曲线验证码')# 等待画布加载完成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)print('滑动距离为:', y)# 等待滑块出现WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('/html/body/div/div[2]/div/div/div/div[3]/div/div[2]'))yzm_button = driver.find_element_by_xpath('/html/body/div/div[2]/div/div/div/div[3]/div/div[2]')# 滑动滑块action = ActionChains(driver)action.click_and_hold(yzm_button).perform()# 计算实际滑动距离 = 像素距离 + 前面空白距离action.move_by_offset(y, 0)action.release().perform()# 判断是否成功 apptry:WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@id="app"]'))t += 1print('成功')except:f += 1print('失败')print('总次数:{},成功:{},失败:{},正确率:{}'.format(t + f, t, f, t/(t+f)))if __name__ == '__main__':run()

这篇关于百度文库曲线验证码识别方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906250

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe