node.js 中生成验证码的另类方案——svg 验证码
发布于 4 天前 作者 steambap 384 次浏览 来自 分享

为了解决 node.js 中生成验证码的问题,社区中有很多方案,但无非以下3种:

  • 使用成熟 c++ 模块
  • 使用自己开发的 c++ 模块
  • 自己写 bmp 库

但是前2个明显不适合我,因为我和我的同事都用的是 windows 系统。 所以我开发了 svg 验证码,内部使用 opentype.js , 把字符转换为 svg 路径,然后生成验证码。这样就不需要任何 c++ 模块,wndows 上轻松运行。

默认生成的验证码:

example.png

代颜色的算数式验证码:

example-2.png

项目地址

使用 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 验证码则是字符串,生成速度适中,要识别的话,对方至少要先转一次格式。
14 回复

不错,收藏了

额可以

来自酷炫的 CNodeMD

使用中 方便!

话说 php 常用的 gd 库的 node binding 也挺不错… 在 centos & macOs 上安装也挺方便的, 现在线上用的 node-gd, 但就是 not build on Windows …

感谢社区支持。 这个模块并不是给mac用户的,因为直接安装基于c++模块的方案似乎更成熟。

好评,使用c++ 模块就是耍流氓

挺好的,就是可不可以加个配置字体文件的选项,想改字体的话就不用去替换默认的

@mabu233 现在暂时不行,因为 opentype.js 对某些字体(比如google的noto)的支持不行。。。

支持。橙子目前可还好……

@lgh06 还好还好……

回到顶部