設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 845|回復(fù): 2
打印 上一主題 下一主題

[與其它組件] 來個(gè)圖片驗(yàn)證碼如何?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2023-2-14 21:02:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
圖片驗(yàn)證碼,是為了在枯燥的登錄界面上添加一些趣味。
一般有三種思路:
  • 使用Windows API(主要是GDI+)。優(yōu)點(diǎn):純VBA,無需擔(dān)心兼容性問題。缺點(diǎn):API函數(shù)繁雜,不方便處理。
  • 調(diào)用互聯(lián)網(wǎng)API生成。優(yōu)點(diǎn):代碼簡(jiǎn)單。缺點(diǎn):需要聯(lián)網(wǎng),調(diào)用較多時(shí)可能需要購買次數(shù)。
  • 使用第三方工具生成。優(yōu)點(diǎn):代碼簡(jiǎn)單,無需聯(lián)網(wǎng)和付費(fèi)。缺點(diǎn):需要自行搜尋或制作工具。

這里就采用第3種方法,用Python制作一個(gè)工具,生成隨機(jī)驗(yàn)證碼。
一般用戶可能沒安裝python,所以我這里將它打包成exe文件。于是,VBA代碼就簡(jiǎn)單多了:
  1. Private Sub cmdQuit_Click()
  2.     DoCmd.Quit acQuitSaveAll
  3. End Sub

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

  7. '讀取驗(yàn)證碼文件,對(duì)比輸入是否正確。
  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 "驗(yàn)證碼錯(cuò)誤,請(qǐng)重新輸入"
  17.         Call refreshImage
  18.         Exit Sub
  19.     End If
  20. End Sub


  21. '刷新驗(yàn)證碼
  22. Sub refreshImage()
  23.     Me.imgChapchat.Picture = ""
  24.     Shell CurrentProject.Path & "\chapchat.exe"
  25.     Me.imgChapchat.Picture = CurrentProject.Path & "\chapchat.png"
  26. End Sub
復(fù)制代碼
代碼很簡(jiǎn)單。先清空?qǐng)D片,再運(yùn)行exe文件生成驗(yàn)證碼圖片和輸出驗(yàn)證碼文本,再讀取驗(yàn)證碼文本和輸入框文本是否一致。如一致則打開主窗體,否則刷新驗(yàn)證碼。這里就不添加注釋了。
最后附上python部分代碼,供有興趣的網(wǎng)友修改使用(如報(bào)錯(cuò),請(qǐng)使用pip install PIL安裝Image包)。
這里主要是從0-9中隨機(jī)選擇4個(gè)數(shù)字,然后轉(zhuǎn)為字符串,再使用draw方法生成圖片,以及用open方法輸出文本文件。
  • 由于只是作為測(cè)試使用,所以文本文件用了明文,加密其實(shí)也可以,只不過要使用可逆加密方式(MD5就算了,RC4可以考慮下)。
  • 個(gè)人更傾向于輸出文件后,使用VBA進(jìn)行加解密。大致思路是先讀取明文文件,進(jìn)行加密,將加密字符串更新到表中,刪除明文文件。讀取輸入框的字符,進(jìn)行加密,最后比對(duì)表中的字符串是否匹配。這樣的話,可以不必顧忌加密方法是否可逆(畢竟不需要解密)。
  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()
復(fù)制代碼
由于exe文件進(jìn)行了打包,因此稍微大一些(23M),個(gè)人覺得應(yīng)該還是在可接受范圍內(nèi)吧。

最后一點(diǎn):歡迎大家下載測(cè)試,如有報(bào)錯(cuò),請(qǐng)上傳截圖,以便我改進(jìn)。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊(cè)

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2023-2-15 13:57:14 | 只看該作者
大神牛,學(xué)習(xí)了,
3#
發(fā)表于 2023-2-15 14:28:30 | 只看該作者
剛下載測(cè)試可用。生成圖片時(shí)間要10秒鐘左右,可能是跟我電腦的配置性能有關(guān)系。謝謝分享。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 08:37 , Processed in 0.109637 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表