【Python实现图片验证码】 񤔆

原文: http://blog.gqylpy.com/gqy/279

"```python
import base64
import random
from PIL import Image
from PIL import ImageDraw # 画笔对象
from PIL import ImageFont # 字体对象
from io import BytesIO # 可将数据写到内存中

class AuthCode(object):

def __init__(self, digits=5, is_letter=False, image_size=(245, 40), font_path='kumo.ttf', font_size=36,
             is_interfering_line=True,
             interfering_line_count=1,
             is_interfering_point=True,
             interfering_point_count=10,
             is_save_disk=False,
             save_disk_path=None,  # 保存到磁盘的路径,如果保存至磁盘,则必须save_disk_path
             is_save_memory=True):
    """
    内部功能全部通过传参调用
    :param digits: 验证码长度
    :param is_letter: 验证码是否包含字母
    :param image_size: 图片大小 ("宽度", "高度")
    :param font_path: 字体文件路径
    :param font_size: 生成的字体大小
    :param is_interfering_line: 是否给图片加干扰线
    :param interfering_line_count: 干扰线数量
    :param is_interfering_point: 是否给图片加干扰点
    :param interfering_point_count: 干扰点数量
    :param is_save_disk: 默认保存到磁盘
    :param save_disk_path: 保存到磁盘的路径,如果保存至磁盘,则必须传入一个有效路径
    :param is_save_memory: 是否保存到内存(以便传输)
    """
    self.digits = digits
    self.is_letter = is_letter
    self.image_size = image_size
    self.font_path = font_path
    self.font_size = font_size
    self.is_interfering_line = is_interfering_line
    self.interfering_line_count = interfering_line_count
    self.is_interfering_point = is_interfering_point
    self.interfering_point_count = interfering_point_count
    self.is_save_disk = is_save_disk
    self.save_disk_path = save_disk_path
    self.is_save_memory = is_save_memory

    self.__code = self.__code_s() if self.is_letter else self.__code()  # 获取验证码
    img_obj, draw_obj = self.__image()
    # 开始在图片上写验证码
    [draw_obj.text((i * 56, 0), self.__code[i], self.__rgb_color(), self.__font()) for i in range(self.digits)]
    # 是否增加干扰属性
    self.is_interfering_line and self.__add_interfering_line(draw_obj)
    self.is_interfering_point and self.__add_interfering_point(draw_obj)
    # 将完工的图片保存
    self.is_save_disk and self.__save_to_disk(img_obj)
    self.is_save_memory and self.__save_to_memory(img_obj)

def get_code(self):
    """用于获取生成的验证码内容"""
    return self.__code

def get_memory_img_data(self):
    """用于获取保存在内存中的图片"""
    return base64.b64encode(self.__img_data)

def __save_to_disk(self, img_obj):
    """将图片保存到磁盘"""
    with open(self.save_disk_path, 'wb') as f:
        img_obj.save(f, format='png')

def __save_to_memory(self, img_obj):
    """保存至内存"""
    f = BytesIO()
    img_obj.save(f, format='png')
    self.__img_data = f.getvalue()

def __code(self):
    """数字验证码"""
    return [str(random.randint(0, 9)) for i in range(self.digits)]

def __code_s(self):
    """数字字母验证码"""
    code = ''
    for i in range(self.digits):
        big_letter = chr(random.randint(65, 90))  # 大写字母
        small_letter = chr(random.randint(97, 122))  # 小写字母
        num = str(random.randint(0, 9))
        code += random.choice([big_letter, small_letter, num])
    return code

def __rgb_color(self):
    """随机返回RBG颜色类型的三个值"""
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

def __image(self):
    """返回一个图片对象和这个图片对象的画笔对象"""
    img_obj = Image.new('RGB', self.image_size, self.__rgb_color())  # 生成一个图片对象
    # img_obj = Image.new("颜色类型", (图片宽度, 图片高度), (RGB的三个值))
    draw_obj = ImageDraw.Draw(img_obj)  # 在该图片对象上生成一个画笔对象
    return img_obj, draw_obj

def __font(self):
    """返回一个字体对象, 需先下载字体"""
    # return ImageFont.truetype("字体路径", "字体大小")
    return ImageFont.truetype(self.font_path, self.font_size)

def __add_interfering_line(self, draw_obj):
    """加干扰线"""
    width, height = self.image_size  # 图片高宽(防止越界)
    for i in range(self.interfering_line_count):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw_obj.line((x1, y1, x2, y2), fill=self.__rgb_color())

def __add_interfering_point(self, draw_obj):
    """加干扰点"""
    width, height = self.image_size  # 图片高宽(防止越界)
    for i in range(self.interfering_point_count):
        draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=self.__rgb_color())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=self.__rgb_color())

if name == ‘main‘:
# 生成验证码
obj = AuthCode(font_path=‘字体文件路径‘)

# 获取验证码内容
obj.get_code()

# 获取保存在内存中的验证码数据
obj.get_memory_img_data()

```
Python下的PIL模块支持的字体文件下载
下载后,指定文件路径即可.
"

原文: http://blog.gqylpy.com/gqy/279

原文地址:https://www.cnblogs.com/gqy02/p/11368241.html

时间: 2024-10-31 11:02:41

【Python实现图片验证码】 񤔆的相关文章

python实现图片验证码

1 验证基础知识1.1 Python生成随机验证码,需要使用PIL模块. # 安装 pip3 install pillow 1.2 创建图片 from PIL import Image img = Image.new(mode="RGB", size=(120, 30), color=(125, 255, 255)) # 保存图片到本地 with open("code.png",'wb') as f: img.save(f,format="png"

python爬虫20 | 小帅b教你如何使用python识别图片验证码

当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 一来一去 就有了各种各样的变态验证码 也有了各种各样的应对方式 常见的验证码有这么几种 图像验证 语音验证 短信验证 极验验证 点击验证 今天 小帅b想跟你先说说如何识别图像验证码 那么 接下来就是 学习 python 的正确姿势 我们来看看这些图片验证码 (此图来源网络) 可以发现 这些验证码大

python获取图片验证码

一.安装linux下图片处理工具: # which tesseract/usr/bin/tesseract 二.安装python连接模块: pip install pytesseract pip install Pillow 三.进入python运行环境: 1报错: ( File "/usr/lib/python2.7/site-packages/pytesseract/pytesseract.py", line 194, in image_to_string return run_a

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.

Python图片验证码降噪 — 8邻域降噪

简介 图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是: 1.灰度处理&二值化 2.降噪 3.字符分割 4.标准化 5.识别 所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只留下需要识别的字符,让图片变成2进制点阵,方便代入模型训练. 8邻域降噪 8邻域降噪 的前提是将图片灰度化,即将彩色图像转化为灰度图像.以RGN色彩空间为例,彩色图像中每个像素的颜色由R .G.B三个分量决定,每个分量由0到255种取值,这个一个像素点可以

Python识别网站验证码

http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内容.入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足. 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片的像素点进行一系列的操作,最后输出验证码图像内的每个字符的文本矩阵. 读取图片 图片降噪 图片切割 图像文本输出 验证字符识别 验证码内的字符识别主要以机

Python 生成随机验证码

Python生成随机验证码 Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255)) # 在图片查看器中打开 # img.show()  # 保存在本地 with open('code.png','wb') as f