设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 870|回复: 2
打印 上一主题 下一主题

[与其它组件] 来个图片验证码如何?

[复制链接]
跳转到指定楼层
1#
发表于 2023-2-14 21:02:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
图片验证码,是为了在枯燥的登录界面上添加一些趣味。
一般有三种思路:
  • 使用Windows API(主要是GDI+)。优点:纯VBA,无需担心兼容性问题。缺点:API函数繁杂,不方便处理。
  • 调用互联网API生成。优点:代码简单。缺点:需要联网,调用较多时可能需要购买次数。
  • 使用第三方工具生成。优点:代码简单,无需联网和付费。缺点:需要自行搜寻或制作工具。

这里就采用第3种方法,用Python制作一个工具,生成随机验证码。
一般用户可能没安装python,所以我这里将它打包成exe文件。于是,VBA代码就简单多了:
  1. Private Sub cmdQuit_Click()
  2.     DoCmd.Quit acQuitSaveAll
  3. End Sub

  4. Private Sub imgChapchat_Click()
  5.     Call refreshImage
  6. End Sub

  7. '读取验证码文件,对比输入是否正确。
  8. Private Sub login_Click()
  9.     Dim strNumber As String
  10.     Open CurrentProject.Path & "\chapchat.txt" For Input As #1
  11.     Line Input #1, strNumber
  12.     Close #1
  13.     If Me.txtChapchat = strNumber Then
  14.         DoCmd.OpenForm "frmMain"
  15.     Else
  16.         MsgBox "验证码错误,请重新输入"
  17.         Call refreshImage
  18.         Exit Sub
  19.     End If
  20. End Sub


  21. '刷新验证码
  22. Sub refreshImage()
  23.     Me.imgChapchat.Picture = ""
  24.     Shell CurrentProject.Path & "\chapchat.exe"
  25.     Me.imgChapchat.Picture = CurrentProject.Path & "\chapchat.png"
  26. End Sub
复制代码
代码很简单。先清空图片,再运行exe文件生成验证码图片和输出验证码文本,再读取验证码文本和输入框文本是否一致。如一致则打开主窗体,否则刷新验证码。这里就不添加注释了。
最后附上python部分代码,供有兴趣的网友修改使用(如报错,请使用pip install PIL安装Image包)。
这里主要是从0-9中随机选择4个数字,然后转为字符串,再使用draw方法生成图片,以及用open方法输出文本文件。
  • 由于只是作为测试使用,所以文本文件用了明文,加密其实也可以,只不过要使用可逆加密方式(MD5就算了,RC4可以考虑下)。
  • 个人更倾向于输出文件后,使用VBA进行加解密。大致思路是先读取明文文件,进行加密,将加密字符串更新到表中,删除明文文件。读取输入框的字符,进行加密,最后比对表中的字符串是否匹配。这样的话,可以不必顾忌加密方法是否可逆(毕竟不需要解密)。
  1. from PIL import Image, ImageDraw, ImageFont
  2. from random import sample
  3. from pathlib import Path
  4. import sys
  5. root_path = Path(sys.argv[0]).parent
  6. out_png = root_path / 'chapchat.png'
  7. out_txt = root_path / 'chapchat.txt'
  8. if __name__ == '__main__':
  9.     img = Image.new(mode='RGB', size=(100, 100), color='#FFFFFF')
  10.     draw = ImageDraw.Draw(img)
  11.     number = ''.join([str(x) for x in sample(range(10), 4)])
  12.     with open(out_txt, 'w') as f:
  13.         f.write(number)
  14.     font_name = r'C:\Windows\Fonts\simhei.ttf'
  15.     font = ImageFont.truetype(font=font_name, size=24)
  16.     draw.text(xy=(30, 30), text=number, font=font, fill=(128, 64, 64))
  17.     img.save(out_png)
  18.     img.close()
复制代码
由于exe文件进行了打包,因此稍微大一些(23M),个人觉得应该还是在可接受范围内吧。

最后一点:欢迎大家下载测试,如有报错,请上传截图,以便我改进。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2023-2-15 13:57:14 | 只看该作者
大神牛,学习了,
3#
发表于 2023-2-15 14:28:30 | 只看该作者
刚下载测试可用。生成图片时间要10秒钟左右,可能是跟我电脑的配置性能有关系。谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 02:10 , Processed in 0.088021 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表