技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 22799
|
圖片驗(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)單多了:
- Private Sub cmdQuit_Click()
- DoCmd.Quit acQuitSaveAll
- End Sub
- Private Sub imgChapchat_Click()
- Call refreshImage
- End Sub
- '讀取驗(yàn)證碼文件,對(duì)比輸入是否正確。
- 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 "驗(yàn)證碼錯(cuò)誤,請(qǐng)重新輸入"
- Call refreshImage
- Exit Sub
- End If
- End Sub
- '刷新驗(yàn)證碼
- Sub refreshImage()
- Me.imgChapchat.Picture = ""
- Shell CurrentProject.Path & "\chapchat.exe"
- Me.imgChapchat.Picture = CurrentProject.Path & "\chapchat.png"
- 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ì)表中的字符串是否匹配。這樣的話,可以不必顧忌加密方法是否可逆(畢竟不需要解密)。
- 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()
復(fù)制代碼 由于exe文件進(jìn)行了打包,因此稍微大一些(23M),個(gè)人覺得應(yīng)該還是在可接受范圍內(nèi)吧。
最后一點(diǎn):歡迎大家下載測(cè)試,如有報(bào)錯(cuò),請(qǐng)上傳截圖,以便我改進(jìn)。
|
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊(cè)
x
|