pillow是Python平台事实上的图像处理标准库。PIL功能非常强大,但API却非常简单易用。 所以我们使用它在环境里做图像的处理。

第一步 下载pillow

#运行命令 pip install pillow

第二部 编写代码

1>创建一个类,初始化并为类添加属性

我们可能需要的属性有:验证码图片宽高,干扰点线数量,我们要出现多少个验证码等

2>随机生成背景颜色和字体颜色,在此建议将背景色生成范围定为浅色(0-120),字体色为深色(120-255)易于人眼识别

3>创建画布并依次画线点字,如果需要将字体倾斜旋转需要拷贝原图旋转再与原图合成

4>返回验证码图片和验证码答案字符串

例:

from PIL import Image,ImageDraw,ImageFont
import random
import io class code:
def __init__(self):
self.width=120 //生成验证码图片的宽度
self.height=40 //生成验证码图片的高度
self.im=None
self.lineNum=None //生成干扰线的数量
self.pointNum=None //生成干扰点的数量
self.codecon="QWERTYUPASDFGHJKZXCVBNMqwertyupadfhkzxcvbnm0123456789" //验证码出现的字符
self.codelen=4 //验证码出现字符的数量
self.str=""
def randBgColor(self):
return (random.randint(0,120),random.randint(0,120),random.randint(0,120))
def randFgColor(self):
return (random.randint(120, 255), random.randint(120, 255), random.randint(120, 255))
def create(self):
self.im = Image.new('RGB', size=(self.width, self.height), color=self.randBgColor())
def lines(self):
lineNum=self.lineNum or random.randint(3,6)
draw = ImageDraw.Draw(self.im)
for item in range(lineNum):
place=(random.randint(0,self.width),random.randint(0,self.height),random.randint(0,self.height),random.randint(0,self.height))
draw.line(place,fill=self.randFgColor(),width=random.randint(1,3))
def point(self):
pointNum = self.pointNum or random.randint(30, 60)
draw = ImageDraw.Draw(self.im)
for item in range(pointNum):
place=(random.randint(0,self.width),random.randint(0,self.height))
draw.point(place,fill=self.randFgColor())
def texts(self):
draw = ImageDraw.Draw(self.im)
for item in range(self.codelen):
x=item*self.width/self.codelen+random.randint(-self.width/15,self.width/15)
y=random.randint(-self.height/10,self.height/10)
text=self.codecon[random.randint(0,len(self.codecon)-1)]
self.str+=text
fnt = ImageFont.truetype('ARVO-REGULAR.TTF', random.randint(30,38))
draw.text((x,y),text,fill=self.randFgColor(),font=fnt,rotate="")
def output(self):
self.create()
self.texts()
self.lines()
self.point()
bt=io.BytesIO()
self.im.save(bt,"png")
return bt.getvalue()

5>将验证码渲染到网页中,以Flask为例

<img src="/codeimg" alt="" width="120" height="40">
@app.route('/codeimg')
def codeimg():
codeobj=code()
res=make_response(codeobj.output())
session["code"]=codeobj.str.lower()
res.headers["content-type"]="image/png"
return res

简单的输入式验证码就完成了,如有错误之处欢迎指正。

破解验证码时我们要用到第三方库。

解决思路:因为这种是最简单的一种验证码,只要识别出里面的内容,然后填入到输入框中即可。这种识别技术叫OCR,这里推荐使用Python的第三方库,tesserocr。对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片,先对图片进行灰度化,然后再进行二值化,再去识别,这样识别率会大大提高。

同样也可以参考使用pillow处理识别,链接https://blog.csdn.net/qq_35923581/article/details/79487579

使用Python生成基础验证码教程的更多相关文章

  1. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  2. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  3. python生成随机图形验证码

    使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...

  4. Python生成随机验证码,大乐透号码

    实例笔记之生成随机号码 扩展知识 - yield(生成器) 随机生成验证码 示例代码: import random # 导入标准模块中的random if __name__ == '__main__' ...

  5. python生成中文验证码,带旋转,带干扰噪音线段

    # -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...

  6. Python运算符 - Python零基础入门教程

    目录 一.算术运算符 二.赋值运算符 三.比较运算符 四.运算符的优先等级 五.重点总结 六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

  7. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  8. Python for循环 - Python零基础入门教程

    目录 一.for 循环语法 二.for 循环实战 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python ...

  9. python 生成图形验证码

    文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...

随机推荐

  1. [Python] 模拟登录网站(。。为了之后操作数据。。)

    我司的内部管理(Web)系统(日报)着实..(mafan).. 所以,就想自己动手增加一下便利性. 计划是, - 桌面程序 用来方便记录(按自己格式,数据随时保存到sqlite中,备用) 通过一览来确 ...

  2. Java零基础教程(一)环境搭建

    本文将带领您一步一步地搭建Java开发环境 一.认识什么是Java Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Window ...

  3. 【bzoj5210】最大连通子块和 动态dp

    动态$dp$好题 考虑用树链剖分将整棵树剖成若干条链. 设x的重儿子为$son[x]$,设$x$所在链链头为$top[x]$ 对于重链上的每个节点(不妨设该节点编号为$x$)令$f[x]$表示以$x$ ...

  4. POJ 1082

    #include <iostream> using namespace std; int main() { //freopen("acm.acm","r&qu ...

  5. #阿里云#云服务器部署可道云(KodExplorer)

    前言:在做一些项目的时候,经常有一些文档交流,修改之后的文档在QQ或微信上发来发去,还要下载,很是不爽,有一个挺有用的东西叫做KodExplorer可道云. kodexplorer可道云是目前国内有代 ...

  6. FlowPortal-BPM——功能:判断数据库表中字段是否重复并阻止提交或保存

    一.JS添加代码,判断是否有OnSubmit事件 文件位置:YZSoft/Forms/src/Validator.js //=====判断是否有OnSubmit事件===== if (typeof ( ...

  7. (转)用Python写堡垒机项目

    原文:https://blog.csdn.net/ywq935/article/details/78816860 前言 堡垒机是一种运维安全审计系统.主要的功能是对运维人员的运维操作进行审计和权限控制 ...

  8. 马哥Python 开发9期

    LVS工作模式: 传输层 会话保持:负载均衡(1) session sticky:同一用户调度固定服务器Source IP:LVS sh算法(对某一特定服务而言)Cookie(2) session r ...

  9. ActiveMQ--HelloWorld

    下载windows版本ActiveMQ,apache-activemq-5.15.3\bin\win64\activemq.bat 启动mq,ActiveMQ内置jetty,默认端口8161,默认用户 ...

  10. 【优化】如何检测移动端 CPU 以及内存占用率

    原文  http://taobaofed.org/blog/2015/12/04/cpu-allocation-profiler/ 前言 6 月底的时候淘宝众筹的 H5 接入到了支付宝钱包,上线前支付 ...