当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » Python  » 常用工具方法
红薯

Python 随机生成中文验证码

红薯 发布于 2010年10月14日 17时, 25评/18160阅
分享到: 
收藏 +0
4
<无详细内容>
标签: 验证码 Python

代码片段(3) [全屏查看所有代码]

1. [代码]python代码     跳至 [1] [2] [全屏预览]

# -*- 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)

2. [代码]调用方法     跳至 [1] [2] [全屏预览]

ic = ImageChar(fontColor=(100,211, 90))
ic.randChinese(4)
ic.save("1.jpeg")

3. [图片] 效果图    



开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(25)

  • 1楼:lynnux 发表于 2010-10-25 17:18 回复此评论
    good!
  • 2楼:WangWyatt 发表于 2010-12-11 15:10 回复此评论
    代码很牛呀,学习中。
  • 3楼:顺路同行 发表于 2011-03-08 13:21 回复此评论
    不错,学习学习
  • 4楼:Menthe 发表于 2011-08-22 16:17 回复此评论
    你好,请问,如何陪着这个image模块呢,我安装之后,出现ImportError: The _imagingft C module is not installed这个错误。。。请问该如何解决呢。
  • 5楼:mudan 发表于 2011-09-14 17:12 回复此评论
    收藏
  • 6楼:何世友 发表于 2011-09-14 19:17 回复此评论

    引用来自“Menthe”的评论

    你好,请问,如何陪着这个image模块呢,我安装之后,出现ImportError: The _imagingft C module is not installed这个错误。。。请问该如何解决呢。
    PIL模块。
  • 7楼:张金宝 发表于 2011-12-05 15:30 回复此评论
    大神呀...
  • 8楼:幻影浪子 发表于 2012-02-03 12:56 回复此评论
    PIL是个好东西
  • 9楼:RobinsonLiao 发表于 2012-02-21 19:28 回复此评论

    安装了pil后还是报错,难道与自带的image冲突吗?
      self.image = Image.new('RGB', size, bgColor)   这里的new标红了

  • 10楼:木头lbj 发表于 2012-05-19 19:15 回复此评论
    很棒啊  mark下
  • 11楼:今天王爷 发表于 2012-05-22 08:42 回复此评论

    HCaptcha验证码 是与开发语言无关、样式可调整的免费图形验证码系统。

    1. 安全 系统可以非常有效地阻止网络机器人的注册,登录,内容发布,系统具有智能的辨识与阻止机器人访问能力,从而保护信息安全;

    2. 有效 系统提供的验证码是对用户容易辨识对识别器不容易辨别;

    3. 稳定 系统保证验证码的显示与验证快速与稳定;

    4. 易用 系统对不同语言PHP/JSP/ASP/ASP.NET[C#、VB]等主流语言提供验证码的显示与验证端代码与例子,开发者可以在几乎不需要更改代码的情况下集成到任何系统。系统还提供验证码样式的管理设置功能,不需要更改代码轻易地更改样式;

    5. 强大 系统除提供验证码外还提供各种统计功能与IP阻断等功能,安全性完全掌控在开发者手中;

    6. 与开发语言无关 系统API接口,通过HTTPS协议实现,任何语言都可以使用HCaptcha;

    7. 样式丰富 系统提供的自定义样式、JS支持模式、弹出模式、组件模式供开发者选择,每个模式可以选择多种样式;

    8. 支持范围广 系统不仅支持Web站点的验证码,同时支持Wap、客户端程序[IPhone/Android/PC Client]等支持HTTPS协议的系统;

  • 12楼:今天王爷 发表于 2012-06-17 11:45 回复此评论
    皕应[http://www.hinsite.com]的HCaptcha能智能地分辨用户情况,对简体中文用户提供简体验证码,对繁体用户提供繁体验证码,对语言支持方面支持各种网络语言 如 php/jsp/asp/c#/.net/vb/perl/ruby/ python 等等
  • 13楼:wx---每日佳选 发表于 2012-07-06 10:20 回复此评论
    不支持 12px的字。
  • 14楼:chunzhang 发表于 2012-08-10 16:42 回复此评论

    请问调用方法怎么用啊 ?
    Traceback (most recent call last):

      File "E:\Study\Python\Python 随机生成中文验证码\using.py", line 2, in <module>

        ic = ImageChar(fontColor=(100,211, 90))

    NameError: name 'ImageChar' is not defined

  • 15楼:郑诚 发表于 2012-10-26 15:29 回复此评论
    Traceback (most recent call last):
      File "C:\Users\Administrator\Desktop\中文验证码.py", line 75, in <module>
        ic = ImageChar(fontColor=(100,211,90))
      File "C:\Users\Administrator\Desktop\中文验证码.py", line 33, in __init__
        self.font = ImageFont.truetype(self.fontPath, self.fontSize)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 218, in truetype
        return FreeTypeFont(filename, size, index, encoding)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 134, in __init__
        self.font = core.getfont(file, size, index, encoding)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 34, in __getattr__
        raise ImportError("The _imagingft C module is not installed")
    ImportError: The _imagingft C module is not installed



    运行出错~~
  • 16楼:firefoxmmx 发表于 2012-12-11 13:57 回复此评论
    中文的验证码感觉有点儿bt, 验证码破解识别部分好难做.以前的枚举法貌似不能用了.
  • 17楼:share_code 发表于 2012-12-20 13:01 回复此评论

    引用来自“云哈哈”的评论

    Traceback (most recent call last):
      File "C:\Users\Administrator\Desktop\中文验证码.py", line 75, in <module>
        ic = ImageChar(fontColor=(100,211,90))
      File "C:\Users\Administrator\Desktop\中文验证码.py", line 33, in __init__
        self.font = ImageFont.truetype(self.fontPath, self.fontSize)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 218, in truetype
        return FreeTypeFont(filename, size, index, encoding)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 134, in __init__
        self.font = core.getfont(file, size, index, encoding)
      File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 34, in __getattr__
        raise ImportError("The _imagingft C module is not installed")
    ImportError: The _imagingft C module is not installed



    运行出错~~
    刚才研究了一下 self.fontPath 可能你的windows/fonts/ 没有wqy.ttc这个字体 你可以先用 宋体的SIMSUN.TTC 试试,然后找到自己要使用的非常规字体进行替换。
  • 18楼:加酸 发表于 2013-02-16 15:42 回复此评论
      不错啊
  • 19楼:陈朝才 发表于 2013-05-05 10:34 回复此评论
    lz能把图片中的汉字识别出来不
  • 20楼:请叫我周润发 发表于 2014-01-22 15:33 回复此评论
    ImportError: The _imagingft C module is not installed问题的安装http://www.lfd.uci.edu/~gohlke/pythonlibs/    里面的 Pillow-2.3.0.win32-py2.7.exe
开源从代码分享开始 分享代码