为了解决 node.js 中生成验证码的问题,社区中有很多方案,但无非以下3种:
- 使用成熟 c++ 模块
- 使用自己开发的 c++ 模块
- 自己写 bmp 库
但是前2个明显不适合我,因为我和我的同事都用的是 windows 系统。 所以我开发了 svg 验证码,内部使用 opentype.js , 把字符转换为 svg 路径,然后生成验证码。这样就不需要任何 c++ 模块,wndows 上轻松运行。
默认生成的验证码:
代颜色的算数式验证码:
使用 npm 安装:
npm i svg-captcha --save
模块自带 ts 定义,使用 ts 或者 vscode 的小伙伴再也不用担心忘记 api 了。
生成图片的大小和速度均适中:
- 相比于 bmp 要小得多(150x50只有5k左右,而bmp100x40就要11k)
- 比 png 要小,但也要看复杂度
- 速度足够快,在我的 windows 笔记本上就有 1700张/s
- 据某个 bmp 验证码库生成,如果那个库不写文字不画噪点,可以12000张/s,但是在 node.js 中随机生成普通的字符串可以有10w到100w每秒,所以 svg 验证码如果不转路径,而是用 <text> ,在服务器上应该可以每秒有几十万张,当然我没有测过
- 如果用 js 直接写 bmp 不仅容易出错(没有成熟的库,你直接写入 buffer 很容易挂且难以调试,等等),如果太简单了容易直接被识别,太复杂了又影响性能。 svg 验证码则是字符串,生成速度适中,要识别的话,对方至少要先转一次格式。