首页 > 其他分享 >百度文库验证码识别

百度文库验证码识别

时间:2024-04-11 09:30:11浏览次数:27  
标签:文库 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/137490567

相关文章

  • Guitar Pro 8中文破解版 2024最新安装激活教程 Guitar Pro8无需许可证 Guitar Pro 8百
    GuitarPro8这款软件是吉他爱好者们的必备之选,它以其卓越的功能和优势,全面覆盖学习演奏和绘谱创作的需求,帮助吉他爱好者们更好地提升自己的技能。GuitarPro8中文破解版是一款专门针对吉他、五弦琴、以及贝斯爱好者打造而成的阅读器和编辑器软件,是系列软件的最新版本。这款软......
  • 百度驾驶证C++离线SDK V1.1 C#接入
    百度驾驶证C++离线SDKV1.1C#接入目录说明 效果 项目代码下载 说明 自己根据SDK封装了动态库,然后C#调用。SDK包结构效果 项目代码usingNewtonsoft.Json;usingOpenCvSharp;usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnosti......
  • 百度网盘2024永久免费svip免费兑换码及使用教程
    很多新手用户在使用百度网盘时找不到自己下载后的文件在哪,其实百度网盘安装之后就会有默认的下载路径,其实只要跟着小编下面的教程一起操作,就能快速找到文件的下载路径。百度网盘下载的文件在哪?https://snsyun.baidu.com/sl/mg8TQEO​​​​​​​电脑端下载路径:1、打开百......
  • asp.net KindEditor编辑器整合百度WebUploader插件批量上传图片
    集成背景说明多个图片进行批量上传新版本浏览器兼容性问题处理,原编辑器上传图片功能使用flash上传插件,由于最新版本浏览器不再支持flash,重新集成新的上传插件,对编辑器进行改造升级。一、KindEditor介绍KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即......
  • 百度公司真的太差劲了--客服全是套话,规则全是霸王条款
    结论与应对:对百度需要避而远之,尽量不要产生相关联系,不可信任。主题:百度公司真的太差劲了--客服全是套话,规则全是霸王条款。事情内容:1.2019年使用百度网盘,将自己很多学习资料做了存储,也存在BT下载的盗版电影;2.结果突然被告知因为涉及XXOO,百度网盘永久封......
  • 华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看
    华为手机鸿蒙系统或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看 连接电脑后一般在这里位置计算机\Mate20Pro(UD)\内部存储\Download\BaiduNetdisk也就是用usb(数据线,不是充电线,要四心的)连接手机后,打开手机盘,download目录 ......
  • 什么是百度排名技术
    什么是百度排名技术百度排名是指在百度搜索引擎中,网站或网页在特定关键词搜索时的排名情况。百度排名可以直接影响网站的流量和曝光度,因此对于网络营销和推广非常重要。#百度排名讲一下就是蜘蛛池的一个配置和维护,我们上一节课想好了一个选择好我们的域名服务器和植入池的一......
  • 图形验证码处理
    importbase64importjsonimportrequestsimportuuidclassImageCode:#调用图片验证码原有接口获取编码defget_image(self,uuid):url="http://shop.lemonban.com:8108/captcha.jpg"data={"uuid":uuid}#get请求对表格进行......
  • 全量知识系统 程序详细设计 “三次演算” 再探(Q&A)之2 (百度搜索)
    说明:以下关于全知系统中程序详细设计的沟通是基于今天正在完成中的全量知识系统程序详细设计之“命名法”“正文”的"前言"之1“前提”篇中提出的所有程序要求的基础上的。(这些相同问题的同时沟通 )Q1.这些规则在程序被设计为λ表达式的三个转换规则,分别适用于三条线......
  • 百度云网盘svip超级会员激活码2024
    百度网盘SVIP会员是百度网盘提供的超级会员服务,它为用户提供了许多高级功能和特权。以下是对百度网盘SVIP会员的详细介绍:首先,SVIP会员可以享受超大的存储空间,容量高达5T,让用户无需担心存储空间不足的问题,轻松存储大量的文件和数据。其次,SVIP会员拥有极速下载特权。这意味着......