百度轨迹验证码识别代码分享

news2024/9/25 3:25:38


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

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

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

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

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

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.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": "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 = 0
 
    for 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_source
        if '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_script
                    canvas_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 = 0
                for 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()
 
                # 判断是否成功 app
                try:
                    WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@id="app"]'))
                    t += 1
                    print('成功')
                except:
                    f += 1
                    print('失败')
 
                print('总次数:{},成功:{},失败:{},正确率:{}'.format(t + f, t, f, t/(t+f)))
 
 
if __name__ == '__main__':
    run()
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1542474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 MacOS 中安装

查看:OpenCV系列文章目录(持续更新中......) 上一篇:在基于 Android 相机预览的 CV 应用程序中使用 OpenCL 下一篇:基于ARM 的Linux系统的交叉编译 以下步骤已针对 MacOSX (Mavericks) 进行了…

KW音乐搜索参数

声明: 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标: …

IBM SPSS Statistics for Mac v27.0.1中文激活版

IBM SPSS Statistics for Mac是一款功能强大的统计分析软件,专为Mac用户设计,用于数据分析和决策支持。该软件拥有直观易用的界面和丰富多样的统计工具,使得用户可以轻松进行数据处理、分析和解释。 软件下载:IBM SPSS Statistics…

Uni-App电商模板,纯前端模板,可直接使用 实现全平台适配与高效功能

一、引言 随着移动互联网的快速发展,多平台应用开发已成为业界关注的焦点。Uni-App,作为一种前端框架,可以实现一套代码多端运行,大大提高了开发效率。本文将介绍如何使用Uni-App搭建一个电商模板,实现全平台适配与高…

【vue核心技术实战精讲】1.3 - 1.6 VUE 指令 (上)

前言 上节,我们学习了 Vue的起步 和 插值表达式 本节内容 Vue指令之v-text 和 v-htmlVue指令之v-if 和 v-showVue指令之v-bind绑定Vue指令之v-on事件处理 1、v-text 和 v-html {{}} 和v-text的作用是一样的 都是插入值,直接渲染 ≈ innerTextv-html既能插入值 又能插入标签…

unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)

切换一下布局就行了。 附:Road Architect教学地址

24. UE5 RPG制作属性面板(二)

在上一篇中,我们创建属性面板的大部分样式,这一篇里面接着制作。 在这一篇里我们需要有以下几个方面: 在界面增加一个属性按钮。属性按钮增加事件,点击时可以打开属性面板,属性面板打开时无法再次点击按钮。点击属性面…

Google ScreenAI代表了一款先进的视觉语言模型,专为用户界面(UI)和视觉情境下的语言理解而设计

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue 实现带拖动功能的时间轴

1.效果图 2. 当使用timeline-slider-vue组件时,你可以设置以下属性: date:用于设置时间轴滑块的初始日期,格式通常为 YYYY-MM-DD。 mask:一个布尔值,用于控制是否显示背景遮罩。 markDate:一…

月之暗面Kimi代码分析能力评测

最近打算重构一下PawSQL优化引擎中的OR条件的SELECT重写优化策略的代码,时间有点久,代码有点复杂,看到网上对新出了KIMI评价很高。于是尝试用它来理解一下代码。上传了此优化重写的代码,提问: 第一问,设计…

HTTPS:原理、使用方法及安全威胁

文章目录 一、HTTPS技术原理1.1 主要技术原理1.2 HTTPS的工作过程1.2.1 握手阶段1.2.2 数据传输阶段 1.3 HTTPS的安全性 二、HTTPS使用方法三、HTTPS安全威胁四、总结 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)&am…

UDS诊断 CANoe使用(线下实操项目)

本周末2天的时间,可以线下带大家对车载项目: uds诊断进行实操训练和CANoe工具的灵活使用 本博主从事新能源汽车的研发部,主要是嵌入式方面的,对车载测试的底层逻辑非常熟悉。 需要项目或者CANoe工具实操的可以关注并私信我

知攻善防应急靶场-Linux(2)

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全应急响应和知攻善防实验室靶场,记录自己的学习过程&am…

mac 解决随机出现的蓝色框

macbookair为什么打字的时候按空格键会出现蓝色框? - 知乎

09、ArrayList

ArrayList 文章目录 ArrayList集合与数组ArrayList集合进阶集合体系结构Collection集合List集合(接口)数据结构ArrayList集合LinkedList集合 Set集合HashSet 双列集合创建不可变集合 集合与数组 自动扩容 无法存储基本数据类型,只能将其变为…

CVPR 2024中有哪些值得关注的视频生成和视频编辑方向的论文?

Diffusion Models视频生成-博客汇总 前言:轰轰烈烈的CVPR 2024所有accept paper已经全部公开,随着Sora的爆火,视频生成和视频编辑是目前计算机视觉最火热的方向,受到了很多人的关注。这篇博客就整理盘点一下有哪些值得关注的视频生成和视频编辑方向的论文?值得做这个方向的…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师(进阶)》是由“ i春秋学院联合网易安全部”出品,资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战,帮助学员纵向提升技能,横向拓宽视野,牢靠掌握Web安全工程师核心…

HMI界面之:医疗设备界面

一、什么是医疗HMI界面 医疗HMI界面是指医疗设备或系统中的人机界面(Human-Machine Interface),用于与医疗设备进行交互和操作的界面。它是医疗设备中的重要组成部分,通过图形化、直观化的界面,使医护人员能够方便地控…

Vue 3中实现基于角色的权限认证实现思路

一、基于角色的权限认证主要步骤 在Vue 3中实现基于角色的权限认证通常涉及以下几个主要步骤: 定义角色和权限:首先需要在后端服务定义不同的角色和它们对应的权限。权限可以是对特定资源的访问权限,比如读取、写入、修改等。用户认证&#…

【Linux】写个日志和再谈线程池

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:信号量和线程池 目录 👉🏻日志代码Log.cppMain.cc 👉🏻线程池代码LockGuard.hpp(自定义互斥锁,进…