|
图片验证码,是为了在枯燥的登录界面上添加一些趣味。
一般有三种思路:
- 使用Windows API(主要是GDI+)。优点:纯VBA,无需担心兼容性问题。缺点:API函数繁杂,不方便处理。
- 调用互联网API生成。优点:代码简单。缺点:需要联网,调用较多时可能需要购买次数。
- 使用第三方工具生成。优点:代码简单,无需联网和付费。缺点:需要自行搜寻或制作工具。
这里就采用第3种方法,用Python制作一个工具,生成随机验证码。
一般用户可能没安装python,所以我这里将它打包成exe文件。于是,VBA代码就简单多了:
- Private Sub cmdQuit_Click()
- DoCmd.Quit acQuitSaveAll
- End Sub
- Private Sub imgChapchat_Click()
- Call refreshImage
- End Sub
- '读取验证码文件,对比输入是否正确。
- Private Sub login_Click()
- Dim strNumber As String
- Open CurrentProject.Path & "\chapchat.txt" For Input As #1
- Line Input #1, strNumber
- Close #1
- If Me.txtChapchat = strNumber Then
- DoCmd.OpenForm "frmMain"
- Else
- MsgBox "验证码错误,请重新输入"
- Call refreshImage
- Exit Sub
- End If
- End Sub
- '刷新验证码
- Sub refreshImage()
- Me.imgChapchat.Picture = ""
- Shell CurrentProject.Path & "\chapchat.exe"
- Me.imgChapchat.Picture = CurrentProject.Path & "\chapchat.png"
- End Sub
复制代码 代码很简单。先清空图片,再运行exe文件生成验证码图片和输出验证码文本,再读取验证码文本和输入框文本是否一致。如一致则打开主窗体,否则刷新验证码。这里就不添加注释了。
最后附上python部分代码,供有兴趣的网友修改使用(如报错,请使用pip install PIL安装Image包)。
这里主要是从0-9中随机选择4个数字,然后转为字符串,再使用draw方法生成图片,以及用open方法输出文本文件。
- 由于只是作为测试使用,所以文本文件用了明文,加密其实也可以,只不过要使用可逆加密方式(MD5就算了,RC4可以考虑下)。
- 个人更倾向于输出文件后,使用VBA进行加解密。大致思路是先读取明文文件,进行加密,将加密字符串更新到表中,删除明文文件。读取输入框的字符,进行加密,最后比对表中的字符串是否匹配。这样的话,可以不必顾忌加密方法是否可逆(毕竟不需要解密)。
- from PIL import Image, ImageDraw, ImageFont
- from random import sample
- from pathlib import Path
- import sys
- root_path = Path(sys.argv[0]).parent
- out_png = root_path / 'chapchat.png'
- out_txt = root_path / 'chapchat.txt'
- if __name__ == '__main__':
- img = Image.new(mode='RGB', size=(100, 100), color='#FFFFFF')
- draw = ImageDraw.Draw(img)
- number = ''.join([str(x) for x in sample(range(10), 4)])
- with open(out_txt, 'w') as f:
- f.write(number)
- font_name = r'C:\Windows\Fonts\simhei.ttf'
- font = ImageFont.truetype(font=font_name, size=24)
- draw.text(xy=(30, 30), text=number, font=font, fill=(128, 64, 64))
- img.save(out_png)
- img.close()
复制代码 由于exe文件进行了打包,因此稍微大一些(23M),个人觉得应该还是在可接受范围内吧。
最后一点:欢迎大家下载测试,如有报错,请上传截图,以便我改进。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|