python 登陆网站图片验证_网页登陆验证之图片验证码

该博客介绍了一个Python脚本`check_code.py`,用于创建带有干扰线和干扰点的图片验证码。它允许自定义验证码的尺寸、字符集、颜色、字体大小等参数,并通过图像扭曲和滤镜增强边界来提高安全性。
摘要由CSDN通过智能技术生成

1 #!/usr/bin/env python

2 #coding:utf-8

3 #check_code.py

4

5 import random

6 from pil import image, imagedraw, imagefont, imagefilter

7

8 _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z

9 _upper_cases = _letter_cases.upper() # 大写字母

10 _numbers = ''.join(map(str, range(3, 10))) # 数字

11 init_chars = ''.join((_letter_cases, _upper_cases, _numbers))

12

13 def create_validate_code(size=(120, 30),

14 chars=init_chars,

15 img_type="gif",

16 mode="rgb",

17 bg_color=(255, 255, 255),

18 fg_color=(0, 0, 255),

19 font_size=18,

20 font_type="monaco.ttf",

21 length=4,

22 draw_lines=true,

23 n_line=(1, 2),

24 draw_points=true,

25 point_chance = 2):

26 '''

27 @todo: 生成验证码图片

28 @param size: 图片的大小,格式(宽,高),默认为(120, 30)

29 @param chars: 允许的字符集合,格式字符串

30 @param img_type: 图片保存的格式,默认为gif,可选的为gif,jpeg,tiff,png

31 @param mode: 图片模式,默认为rgb

32 @param bg_color: 背景颜色,默认为白色

33 @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000ff

34 @param font_size: 验证码字体大小

35 @param font_type: 验证码字体,默认为 ae_alarabiya.ttf

36 @param length: 验证码字符个数

37 @param draw_lines: 是否划干扰线

38 @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为true时有效

39 @param draw_points: 是否画干扰点

40 @param point_chance: 干扰点出现的概率,大小范围[0, 100]

41 @return: [0]: pil image实例

42 @return: [1]: 验证码图片中的字符串

43 '''

44

45 width, height = size # 宽, 高

46 img = image.new(mode, size, bg_color) # 创建图形

47 draw = imagedraw.draw(img) # 创建画笔

48

49 def get_chars():

50 '''生成给定长度的字符串,返回列表格式'''

51 return random.sample(chars, length)

52

53 def create_lines():

54 '''绘制干扰线'''

55 line_num = random.randint(*n_line) # 干扰线条数

56

57 for i in range(line_num):

58 # 起始点

59 begin = (random.randint(0, size[0]), random.randint(0, size[1]))

60 #结束点

61 end = (random.randint(0, size[0]), random.randint(0, size[1]))

62 draw.line([begin, end], fill=(0, 0, 0))

63

64 def create_points():

65 '''绘制干扰点'''

66 chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]

67

68 for w in range(width):

69 for h in range(height):

70 tmp = random.randint(0, 100)

71 if tmp > 100 - chance:

72 draw.point((w, h), fill=(0, 0, 0))

73

74 def create_strs():

75 '''绘制验证码字符'''

76 c_chars = get_chars()

77 strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开

78

79 font = imagefont.truetype(font_type, font_size)

80 font_width, font_height = font.getsize(strs)

81

82 draw.text(((width - font_width) / 3, (height - font_height) / 3),

83 strs, font=font, fill=fg_color)

84

85 return ''.join(c_chars)

86

87 if draw_lines:

88 create_lines()

89 if draw_points:

90 create_points()

91 strs = create_strs()

92

93 # 图形扭曲参数

94 params = [1 - float(random.randint(1, 2)) / 100,

95 0,

96 0,

97 0,

98 1 - float(random.randint(1, 10)) / 100,

99 float(random.randint(1, 2)) / 500,

100 0.001,

101 float(random.randint(1, 2)) / 500

102 ]

103 img = img.transform(size, image.perspective, params) # 创建扭曲

104

105 img = img.filter(imagefilter.edge_enhance_more) # 滤镜,边界加强(阈值更大)

106

107 return img, strs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值