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

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

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

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 使用