jimi_ccap
Version:
node.js generate captcha using c++ library CImg without install any other lib or software
161 lines (117 loc) • 4.26 kB
JavaScript
var path = require('path');
var fs = require('fs');
var os = require('os');
var hrobj = require('../build/Release/hcaptha.node');
var dir = require('./dir.js');
var timer = require('./timer.js');
var gen_func = require('./gen.js');
//ccap.create("abcdef","/usr/local/nodejs/hcaptha/test.jpeg",6,256,40,40,50);
/*
CAP类支持3种实例化
1、CAP(),完全使用默认
2、CAP(width,height,offset)
3、CAP({
width:256,
height:40,
offset:40,
generate:function(){//自定义生成随机数
this.width;
this.height;
return "abcdefg";
}
})
*/
var ins_count = 0;//记录实例化次数
var img_path = path.join(__dirname,'../','/cap_img');
var pid = process.pid;
var isjpeg = (os.platform() == 'linux')? 1 : 0;//判断是否启用jpeg,如果是为win32则只能使用bmp
var fname = isjpeg ? '.jpeg':'.bmp'
var CAP = function(args){
if(!(this instanceof arguments.callee)) return new arguments.callee(args);
this.filename = img_path+'/captcha_'+ins_count+'_'+pid+'_{$number}'+fname;
this.width = 200;//默认验证码宽度
this.height = 60;//默认验证码高度
this.offset = 40;//默认验证码字符间隔
this.quality = 50;//默认图片质量
this._text_len = 4;//默认验证码字数
this.generate = null;//自定义生成随机字符串方法
this.fontsize = 57; //默认字体大小
this.is_first = true;
this._cache_num = 1000;//默认缓存5个验证码
this.buf = [];//缓存数组
this.text_buf = [];//定义字符串内容数组
this._init(args);//构造函数
this._create = this.generate ? this._custom_create : this._default_create;
this._create();
this.is_first = false;
}
CAP.prototype._init = function(args){
if(arguments.length<1) return;//如果不传参数,则全部使用默认值
if(typeof arguments[0] === 'object'){//如果传递了对象,则替换默认值
var obj = arguments[0];
this.width = obj.width || this.width;
this.height = obj.height || this.height;
this.offset = obj.offset || this.offset;
this.quality = obj.quality || this.quality;
this.generate = obj.generate || null;
this.fontsize = obj.fontsize || this.fontsize;
return;
}
//如果只传递了宽,高,间隔则替换默认值
this.width = arguments[0] || this.width;
this.height = arguments[1] || this.height;
this.offset = arguments[2] || this.offset;
this._get_count = 0;
return this;
}
CAP.prototype._default_generate = gen_func; //设置默认验证码生成函数
CAP.prototype._call_create = function(text,len,j){//调用C++的CIMG库的create函数生成验证码文件
var that = this;
var filepath = that.filename.replace('{$number}',j);
hrobj.create(text, filepath, len, that.width, that.height, that.offset, that.quality,isjpeg,that.fontsize);
if(this.is_first){
try{
var buffer = fs.readFileSync(filepath);
}catch(e){
console.log('readsync file error');
}
that.buf[j] = buffer;
that.text_buf[j] = text;
return this;
}
fs.readFile(filepath, function(err,data){
if(err) return console.log('read file error');
that.buf[j] = data;
that.text_buf[j] = text;
});
return this;
}
CAP.prototype._default_create = function(){//默认方式创建
for(var i=0;i<this._cache_num;i++){
this._call_create(this._default_generate(), this._text_len, i)
}
return this;
}
CAP.prototype._custom_create = function(){//自定义创建
for(var i=0;i<this._cache_num;i++){
var str = this.generate();
this._call_create(str, str.length,i);
}
return this;
}
CAP.prototype._timer = function(){//存入计数器的函数
this._get_count++;//记录timer调用次数
this._create();
}
CAP.prototype.get = function(){//对外接口,返回验证码和字母
var num = Math.floor(Math.random()*this._cache_num);//生成随机数
return [this.text_buf[num], this.buf[num]];//返回字母和buffer给用户
}
module.exports = function(args){
var cap = CAP(args);
ins_count++;
timer.reg_ary.push(cap);//将实例化之后的对象注册到timer定时器中
return cap;
};
dir();//设置路径权限,清空历史文件夹
//timer.loop();//启动计时器