captchapng验证码模块

undefined

因为快讯的工作需要,所以就学起了如何引入验证码模块。原本觉得难以想象,看着网上各色教程各种实现。完全没头绪。第一次接触一个模块背后牵扯一大堆的依赖,让你倒在安装依赖的路上。

安装

使用captchapng模块,先安装了captchapng。

1
$ npm install captchapng

引用模块

然后就是贴上这堆代码,设置生成验证码的配置,详情看注释就可以。生成后,肯定要将验证码传递出去才能验证呀。所以将它保存在session里面传递到验证的地方去:(Ps:这部分代码是参考某一位大神的博客的,可是忘了留地址。如果侵权,给我留下地址。马上补回来。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 图片验证码
* @param req
* @param res
* @param next
*/
var captchapng = require('captchapng');
exports.new = function (req,res){
var code = '123456789';
var length = 4;
var randomcode = '';
for (var i = 0; i < length; i++) {
randomcode += code[parseInt(Math.random() * 1000) % code.length];
}
randomcode = parseInt(randomcode);
randomcode += 1000;
// // 保存到session
req.session.code = randomcode;
// if (null == req.session[sessionConstant]) {
// req.session[sessionConstant] = {};
// }
// req.session[sessionConstant][randomcode] = randomcode;
// 输出图片
var p = new captchapng(80,30,randomcode); // width,height,numeric captcha
p.color(255, 255, 255, 0); // First color: background (red, green, blue, alpha)
p.color(80, 80, 80, 255); // Second color: paint (red, green, blue, alpha)
var img = p.getBase64();
var imgbase64 = new Buffer(img,'base64');
res.writeHead(200, {
'Content-Type': 'image/png'
});
res.end(imgbase64);
}

生成验证码

在html页面只需要设置imgsrc为一个路由链接到这个模块就行。服务器就能返回一个图片回去。

1
app.get('/captcha',Ccap.new);

最后

不过这个验证码模块是较为简单的,只能生成数字的模块。有了第一步,以后争取学习更复杂的验证码模块!或者等node.js官方自带图片模块后,这种依赖的状况就能改善吧。

更新

session

和朋友交流过之后才发现自己有一个地方没考虑周到,不过不体现在该代码上。但是也记录在此吧。就是比较完验证码后需要将session的值清空,不然也起不到防止爬虫的作用。——爬虫只需要跳过你验证码更新的模块就可以爬取数据了。

1
req.session.code = null;

BUG

该代码中有一处错误,就是如果直接生成的是0-9999的字符串数组,在转换为数字验证码的时候,如果是0开头的话,会导致验证码出错。(开头为0的数字被省略)。

解决方法

生成的是random9000,再加1000.代码已经修改。

1
2
3
4
var code = '123456789';//去除0
randomcode = parseInt(randomcode);//先转换为数字
randomcode += 1000;//加上1000,确保不会产生0开头