中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的行為驗證碼驗證功能怎么實現

發布時間:2023-03-09 13:42:01 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

本篇內容主要講解“Python中的行為驗證碼驗證功能怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python中的行為驗證碼驗證功能怎么實現”吧!

驗證類型概述

滑動拼圖

創新行為式驗證,輕松一滑完成拼圖,體驗極佳,秒速通過驗證。簡潔高效,在保障用戶極致體驗的同時,抵御機器風險。適用于追求用戶體驗的場景。

# 生成背景圖
  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'請點擊一個 <i>顏色不一樣</i> 的 <i>{self.string[0][2]}</i>'
        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'請點擊 <i>{color[0][0]}字母</i> 對應的 <i>{"大寫" if direc == 1 else "小寫"}</i>'
        str = [(data[1]["str"], data[1]["X"], data[1]["Y"], data[1]["angle"]), ]
        return {"data": data, "str": str, "hint": hint}

到此,相信大家對“Python中的行為驗證碼驗證功能怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

枣阳市| 农安县| 五寨县| 襄汾县| 南郑县| 黎平县| 剑河县| 仙桃市| 阿鲁科尔沁旗| 嘉鱼县| 神农架林区| 扶沟县| 芜湖县| 措勤县| 邳州市| 石门县| 顺义区| 寿光市| 黑山县| 岱山县| 莱阳市| 开平市| 景宁| 高清| 青浦区| 嘉定区| 铜山县| 太原市| 遵化市| 介休市| 体育| 辽宁省| 大同市| 屏边| 玉溪市| 孝感市| 衡东县| 故城县| 兴和县| 吴旗县| 噶尔县|