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

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

相关文章

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

SpringBoot如何集成Kaptcha验证码

《SpringBoot如何集成Kaptcha验证码》本文介绍了如何在Java开发中使用Kaptcha生成验证码的功能,包括在pom.xml中配置依赖、在系统公共配置类中添加配置、在控制器中添加生成验证... 目录SpringBoot集成Kaptcha验证码简介实现步骤1. 在 pom.XML 配置文件中2.

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了