整理Python生成随机中文图片验证码源代码

在登录很多网站的时候,他们已经不在使用简单的英文和数字的验证码,为了防止恶心注册和群发软件的侵袭,现在都开始使用中文的验证码了。

今天我们就跟大家分享一段用Python生成随机的中文验证码图片源代码。

 

 代码如下 复制代码

# -*- coding: utf-8 -*-
import Image,ImageDraw,ImageFont
import random
import math, string 

class RandomChar():
  """用于随机生成汉字"""
  @staticmethod
  def Unicode():
    val = random.randint(0x4E00, 0x9FBF)
    return unichr(val) 

  @staticmethod
  def GB2312():
    head = random.randint(0xB0, 0xCF)
    body = random.randint(0xA, 0xF)
    tail = random.randint(0, 0xF)
    val = ( head << 8 ) | (body << 4) | tail
    str = "%x" % val
    return str.decode('hex').decode('gb2312') 

class ImageChar():
  def __init__(self, fontColor = (0, 0, 0),
                     size = (100, 40),
                     fontPath = 'wqy.ttc',
                     bgColor = (255, 255, 255),
                     fontSize = 20):
    self.size = size
    self.fontPath = fontPath
    self.bgColor = bgColor
    self.fontSize = fontSize
    self.fontColor = fontColor
    self.font = ImageFont.truetype(self.fontPath, self.fontSize)
    self.image = Image.new('RGB', size, bgColor) 

  def rotate(self):
    self.image.rotate(random.randint(0, 30), expand=0) 

  def drawText(self, pos, txt, fill):
    draw = ImageDraw.Draw(self.image)
    draw.text(pos, txt, font=self.font, fill=fill)
    del draw 

  def randRGB(self):
    return (random.randint(0, 255),
           random.randint(0, 255),
           random.randint(0, 255)) 

  def randPoint(self):
    (width, height) = self.size
    return (random.randint(0, width), random.randint(0, height)) 

  def randLine(self, num):
    draw = ImageDraw.Draw(self.image)
    for i in range(0, num):
      draw.line([self.randPoint(), self.randPoint()], self.randRGB())
    del draw 

  def randChinese(self, num):
    gap = 5
    start = 0
    for i in range(0, num):
      char = RandomChar().GB2312()
      x = start + self.fontSize * i + random.randint(0, gap) + gap * i
      self.drawText((x, random.randint(-5, 5)), RandomChar().GB2312(), self.randRGB())
      self.rotate()
    self.randLine(18) 

  def save(self, path):
    self.image.save(path)

 

python生成验证码(webpy完整验证码类)

python生成验证码可以使用成熟的wheezy.captcha,首先需要安装PIL包 easy_install PIL, 然后需要安装wheezy.captcha easy_install wheezy.captcha

安装之后生成验证码就很简单了:

 

 代码如下 复制代码

captcha_image_t = captcha(drawings=[
    background(),
    text(fonts=[
        path.join(_fontsDir,'78640___.ttf'),
        path.join(_fontsDir,'andyb.ttf')],
        drawings=[
            warp(),
            rotate(),
            offset()
        ]),
    curve(),
    noise(),
    smooth()
])
chars_t = random.sample(_chars, 4)

image_t = captcha_image_t(chars_t)
image_t.save('test.jpeg','jpeg',quality=75)

 

验证码效果图如下:

验证码captcha

完整的webpy生成验证码类实现如下:

 

 代码如下 复制代码

#!/usr/bin/env python
# coding: utf-8

__author__ = 'outofmemory.cn'

from wheezy.captcha.image import captcha

from wheezy.captcha.image import background
from wheezy.captcha.image import curve
from wheezy.captcha.image import noise
from wheezy.captcha.image import smooth
from wheezy.captcha.image import text

from wheezy.captcha.image import offset
from wheezy.captcha.image import rotate
from wheezy.captcha.image import warp

import random
import web

from os import path
try:
    from cStringIO import StringIO
except:
    from StringIO import StringIO

if __name__ == '__main__':
    import os,sys
    webPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.insert(0,webPath)

from run import session

_controllersDir = path.abspath(path.dirname(__file__))
_webDir = path.dirname(_controllersDir)
_fontsDir = path.join(path.dirname(_webDir),'fonts')

_chars = 'ABCDEFJHJKLMNPQRSTUVWXY3456789'

SESSION_KEY_CAPTCHA = 'captcha'

def isValidCaptcha(captchaInputName='captcha'):
    userInputVal = web.input().get(captchaInputName)
    if not userInputVal: return False
    correctVal = session[SESSION_KEY_CAPTCHA]
    return userInputVal.upper() == correctVal

class Captcha:
    '''验证码'''

    def GET(self):
        captcha_image = captcha(drawings=[
            background(),
            text(fonts=[
                path.join(_fontsDir,'78640___.ttf'),
                path.join(_fontsDir,'andyb.ttf')],
                drawings=[
                    warp(),
                    rotate(),
                    offset()
                ]),
            curve(),
            noise(),
            smooth()
        ])
        chars = random.sample(_chars, 4)
        session[SESSION_KEY_CAPTCHA] = ''.join(chars)
        image = captcha_image(chars)
        out = StringIO()
        image.save(out,"jpeg",quality=75)
        web.header('Content-Type','image/jpeg')
        return out.getvalue()

if __name__ == '__main__':
    print _fontsDir
    captcha_image_t = captcha(drawings=[
        background(),
        text(fonts=[
            path.join(_fontsDir,'78640___.ttf'),
            path.join(_fontsDir,'andyb.ttf')],
            drawings=[
                warp(),
                rotate(),
                offset()
            ]),
        curve(),
        noise(),
        smooth()
    ])
    chars_t = random.sample(_chars, 4)

    image_t = captcha_image_t(chars_t)
    image_t.save('test.jpeg','jpeg',quality=75)

 

程序中使用的字体文件要放在web目录同级的fonts目录下,程序中的两个字体文件都是复制的windows字体,在linux下可以正常使用,要注意扩展名的大小写。

时间: 2025-01-25 13:01:31

整理Python生成随机中文图片验证码源代码的相关文章

C#生成随机中文汉字验证码

汉字|随机|验证码|中文 前几天去申请免费QQ号码,突然发现申请表单中的验证码内容换成了中文,这叫真叫我大跌眼镜感到好笑,Moper上的猫儿们都大骂腾讯采用中文验证码.'  我不得不佩服腾讯为了防止目前网络上横行的QQ号码自动注册机而采取中文验证码的手段.仔细想了想感觉用程序生成随机的中文验证码并不是很难,下面就来介绍一下使用C#生成随机的中文汉字的原理.  1.汉字编码原理  到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字,使用程序随机取出几个

用C#生成随机中文汉字验证码的基本原理

汉字|随机|验证码|中文   前几天去申请免费QQ号码,突然发现申请表单中的验证码内容换成了中文,这叫真叫我大跌眼镜感到好笑,Moper上的猫儿们都大骂腾讯采用中文验证码.^_^ 我不得不佩服腾讯为了防止目前网络上横行的QQ号码自动注册机而采取中文验证码的手段.仔细想了想感觉用程序生成随机的中文验证码并不是很难,下面就来介绍一下使用C#生成随机的中文汉字的原理. 1.汉字编码原理 到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字,使用程序随机取出几

生成随机字符串和验证码的类的PHP实例

 这篇文章主要介绍了生成随机字符串和验证码的类的PHP实例,有需要的朋友可以参考一下 网上有很多的php随机数与验证码的代码与文章,真正适用的没有几个.   索性自己搞一个吧.   开始本节的php教程 吧,以下代码的实现,主要做到可以很好区分一个get_code(),另一个create_check_image(),输出图像直接调用后面的,session()取验证码时直接get_code()就ok,顺带提下使用session时必须将session_star()放在最前面.   代码如下:   代

请教破解随机数字图片验证码

问题描述 GIF格式,目前常用的随机数字图片验证码[img=http://www.heinz.com.cn/include/module/imgstr.php][/img] 解决方案 解决方案二:调用OCR组件可以分析出来,不过对于混乱字符成功率不是很高具体我也没开发过,因为没有合适的OCR组件,E文和数字的网上有,中文的ORC组件就没有了,所以现在也开始流行用中文的了.解决方案三:如果数字没有旋转和变形的话,识别率应该是很高的,不过应该先把孤点去掉!解决方案四:LZ贴的图,对于OCR识别来说是

python生成随机mac地址的方法_python

本文实例讲述了python生成随机mac地址的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/python import random def randomMAC(): mac = [ 0x52, 0x54, 0x00, random.randint(0x00, 0x7f), random.randint(0x00, 0xff), random.randint(0x00, 0xff) ] return ':'.join(map(lambda x: "%02x" %

python生成随机字符的问题

问题描述 python生成随机字符的问题 我是想写个返回四个随机字符的代码,但是下面程序什么也不输出,也没有提示错误.下面是主要代码: chars='' for t in range(4): strr = rndChar()#该函数是正确的,每运行一次就返回一个随机字符 draw.text((60 * t + 10, 10), strr, font=font, fill=rndColor2()) chars.join(strr) print chars 请问像上面那样写可以得到四个随机字符组成的

PHP生成GIF动态图片验证码

相信很多人都想过如何用PHP生成GIF动画来实现动态图片验证码,以下是实现过程. ImageCode函数通过GIFEncoder类实现的GIF动画的PHP源代码,有兴趣的朋友可以研究一下. 效果如图:   /** * ImageCode 生成GIF图片验证 * @param $string 字符串 * @param $width 宽度 * @param $height 高度 * */ function ImageCode($string = '', $width = 75, $height =

asp汉字中文图片验证码的实现代码_应用技巧

'此代码是在别人基础上增加的汉字功能,特此感谢,同时感谢鬼火狼烟.  '以前的图片验证码很容易被破解,所以在其基础上进行改进,生成汉字,就目前而言很难破解 用法:  在需要显示验证码图片的地方插入代码 <img src="code.asp">  同时,自动生成session("psn"),表单提交验证session就可以了. 复制代码 代码如下: <%  '------------------  '汉字图片验证码  '此代码是在别人基础上增加的汉字

asp汉字中文图片验证码的实现代码

'此代码是在别人基础上增加的汉字功能,特此感谢,同时感谢鬼火狼烟.  '以前的图片验证码很容易被破解,所以在其基础上进行改进,生成汉字,就目前而言很难破解 用法:  在需要显示验证码图片的地方插入代码 <img src="code.asp">  同时,自动生成session("psn"),表单提交验证session就可以了. 复制代码 代码如下: <%  '------------------  '汉字图片验证码  '此代码是在别人基础上增加的汉字