美文网首页
网站验证码的生成原理、难度控制,及python实现

网站验证码的生成原理、难度控制,及python实现

作者: Python之战 | 来源:发表于2019-01-29 23:28 被阅读0次

    图片验证码已经广泛的使用在各种反爬虫的场景中,验证码的的生成验证过程对于开发者来说是零成本的,对于用户体验来说可能稍差、但是对于爬虫来说是致命的和高成本的。

    下面将介绍使用python实现网站验证码的产生及验证的全过程,然我们对验证码的生成有所理解,同时对于机器识别在验证码利于的作用有个认识。

    其过程是是用户请求验证后,生成验证码图片并后台session保存验证的字符串,当用户提交验证信息后,取出后台session中的字符集对比,相同的则验证通过。

    
    def get(self):
        from PIL import Image, ImageDraw, ImageFont
        import random
        # 定义变量,用于画面的背景色、宽、高
        bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
        width = 100
        height = 25
        # 创建画面对象
        im = Image.new('RGB', (width, height), bgcolor)
        # 创建画笔对象
        draw = ImageDraw.Draw(im)
        # 调用画笔的point()函数绘制噪点
        for i in range(0, 100):
            xy = (random.randrange(0, width), random.randrange(0, height))
            fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
            draw.point(xy, fill=fill)
        # 定义验证码的备选值
        str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
        # 随机选取4个值作为验证码
        rand_str = ''
        for i in range(0, 4):
            rand_str += str1[random.randrange(0, len(str1))]
        # 构造字体对象
        font = ImageFont.truetype('static/fonts/STLITI.TTF', 23)
        # 构造字体颜色
        fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
        # 绘制4个字
        draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
        draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
        draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
        draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
        del draw
        session["verifycode"] = rand_str
        buf = io.BytesIO()
        im.save(buf, 'png')
        self.set_header('Content-Type', 'image/jpg')
        self.write(buf.getvalue())
    
    

    session["verifycode"] = rand_str是在网站后台的session中保存正确的验证值,在post提交登陆后进行对比。

    buf = io.BytesIO()、im.save(buf, 'png')是创建bytes类型的内存对象用于保存生成的图片数据。

    self.set_header('Content-type','image/jpg')

    self.write(buf.getvalue()),构件response相应对象返回前端。

    效果如下:

    image image image

    效果还是不错,生成验证码的复杂度和字符集相关、和字体相关、和噪点相关,也可以生成表达式类型的验证码,同时因为采取随机生成,几百万张图片中也不会存在相同的图片,可见验证码对于反爬虫而言任然是最简单、无成本的反爬虫措施。


    ID:Python之战

    |作|者|公(zhong)号:python之战

    专注Python,专注于网络爬虫、RPA的学习-践行-总结

    喜欢研究技术瓶颈并分享,欢迎围观,共同学习。

    独学而无友,则孤陋而寡闻!


    相关文章

      网友评论

          本文标题:网站验证码的生成原理、难度控制,及python实现

          本文链接:https://www.haomeiwen.com/subject/hsofsqtx.html