当前位置:

首页 > 编程开发 > 如何实现Python中的行为验证码验证功能?

如何实现Python中的行为验证码验证功能?

验证类型概述滑动拼图创新行为式验证,轻松一滑完成拼图,体验极佳,秒速通过验证。简洁高效,在保障用户极致体验的同时,抵御机器风险。适用于追求用户体验的场景。#生成背景图basemap1=Image.open(bg).convert("RGBA")#背景图ifbasemap1.size!=size:#需要裁切或拉伸basemap1=Graphics.crop(basemap1,size[0],size[1])puzzle1=Image.open(url_absolute(img)).convert("RGBA

本文目录

    验证类型概述

    滑动拼图

    创新行为式验证,轻松一滑完成拼图,体验极佳,秒速通过验证。简洁高效,在保障用户极致体验的同时,抵御机器风险。适用于追求用户体验的场景。

    # 生成背景图
      basemap1 = Image.open(bg).convert("RGBA")  # 背景图
      if basemap1.size != size:  # 需要裁切或拉伸
          basemap1 = Graphics.crop(basemap1, size[0], size[1])
      puzzle1 = Image.open(url_absolute(img)).convert("RGBA")  # 方块图,蒙板
      # 旋转角度
      if rotate == 2:
          angle = randint(0, 360)
      elif rotate == 1:
          angle = choice([0, 90, 180, 270])
      else:
          angle = 0
      # angle = 45
      if angle: puzzle1 = puzzle1.rotate(angle, resample=Image.Resampling.BILINEAR)
    
      puzzle1.putalpha(ImageEnhance.Brightness(puzzle1.split()[3]).enhance(alpha))  # 设置透明度,0-1之间
      # 产生随机位置
      img_size = puzzle1.size  # 滑动图片尺寸
      spacing = 0  # 滑动图片在底图位置四周间距,暂时使用0,小图片中的图案本身有20px边距
      # 随机位置
      x = randint(img_size[0] + spacing, size[0] - img_size[0] - spacing)
      y = randint(spacing, size[1] - img_size[1] - spacing)
      basemap1.paste(puzzle1, (x, y), puzzle1)  # 拷贝
    
      # 方块滑动图
      # basemap2 = Image.open(url_absolute(bg)).convert("RGBA")
      basemap2 = Image.open(bg).convert("RGBA")
      if basemap2.size != size:  # 需要裁切或拉伸
          basemap2 = Graphics.crop(basemap2, size[0], size[1])
      puzzle2 = Image.open(url_absolute(img)).convert("RGBA")
      if angle: puzzle2 = puzzle2.rotate(angle, resample=Image.Resampling.BILINEAR)  # 旋转
    
      basemap2 = basemap2.crop((x, y, x + img_size[0], y + img_size[1]))  # 裁切
      puzzle2.paste(basemap2, (0, 0), puzzle2)
      # 替换成长条形滑动块
      strip = Image.new('RGBA', (img_size[0], size[1]), (255, 255, 255, 0))
      strip.paste(puzzle2, (0, y), puzzle2)  # 拷贝

    文字点选

    顺序点击图中文字,全新行为验证,安全性极高,保障验证安全。提高机器识别难度的同时,保证真实用户可读。适用于安全要求较高的业务场景。

    def random_character(self, length=None, type=[0, 1, 2, 3], repeat=False):
      """
      生成随机字符
      :param length: 生成的字符长度,几个字符
      :param type: [0] 数字,[1] 大写字母,[2]小写字母,[3] 特殊字符
      :param repeat: 是否允许重复字符
      :return [("A", 1, "大写字母"), ("8", 0, "数字"), ("a", 2, "小写字母"), ("", 3, "高跟鞋") ...]
      """
      if length is None: length = self.str_count
      # length = 10
      # type = [0]
      string = "".join(dict([(key, {
          0: "2345678923456789",
          1: "ABCDEFGHJKLMNQRTY",
          2: "abcdefghijkmnqrty",
          3: "",
      }[key]) for key in type]).values())
    
      r = []
      for i in range(length):
          if repeat:  # 允许重复
              s = choice(string)
              t = Inference.char_type(s)
              r.append((s, t[0], t[1]))
          else:
              anti = 0  # 防止死循环,尝试一定次数后允许字符重复
              while True:
                  anti += 1
                  s = choice(string)
                  t = Inference.char_type(s)
                  st = "".join([it[0] for it in r])
                  if s not in st or anti > 30:
                      r.append((s, t[0], t[1]))
                      break
      # 替换 n 个字母为图形字符
      if 3 in type:
          index = sample([i for i in range(length)], randint(0, length))  # 随机一组索引值:[0, 3, 1]
          icon_char = sample(self.icon_str, len(index))  # 随机取出 n 组特殊字符
          x = 0
          for i in index:
              # r = Inference.char_replace(r, i, icon_char[x][1])
              r[i] = (icon_char[x][1], 3, icon_char[x][2])
              x += 1
      return r

    语序点选

    根据中文语义,按顺序依次点击图中文字,语义理解能力结合行为轨迹。适用于安全要求较高的业务场景。

    下面举例说说的干扰点与干扰线的制作:

    # 噪线
      for i in range(line_count):
          x1 = randint(0, size[0])
          x2 = randint(0, size[0])
          y1 = randint(0, size[1])
          y2 = randint(0, size[1])
          draw.line((x1, y1, x2, y2), fill=Word.get_random_color())
    
      # 噪点
      for i in range(point_count):
          draw.point([randint(0, size[0]), randint(0, size[1])], fill=Word.get_random_color())
          x = randint(0, size[0])
          y = randint(0, size[1])
          draw.arc((x, y, x + 4, y + 4), 0, 90, fill=Word.get_random_color())

    字体识别

    点击与其它字符不同字体的文字,用户仅需一次点击,即可进行安全验证。适用于安全要求超高的业务场景。

    # 字体识别
    if type in (10, 11, 12):  # 789生成成语/固定字符
        str_count = 1
        str_inter = numeric(str_inter, 2, 20)  # 干扰字符不能少于2
        v_font = sample(ttf, 2)  # 随机选出两种字体
    
    string = []
    for i in range(str_count + str_inter):
    
        if type in (10, 11, 12):  # 字体识别,只使用两种字体
            font_file = v_font[0] if i == 0 else v_font[1]
        else:  # 随机字体
            font_file = choice(ttf)
    
        font = ImageFont.truetype(url_absolute(font_file), size=font_size)
    
        # 成语/使用固定字符,前n个字符使用成语字符
        random_char = idiom[i:i+1] if idiom else ""
    
        # 随机字符串及补充固定字符时追加干扰字符
        if random_char == "":
            head = randint(0xb0, 0xf7)
            body = randint(0xa1, 0xfe)
            random_char = bytes.fromhex(f'{head:x} {body:x}').decode("gb18030")
    
        # print(random_char, font_file)
    
        # 随机位置
        anti = 0  # 防止字体设置过大或者图片设置过小,导致死循环,尝试一定次数后允许字符重叠
        while True:  # 防止文字重叠
            anti += 1
            x = randint(0, size[0] - font_size)
            y = randint(0, size[1] - font_size)
            find = True
            for s in string:
                if abs(x - s[1]) < font_size and abs(y - s[2]) < font_size:
                    find = False
                    break
            if find or not string or anti > 20: break
    
        # 创建文字图片,可旋转
        str_bg = Image.new("RGBA", (font_size, font_size), (255, 255, 255, 0))  # 文字用空白图层
        str_draw = ImageDraw.Draw(str_bg)
        str_draw.text((0, 0), random_char, Word.get_random_color(), font=font)  # 添加文字
        angle = randint(-75, 75) if rotate else 0  # 是否随机角度
        str_bg = str_bg.rotate(angle, resample=Image.Resampling.BILINEAR, expand=0)  # 随机旋转
    
        basemap.paste(str_bg, (x, y), str_bg)  # 图片与文字合并
    
        # 保存随机字符及位置
        string.append([random_char, x, y, -angle])  # 字符、x、y、角度(正负转换,转用CSS顺时针旋转形式)

    空间推理

    根据提示,点击对应的元素。逻辑解题能力结合图形符号等元素识别能力。适用于安全要求超高的业务场景。

    下面举例几种验证方式:

    def send_color2differ(self):
            """ 请点击一个颜色不一样的字符 """
            color = self.color_name(2)  # 获取 2 组带中文名称的颜色 [('蓝色', '#0000FF'), ]
            data = []
            for i in range(self.str_count):
                # data/在图片上生成的数据
                data.append({
                    "str": self.string[i][0],  # 字符内容
                    "X": self.coord[i][0],  # x 位置
                    "Y": self.coord[i][1],  # y 位置
                    "color": color[0][1] if i == 0 else color[1][1],
                    "angle": self.angle[i],
                    "icon": True if self.string[i][1] == 3 else False,  # 是否为图形字符
                })
            # hint/操作说明文字
            hint = f'请点击一个 颜色不一样 的 {self.string[0][2]}'
            str = [(data[0]["str"], data[0]["X"], data[0]["Y"], data[0]["angle"]), ]
            return {"data": data, "str": str, "hint": hint}
    
    def send_color2capital(self):
            """ 请点击蓝色字母对应的大写 """
            direc = choice([1, 2])  # 随机一种方式,大写 to 小写/小写 to 大写
            color = self.color_name()  # 获取 n 组带中文名称的颜色 [('蓝色', '#0000FF'), ]
            self.string = self.random_character(type=[direc])
            data = []
            for i in range(self.str_count):
                # data/在图片上生成的数据
                data.append({
                    "str": self.string[i][0],  # 字符内容
                    "X": self.coord[i][0],  # x 位置
                    "Y": self.coord[i][1],  # y 位置
                    "color": color[i][1],
                    "angle": self.angle[i],
                    "icon": True if self.string[i][1] == 3 else False,  # 是否为图形字符
                })
    
            data[0]["str"] = data[1]["str"].swapcase()
            # hint/操作说明文字
            hint = f'请点击 {color[0][0]}字母 对应的 {"大写" if direc == 1 else "小写"}'
            str = [(data[1]["str"], data[1]["X"], data[1]["Y"], data[1]["angle"]), ]
            return {"data": data, "str": str, "hint": hint}
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。