在前一篇文章中初步的实现了验证码的随机生成,觉得很容易被破解,因此加了一些干扰;

鹤冲天建议使用表达式作为验证码,即使破解程序识别了验证码,也要计算结果才能通过验证,在一定程度上增加了破解难度。

因此我对代码进行了重新整理,通过控制运行时配置选项来达到不同效果。

现在主要做到了:

(1)字符内容随机(普通字符串或表达式)

(2)每个字符的字体随机

(3)每个字符大小随机

(4)每个字符倾斜角度随机

(5)干扰线条随机

除了(4)其他都可以通过配置来控制。

下面是代码,有详细的注释,就不多说了:

  1 require("gd")
  2 require("lfs")
  3 
  4 -----------------------------------------------------------------------------------------------------------------------------------
  5 --运行配置项
  6 -----------------------------------------------------------------------------------------------------------------------------------
  7 --字体:-1-使用gd.FONT_GIANT字体;1-使用随机字体;其他-使用“fonts”中第一个字体
  8 --字体预先在变量“fonts”中定义;如果fonts没有值,将搜索系统中的所有字体,字体路径在“FONT_PATH”中预定义
  9 FONT=1
 10 
 11 --每个字符字体随机:1-是,其他-否
 12 --仅当“FONT”值为“1”时,本变量起作用
 13 FONT_RANDOM_CHAR=0
 14 
 15 --每个字符字体大小是否随机:1-是,其他-否
 16 --仅当FONT^=-1时起作用
 17 FONT_SIZE_RANDOM=1
 18 
 19 --是否增加线条干扰:1-是;其他-否
 20 XLINE_FALG=1
 21 
 22 --干扰线条的最多条数
 23 --仅当“XLINE_FALG”的值为“是”是,本变量起作用
 24 XLINE_LIMIT=6
 25 
 26 --验证码类型:TEXT-字符串;EXPRESSION-表达式
 27 MARK_TYPE="TEXT"
 28 --MARK_TYPE="EXPRESSION"
 29 
 30 --字符个数:仅当“MARK_TYPE”=“TEXT”时,本变量起作用
 31 TEXT_NUM=6
 32 
 33 --表达式项数限制(最多不超过EXPRESSION_ITEMS项):仅当“MARK_TYPE”=“EXPRESSION”时,本变量起作用
 34 EXPRESSION_ITEMS=3
 35 
 36 --生成验证码个数
 37 MARK_NUM=100000
 38 
 39 
 40 -----------------------------------------------------------------------------------------------------------------------------------
 41 --预定义变量
 42 -----------------------------------------------------------------------------------------------------------------------------------
 43 --词典
 44 dict={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0'}
 45 numbers={"1","2","3","4","5","6","7","8","9"}--表达式可使用数字,排除0
 46 operators={"+","-","*"}--表达式可使用运算符,不支持“/”
 47 
 48 --随机种子,防止通过获取系统时间得到随机数种子,直接计算出验证码
 49 math.randomseed(os.time())
 50 
 51 --大小
 52 IMG_WIDTH=100
 53 IMG_HEIGHT=40
 54 
 55 --颜色
 56 im2 = gd.createTrueColor(IMG_WIDTH,IMG_HEIGHT)
 57 fg = im2:colorAllocate(129,32,28)--前景色
 58 bg = im2:colorAllocate(216,235,238)--背景色
 59 
 60 --字体
 61 FONT_PATH="C:/WINDOWS/Fonts/"--系统字体路径
 62 fonts={}
 63 --fonts={"courbd.ttf","courbi.ttf","DejaVuMonoSans.ttf","DejaVuMonoSansBold.ttf","DejaVuMonoSansBoldOblique.ttf","DejaVuMonoSansOblique.ttf","lucon.ttf","monosbi.ttf","nina.ttf","simhei.ttf","simkai.ttf","swissci.ttf","tahomabd.ttf","timesbd.ttf","timesbi.ttf","timesi.ttf","trebuc.ttf","trebucit.ttf"}
 64 font_size={14,15,16,17,18,19,20}--随机字体大小
 65 
 66 --生成的随机码
 67 stringmark=""
 68 
 69 -----------------------------------------------------------------------------------------------------------------------------------
 70 --功能函数
 71 -----------------------------------------------------------------------------------------------------------------------------------
 72 --初始化:创建图片、设置背景
 73 function init()
 74     im2 = gd.createTrueColor(IMG_WIDTH, IMG_HEIGHT)
 75     im2:filledRectangle(0,0,IMG_WIDTH,IMG_HEIGHT,bg)
 76     stringmark=""
 77 end
 78 
 79 --查找字体
 80 function searchFont()
 81     if table.getn(fonts)==0 then --没有指定字体,就搜索系统字体
 82         local i=1
 83         for file in lfs.dir(FONT_PATH) do
 84             if string.find(file,".ttf")and not string.find(file,"esri")  then --排除特定字体
 85                 fonts[i]=file
 86                 i=i+1
 87             end
 88         end
 89     end
 90 end
 91 
 92 --生成text字符串
 93 function makeText()
 94     local num=table.getn(dict)
 95     for i=1,TEXT_NUM do
 96         stringmark=stringmark..dict[math.random(num)]
 97     end
 98 end
 99 
100 --生成表达式字符串
101 function makeExpression()
102     local n=math.random(2,3)--表达式项数
103     local strings={}
104     for i=1,n*2-1 do--表达式项数+运算符项数
105         local str=""
106         if i%2==1 then--数字
107             local n2=math.random(1,2)
108             for j=1,n2 do--每个数字最多2位
109                 str=str..numbers[math.random(9)]
110             end
111         else--运算符
112             str=operators[math.random(3)]
113         end
114         strings[i]=str
115     end 
116     return strings
117 end
118 
119 --主函数
120 function doIt()
121     searchFont()
122     local numfonts=table.getn(fonts)
123     if numfonts<1 then
124         print("没有找到字体!")
125         return
126     end
127 
128     for i=1,MARK_NUM do
129         init()
130         local font=fonts[0];
131         local fontsize=20;
132         
133         if MARK_TYPE=="TEXT" then--普通字符串验证码
134             makeText()
135 --            print(stringmark)    
136             if FONT==-1 then
137                 im2:string(gd.FONT_GIANT,18,10,stringmark, fg)
138             else
139                 for nIndex=1,string.len(stringmark) do
140                     if FONT==1 then font=fonts[math.random(numfonts)] end
141                     if FONT_SIZE_RANDOM==1 then fontsize=font_size[math.random(7)] end
142                     im2:stringFT(fg,FONT_PATH..font,fontsize,math.random()/math.pi,5+(nIndex-1)*15, 25, string.sub(stringmark,nIndex,nIndex))
143                 end        
144             end
145         elseif MARK_TYPE=="EXPRESSION" then--表达式验证码
146             local strings=makeExpression()
147             local raise=0
148             local ncharacter=0 
149             for j=1,table.getn(strings) do
150                 if j%2==0 then raise=3 end
151                 stringmark=stringmark..strings[j]
152                 if FONT==1 then font=fonts[math.random(numfonts)] end
153                 if FONT_SIZE_RANDOM==1 then fontsize=font_size[math.random(5)] end          
154                 im2:stringFT(fg,FONT_PATH..font,fontsize,math.random()/math.pi,5+ncharacter*12+raise, 25, strings[j])
155                 ncharacter=ncharacter+string.len(strings[j])
156             end
157 --            print(stringmark) 
158 --            value=tonumber(stringmark)
159 --            print(value)
160         end
161         
162         --  随机线条干扰
163         if XLINE_FALG==1 then
164             local xlineNum=math.random(XLINE_LIMIT)
165             for i=1,xlineNum do
166                 im2:line(math.random(IMG_WIDTH),math.random(IMG_HEIGHT),math.random(IMG_WIDTH),math.random(IMG_HEIGHT),fg)
167             end
168         end
169 
170         im2:png("./output/"..font..".png",100)                
171     end
172 end
173 
174 --start=os.clock()
175 doIt()
176 --print(os.clock()-start)

效果大致如下:

转载于:https://www.cnblogs.com/chutianyao/archive/2010/07/22/1783222.html

使用Lua GD库动态生成验证码图片(2)相关推荐

  1. gd动态曲线 php_PHP GD库动态生成折线图的实例代码

    array_push ($p_x, $zuo+$i*$jiange); array_push ($p_y, $shang+round(($img_gao-$shang-$xia)*(1-$shuju[ ...

  2. PHP生产一个验证码图片,PHP使用GD库生成验证码图片,实现图片验证

    本文记录从php 下载配置GD图片生成库 到使用该库生成验证码图片,网页上实现验证码. 使用技术: php使用GD库绘图 [php版本7.3] php session 缓存 实现最终效果: 一. 配置 ...

  3. python绘制动态模拟图-Python 模拟生成动态产生验证码图片的方法

    模拟动态产生验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image L ...

  4. python动态验证码_Python 模拟生成动态产生验证码图片的方法

    模拟动态产生验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image L ...

  5. python 验证码图片 模拟登录_Python 模拟生成动态产生验证码图片的方法

    模拟动态产生验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image L ...

  6. python绘制动态模拟图-Python 模拟动态产生验证码图片

    模拟动态产生验证码图片 模拟生成验证码,首先要做的是生成随机的字母,然后对字母进行模糊处理.这里介绍一下 Python 提供的 Pillow 模块. Pillow PIL:Python Image L ...

  7. iis开启php验证码,php结合GD库实现中文验证码的简单方法

    前言 上一次写了一个常见的验证码,现在玩一下中文的验证码,顺便升级一下写的代码 流程基本差不多 先看GD库开启了没 生成中文5位验证码 开始画图 画干扰素 生成图形 完事 生成中文验证码 //小小心机 ...

  8. php简单验证码实例,php结合GD库简单实现验证码的示例代码

    前几日正好重温下GD库,来玩一下生成带有干扰素的验证码. 生成字母数字的图片验证码 首先需要看php.ini配置文件中有没有GD库,如果没有开启,请自行开启下,我用的小皮面板,基本现在都给你带上了. ...

  9. 《PHP基于GD库制作图形验证码》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

最新文章

  1. 恕我直言,90% 的应用场景都不需要用WebAssembly!
  2. 架构 | 微服务架构下如何解耦,对于已经紧耦合下如何重构?
  3. [蓝桥杯][算法提高VIP]摆花-多重背包计数问题
  4. Pointcut is not well-formed: expecting #39;name pattern#39; at character position 36
  5. 【肥朝】看源码,我为什么推荐IDEA?
  6. 224除以10为什么等于22c语言,C语言程序设计(专)-作业二武汉理工大学20春
  7. python activiti bpmn_Activiti 用户指南(BPMN 2.0介绍)
  8. 传智播客 机器学习基础 学习笔记
  9. Caused by: java.lang.ClassNotFoundException: Didn’t find class on path apk Android Studio解决方案
  10. 软考——IP计算问题那点事
  11. 吉林省谷歌高清卫星地图下载
  12. 搜狗输入法linux版怎么安装,Linux 搜狗输入法的安装(Ubuntu版)
  13. LinkLib例子之十五:本地文件回放,支持暂停,seek等
  14. 程序员那些你不知道的事:高收入程序员年薪高于50万,近四成程序员单身
  15. bzoj3332 旧试题 [最大生成树]
  16. 2011年5月10日中兴通讯实习生招聘笔试小记
  17. java 独木桥_Java实现洛谷 P1007独木桥
  18. 我用wxPython搭建GUI量化系统之wx.grid实现excel功能
  19. 用函数调用的方式实现汽车移动的例子 (python)
  20. 未来已来,看北京理工大学的智慧校园如何落地

热门文章

  1. 【接口文档】微信支付现金红包未开通,公众号发红包用第三方红包代发接口
  2. A micro Lie theory for state estimation in robotics002
  3. CKPT,SMON,PMON,RECO,Dnnn
  4. 用Burg法估计AR模型的参数原理详解及matlab实现
  5. 计算机硬盘加密的几种方法,对于移动硬盘加密方法 你了解多少种呢?
  6. 中国世界500强数量首超美国,但别高兴得太早
  7. oracle快速复制一个表
  8. 一起来学 R编程吧(2)---判断语句switch函数的用法
  9. 一个看漫画、看资讯、逛论坛、听歌的神器,务必吃下这颗安利!
  10. 数字IC后端需要学习什么?需要具备哪些技能?