撸个验证码

1. 概述

Captcha = Completely Automated Public Turing Test to Tell Computers and Humans Apart
只可惜随着人工智能技术的发展, 验证码已逐渐失去它的作用
换个角度来讲, 机器与人类越来越难区分

2. 验证码种类

攻防一直是相对的, 就像爬虫与反爬虫一样, 验证码也在不断革新

  • 简单字符
  • 添加干扰线/旋转
  • 拖拽滑块
  • 文字定位
  • 图片识别
  • 语音
  • ...

3. 简单验证码实现

效果如下:


image.png
from PIL import Image, ImageDraw, ImageFont
import string
import random

class Captcha:
    w, h = 84, 50

    def __init__(self):
        self.im = Image.new(mode='RGB', size=(self.w, self.h), color=(255,255,255))
        self._drawChar()
        self._drawLines()

    def _drawLines(self):
        for _ in range(5):
            startX, startY = random.randint(0, self.w), random.randint(0, self.h)
            endX, endY = random.randint(0, self.w), random.randint(0, self.h)

            draw = ImageDraw.Draw(self.im)
            draw.line(xy=[(startX, startY), (endX, endY)], fill=(0,0,0), width=2)

    def _drawChar(self):
        charFont = ImageFont.truetype(font='/usr/share/fonts/truetype/ubuntu/Ubuntu-B.ttf', size=30)
        letters = string.ascii_letters + string.digits
        codes = random.sample(letters, 4)

        draw = ImageDraw.Draw(self.im)
        x, y = 2, 4
        for c in codes:
            draw.text(xy=(x, y), text=c, fill=(0,80,255), font=charFont)
            x += 20

    def show(self):
        self.im.show()
    
    @property
    def data(self):
        return self.im.tobytes()


if __name__ == '__main__':
    cap = Captcha()
    cap.show()

推荐阅读更多精彩内容

  • 在前面一篇博客,介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬...
    FifiZhuang阅读 7,560评论 4 82
  • 这是创意思维训练营的第一次作业,选择“解读-橙子学院”,去探讨这个伴我大半年的组织; 在课上最为深刻的一点就是:简...
    修炼者who阅读 75评论 1 0
  • 冰晶和骄阳都是初三的学生,自从初二冰晶转到这个学校后,他们就认识了。 骄阳在班里很重要,虽然顽皮爱闹,也爱打游戏,...
    茗日峻杰阅读 200评论 1 3
  • 你在比你强势的人面前会不会一下子没有气场? 你在比你穿着打扮高许多个档次的人面前会不会没有自信? 你在100多个人...
    萍易近人阅读 91评论 3 0
  • 前几天看到同学在朋友圈发了一条状态,意思是领到第一笔工资后给了奶奶六百块,当老人用颤抖的手接过钱时,脸上挂满了欣慰...
    顾望明月阅读 182评论 2 1