开发必学的验证码,教你用Python从零写一个验证码!

pycharm我的验证码 N6IQ9MTOK0-eyJsaWNlbnNlSWQiOiJONklROU1UT0swIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5Zyw5Z2AIHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhb 阅读详情

阅读文本大概需要 10 分钟。

验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。

那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对框架很熟悉就夸赞你。

那今天小胖就带大家一层一层拨开验证码的衣服,看看其中的小奥秘 -<-

Python资源共享群:626017123

演示环境

- 操作系统: windows10

- python版本: python 3.7

- 代码编辑器: pycharm 2018.2

- 使用第三方模块: pillow

验证码的必须元素

1. 一张图片

2. 文本

3. 干扰元素

- 线条干扰

- 小圆点干扰

熟悉pillow库

我们既然需要使用pillow库制作验证码,那么首先我们先来熟悉一下我们需要用到的方法。

1. Image.new(): 这个方法可以生成一张图片,有三个参数。

- mode:颜色空间模式,可以是`'RGBA','RGB','L'`等等模式

- size:图片尺寸,接收一个两个整数的元祖

- color:图片的填充颜色,可以是`red,green`等,也可以是rgb的三个整数的元祖。 也就是背景颜色

from PIL  import Image

captcha = Image.new( 'RGB' , ( 1080 ,  900 ), ( 255 , 255

255

))

上面代码创建了一个亿RGB为颜色空间模式,尺寸为1080*900,背景颜色为白色的图片。

2. Image.save(): 保存图片到本地

- fp: 本地文件名

- format: 可选参数,制定文件后缀名。

from PIL  import Image

captcha = Image.new( 'RGB' , ( 1080 ,  900 ), ( 255 , 255 , 255 ))

# captcha.save('captcha.png')

captcha.save( 'captcha'

'png'

)

上面两种方式保存效果是一样的。

3. Image.show():显示图片,会调用电脑自带的显示图片的软件。

4. ImageFont.truetype(): 加载一个字体文件。 生成一个字体对象。

from PIL  import ImageFont

# 字体文件路径 字体大小

font = ImageFont.truetype( 'simkai.ttf'

16

)

5. ImageDraw.Draw(): 生成画笔对象。

from PIL  import Image, ImageDraw

captcha = Image.new( 'RGB' , ( 1080 ,  900 ),  'red' )

draw = ImageDraw.Draw(captcha)

上面就创建了一个在captcha这张图片上的画笔,我们在这个图片上画任何东西都会使用这个画笔对象。

6. ImageDraw.Draw().text():在图片上绘制给定的字符

from PIL  import Image, ImageDraw, ImageFont

captcha = Image.new( 'RGB' , ( 1080 ,  900 ),  'red' )

font = ImageFont.truetype( 'simkai.ttf' ,  16 )

draw = ImageDraw.Draw(captcha)

# 字符绘制位置, 绘制的字符, 制定字体, 字符颜色

draw.text(( 0 , 0 ),  'hello world'

'black'

)

7. ImageDraw.Draw().line():在图片上绘制线条

from PIL  import Image, ImageDraw, ImageFont

captcha = Image.new( 'RGB' , ( 1080 ,  900 ),  'red' )

draw = ImageDraw.Draw(captcha)

# 线条起点, 线条终点

draw.line([( 0 , 0 ),( 1080 , 900

'black'

)

8. ImageDraw.Draw().point(): 在图片上绘制点

from PIL  import Image, ImageDraw, ImageFont

captcha = Image.new( 'RGB' , ( 1080 ,  900 ),  'red' )

font = ImageFont.truetype( 'simkai.ttf' ,  16 )

draw = ImageDraw.Draw(captcha)

# 点的位置, 颜色

draw.point(( 500 , 500

'black'

)

制作我们的验证码我们就会使用到上面的方法。 当然,pillow肯定不止这些方法,这里我们就只列举这些了。

制作验证码

1. 首先我们定义一个类,初始化一些需要的参数。

import string

class Captcha () :

'''

captcha_size: 验证码图片尺寸

font_size: 字体大小

text_number: 验证码中字符个数

line_number: 线条个数

background_color: 验证码的背景颜色

sources: 取样字符集。验证码中的字符就是随机从这个里面选取的

save_format: 验证码保存格式

def __init__ (self, captcha_size= ( 150 , 100 ) , font_size= 30 ,text_number= 4 , line_number= 4 , background_color= ( 255 ,  255 ,  255 ) , sources=None, save_format= 'png' ) :

self.text_number = text_number

self.line_number = line_number

self.captcha_size = captcha_size

self.background_color = background_color

self.font_size = font_size

self.format = save_format

if sources:

self.sources = sources

else :

self.sources = string.ascii_letters + string.digits

这里说一下string模块。

- string.ascii_letters: 得到a-zA-Z所有字符

- string.digits: 得到0-9所有数字

2. 随机从sources获取字符

import random

def get_text (self) :

text = random.sample(self.sources,k=self.text_number)

return

''

.join(text)

random.sample()方法: 从第一个参数中随机获取字符。 获取个数有第二个参数指定。

3. 随机获取绘制字符的颜色

def get_font_color (self) :

font_color = (random.randint( 0 ,  150 ), random.randint( 0 ,  150 ), random.randint( 0 ,  150 ))

return

font_color

4. 随机获取干扰线条的颜色

def get_line_color (self) :

line_color = (random.randint( 0 ,  250 ), random.randint( 0 ,  255 ), random.randint( 0 ,  250 ))

return

line_color

5. 编写绘制文字的方法

def draw_text (self,draw, text, font, captcha_width, captcha_height, spacing= 20 ) :

'''

在图片上绘制传入的字符

:param draw: 画笔对象

:param text: 绘制的所有字符

:param font: 字体对象

:param captcha_width: 验证码的宽度 

:param captcha_height: 验证码的高度

:param spacing: 每个字符的间隙

:return: 

# 得到这一窜字符的高度和宽度

text_width, text_height = font.getsize(text)

# 得到每个字体的大概宽度

every_value_width = int(text_width /  4 )

# 这一窜字符的总长度

text_length = len(text)

# 每两个字符之间拥有间隙,获取总的间隙

total_spacing = (text_length -1 ) * spacing

if total_spacing + text_width >= captcha_width:

raise ValueError( "字体加中间空隙超过图片宽度!" )

# 获取第一个字符绘制位置

start_width = int( (captcha_width - text_width - total_spacing) /  2 )

start_height = int( (captcha_height - text_height) /  2 )

# 依次绘制每个字符

for value  in text:

position = start_width, start_height

print(position)

# 绘制text

draw.text(position, value, font=font, fill=self.get_font_color())

# 改变下一个字符的开始绘制位置

start_width = start_width + every_value_width + spacing

6. 绘制线条的方法

def draw_line (self, draw, captcha_width, captcha_height) :

'''

绘制线条

:param draw: 画笔对象 

:param captcha_width: 验证码的宽度 

:param captcha_height: 验证码的高度

:return: 

# 随机获取开始位置的坐标

begin = (random.randint( 0 ,captcha_width/ 2 ), random.randint( 0 , captcha_height))

# 随机获取结束位置的坐标

end = (random.randint(captcha_width/ 2 ,captcha_width), random.randint( 0 , captcha_height))

draw.line([begin, end], fill=self.get_line_color())

7. 绘制小圆点

def draw_point (self, draw, point_chance, width, height) :

'''

绘制小圆点

:param draw: 画笔对象

:param point_chance: 绘制小圆点的几率 概率为 point_chance/100

:param width: 验证码宽度

:param height: 验证码高度

:return:

# 按照概率随机绘制小圆点

for w  in range(width):

for h  in range(height):

tmp = random.randint( 0 ,  100 )

if tmp < point_chance:

draw.point((w, h), fill=self.get_line_color())

8. 制作验证码

def make_captcha (self) :

# 获取验证码的宽度, 高度

width, height = self.captcha_size

# 生成一张图片

captcha = Image.new( 'RGB' ,self.captcha_size,self.background_color)

# 获取字体对象

font = ImageFont.truetype( 'simkai.ttf' ,self.font_size)

# 获取画笔对象

draw = ImageDraw.Draw(captcha)

# 得到绘制的字符

text = self.get_text(

# 绘制字符

self.draw_text(draw, text, font, width, height)

# 绘制线条

for i  in range(self.line_number):

self.draw_line(draw, width, height)

# 绘制小圆点 10是概率 10/100, 10%的概率

self.draw_point(draw, 10 ,width,height)

# 保存图片

captcha.save( 'captcha' ,format=self.format)

# 显示图片

captcha.show()

这样,我们就生成了我们的图片验证码了,效果图:

 

 

 

 

 

 

用Python抢到回家的车票【无车必学】 春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。为此今天就给大家分享用python如何快速实现: 据悉,今年春运期间,全国铁路发送旅客人次同比将增长 8.0%。达到 4.4 亿人次。 2020 年铁路春运自 1 月 10 日开始,2 月 18 日结束,共 40 天,节前 15 天,节后 25 天,今年的 12 月 12 日春运火车票正式发售。 ... 阅读详情

相关推荐

Python:打造自己的验证码(附详细源码)

调用该函数后,会生成一个包含随机字符的字符串和一张验证码图片,并将文件名和字符串一起返回。在代码最后,我们对该函数进行了一个简单的测试,输出了生成的验证码和保存的文件路径。通过验证码的使用,可以有效地防范恶意攻击和恶意访问,保护用户的账号和隐私信息。通过这个示例,我们可以看出,Python 的 Pillow 库和 random、string 模块非常强大,可以帮助我们快速生成和处理各种类型的数据。同时,由于每次生成的验证码都是不同的,我们还可以将其与用户输入的验证码进行比较,从而验证用户的身份。

持续更新 1247

简易的python验证码系统

学习了一个月的python,做出了简易的验证码系统,可以基本识别管理员与普通人员,希望得到各位大神的意见,代码如下。

weixin_74353370的博客 2100

vue如何在项目中调用腾讯云的滑动验证码

在项目中使用滑动验证,可以调用腾讯云的组件和接口(付费项目) 导言 首先看看官方的步骤教学: https://cloud.tencent.com/document/product/1110/36839 其中,前端涉及到的是“步骤3:客户端接入”,里面介绍了两种接入方法:“快速接入”和“定制接入”。 项目是原生HTML 或者 jQuery 开发,那么可以使用“快速接入”。 项目使用 vue、react 等框架开发,则需要使用“定制接入”。 步骤 1、新建项目对应 appid 在 验证码控制台 中注册 AppID 和 AppSecret。 其中的“所在网址”可以填本地开发IP地址,例如 “

验证码生成原理即Python代码实现

验证码生成原理即Python代码实现

qq_45306986的博客 1931

OMI数据获取与可视化:从下载到大气污染分析

本文详细介绍了如何获取与处理OMI卫星数据,以进行大气污染分析。内容涵盖从NASA GES DISC官方源下载对流层NO2数据、使用MATLAB或Python进行月均数据处理与网格化,到利用m_map或cartopy工具进行专业可视化的完整流程。重点解析了数据下载技巧、NetCDF格式处理、地图投影与填色方法,并探讨了时间序列分析与动态可视化等深度应用,为环境研究者提供了一套从数据到洞察的实用指南。

weixin_29210759的博客 269

基于eBPF的零侵入LLM智能体观测:AgentSight架构与实战

在分布式系统和云原生架构中,可观测性是保障应用稳定运行与高效排障的核心能力。其原理在于通过日志、指标和追踪三大支柱,从外部视角持续收集和分析系统状态,而非依赖应用内部埋点。这一技术价值在于能以统一、低开销的方式,理解复杂系统的内部行为,尤其在微服务、容器化及Serverless等动态环境中至关重要。应用场景广泛覆盖了性能监控、安全审计、故障诊断与根因分析。当我们将这一基础理念应用于当下快速发展的AI智能体领域时,便自然引出了对LLM智能体进行无侵入、系统级行为观测的需求。传统的应用层方案需要集成SDK,对闭

weixin_28696185的博客 324

python 验证码_开发必学的验证码,教你用Python从零写一个验证码!

阅读文本大概需要 10 分钟。 验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。 那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对框架很熟悉就夸赞你。 那今天小胖就带大家一层一层拨开验证码的衣服,看看其中的小奥秘 -<-Python资源共享群:626017123演示环境 - 操作系统: windows...

weixin_39890633的博客 245

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码)

本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。

weixin_42571738的博客 186

开发必学的验证码,教你从零用Python写一个验证码

这周一写了一篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》给大家讲了如何快速学习python。 其中就有说到我们为什么不要执迷于框架、模块的调用,而要自己先去造轮子。那今天就给大家造一个。 验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。 那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对...

Python专栏 5276

系统磁盘从MBR格式转换成GPT格式来升级win11

之前的《》中说到,需要把磁盘格式转化为MBR格式才能执行下去。问题是,win10升级win11要求启动方式为UEFI的话,磁盘格式不能为MBR。其实不升级也不影响啥,但是就是想好看点。所以花了点时间折腾了一下。我这是双系统,所以直接去A系统修复B系统的磁盘格式和引导。

qq_42520962的博客 9041

零承诺的启动之路:详解 SAP BTP 的 Pay-As-You-Go for SAP BTP(含案例与迁移策略)

SAP BTP的Pay-As-You-Go(PAYG)模式为零承诺的按需付费方案,适合PoC和小规模上线场景。它提供生产环境直接启用服务的能力,按月后付标准目录价,无预付和折扣。PAYG可与BTP企业协议(BTPEA/CPEA)混合使用,用量稳定后可平滑迁移至CPEA获取更好财务条款。关键优势在于灵活开启/关闭服务,支持通过SAP Discovery Center估算费用,并配合成本治理工具控制支出。该模式适用于创新项目初期,当业务规模可预测时再考虑转为承诺型消费模式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 248

开发必学的验证码,教你用Python从零写一个验证码

点击“简说Python”,选择“星标公众号”福利干货,第一时间送达!本文授权转载自Python专栏,禁二次转载阅读文本大概需要 10分钟。验证码是web开发中不可缺少的...

简说Python的博客 613

华为OD机考双机位C卷 - 手机App防沉迷系统(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 手机App防沉迷系统(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 2061

开发必学的验证码,教你从零写一个验证码

验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面...

算法channel 626

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 802

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

验证码python代码怎么写_开发必学的验证码,教你从零写一个验证码

这周一写了一篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》给大家讲了如何快速学习python。其中就有说到我们为什么不要执迷于框架、模块的调用,而要自己先去造轮子。那今天就给大家造一个。验证码是web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对框架很熟...

weixin_39884144的博客 394

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

手把手教你用Python写抢票脚本(合法合规版)

各位老铁们(敲黑板),咱们今天要聊的这个Python抢票脚本开发啊,简直就是当代程序员的"求生指南"!不过先说清楚(超级重要)咱们今天讲的都是合法合规的操作,绝不涉及什么破解、绕验证码这些骚操作!写抢票脚本就像在钢丝上跳舞(认真脸),咱们程序员既要展现技术实力,更要守住法律底线。记住:真正的技术大神,都是戴着镣铐也能跳出华丽舞步的!

kernelknight1的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

如何用Python3实现12306火车票自动抢票,小白必学

最近在学Python,所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正。话不多说,进入正题:在进入正题之前,我想说明一下,由于12306官网的改版更新,所以脚本作了一点小小的变化,具体修改后的源码,可以到GitHub上面查看……新版脚本源码 另外要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有...

QQ2352108083的博客 1233

用Python写网络爬虫:推荐这本书看看。

《用Python写网络爬虫》讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的三种方法,提取缓存中的数据,使用多个线程和进程来进行并发抓取,如何抓取动态页面中的内容,与表单进行交互,处理页面中的验证码问题,以及使用Scarpy和Portia来进行数据抓取,使用本书介绍的数据抓取技术对几个真实的网站进行了抓取,旨在帮助读者活学活用书中介绍的技术。 用Pytho...

云度 3885

python手工打码_python云打码

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!为什么需要了解打码平台的使用现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码2 常见的打码平台 云打码:http:www.yundama.com 能够解决通用的验证码识别 极验验证码智能识别辅助:http:jiyandoc.c2...

weixin_39772849的博客 798

渗透爬虫必学!反爬机制全绕过实战(UA/IP代理/验证码/JS加密/滑块验证)

反爬机制是自动化渗透测试的第一道拦路虎,IP 封禁、JS 加密参数、验证码拦截、WAF 特征识别,直接让你的漏洞扫描脚本彻底失效。本文聚焦渗透测试场景的核心需求,拆解反爬绕过的底层逻辑,分场景保姆级讲解基础请求头伪装、IP 代理池轮换、JS 加密参数破解、图形 / 滑块验证码绕过的实战方法,每个场景都配套可直接复用的代码,可无缝兼容前序教程的漏洞扫描脚本,同时明确合规红线与安全边界,帮你彻底解决渗透爬虫被拦截、被溯源的核心卡点,让你的渗透爬虫畅通无阻。

m0_67000457的博客 1285
上一篇: 协程、可迭代、迭代器、生产者消费者模型!
下一篇: Dropbox如何用四年完成400万行Python代码检查!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值