首页 > 其他分享 >百度贝塞尔曲线证码识别代码

百度贝塞尔曲线证码识别代码

时间:2024-04-01 15:58:05浏览次数:31  
标签:证码 img format base64 贝塞尔 merged import div 百度

一、前言

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

下面是使用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.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()
 

标签:证码,img,format,base64,贝塞尔,merged,import,div,百度
From: https://blog.csdn.net/Dxy1239310216/article/details/137222683

相关文章

  • 百度大语言模型算法专家
    2024-03-2914:18:25百度大语言模型算法专家工作职责:负责基于海量数据的NLP/多模态大模型技术方向规划与关键技术突破研究方向包括但不限于,高效的大模型架构、多模态学习、自监督表征学习、跨任务统一学习、数据集建设、RLHF等以行业领先为目标,建设大模型技术并推动业务端(......
  • “百度杯”CTF比赛 九月场-SQL
    “百度杯”CTF比赛九月场SQL:题目类型:web题目描述:出题人就告诉你这是个注入,有种别走!打开题目靶机在url栏上看到id=1,又根据提示说明这是一道SQL注入的题型:解题方法:这里我们知道是SQL注入之后,就可以开始进行注入了第一步:先判断它的注入类型我们看一下id=2是显示什么结果:我......
  • 验证码demo(简单实现)
    前言我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo准备我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包网址:Hutool......
  • 权限、路径全部都正确,thinkphp验证码还是显示不出来解决
    尝试了各种方法,thinkphp验证码还是显示不出来解决方法:检查application/config.php和application/database.php等配置文件是否正确设置我遇到的是编码问题问题是怎么出现的呢?我从其他电脑移植到另外一台电脑,原电脑可以显示在另外一台电脑不能显示,我用文本文件修改......
  • “百度杯”CTF比赛 九月场-Upload
    “百度杯”CTF比赛九月场Upload:类型:web题目描述:想怎么传就怎么传,就是这么任性。tips:flag在flag.php中解题方法:打开靶机,获得题目链接是一个文件上传类型的:看到文件上传,就想到一句话木马,先上传一个一句话木马上去:<?php@eval($_POST["1"]);?>上传成功,我们点击这个上传......
  • 网络编程:百度api实现地理编码与逆地理编码
    1.使用geopy库实现百度地理位置编码功能:2.使用requests库实现百度地理位置编码功能:3.使用geocoder库实现百度地理位置编码功能:4.使用http.client库实现百度地理位置编码功能:5.使用socket库实现百度地理位置编码功能:6.使用学习的四个库实现百度地理位置逆编码功能:......
  • 百度轨迹验证码识别代码分享
    百度出了如图所示的验证码,需要拖动滑块,与如图所示的曲线轨迹进行重合。经过不断研究,终于解决了这个问题。我把识别代码分享给大家。下面是使用selenium进行验证的,这样可以看到轨迹滑动的过程,如果需要使用js逆向的大神,可以自行研究,谢谢。运行下面代码会直接进入验证码页面,可......
  • Email邮箱验证码发送
    以下文件保存到/static/email.txt<!DOCTYPEhtml><htmllang="en"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><title>邮箱验证码</title><style>table{......
  • 使用egg.js从qq发送验证码
    0.从qq获取授权码1.下载pnpminodemailer 2.service层asyncSendEmailByUserNameByUserPasswordByUserEmail(user){constnodemailer=require('nodemailer');constuser_email='abcd.com';//这里写发送者的qq号constauth_code=�......
  • “百度杯”CTF比赛 2017 二月场-爆破-2
    “百度杯”CTF比赛2017二月场爆破-2类型:misc-web题目描述:flag不在变量中。解题方法:打开靶机,得到一段php源码:代码审计:1.里面包含了flag.php文件2.获取hello的值,并用var_dump函数输出相关的变量信息我们试着传入参数:?hello=$GLOBALS这里我们发现flag的信息并没有在变......