Merge branch 'uat-export-face-live-detection' into 'release_electronic_bid_evaluation_room'

10.31 人脸识别-活体检测

See merge request eshop/fe_service_ebtp_frontend!44
This commit is contained in:
jl-zhoujl2
2022-10-31 01:23:40 +00:00
11 changed files with 5391 additions and 10924 deletions

View File

@ -4,8 +4,11 @@
<meta charset="utf-8">
<title>jQuery-webcam-master</title>
<!-- <link href="cs.css" rel="stylesheet" type="text/css"> -->
<script src="jquery.js"></script>
<script src="jquery.webcam.min.js"></script>
<script type="text/javascript" src="jquery-3.6.1.min.js"></script>
<script type="text/javascript" src="jquery.webcam.min.js"></script>
<script type="text/javascript" src="jsrsasign-latest-all-min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="living-jq.min.js"></script>
<!-- <script src="excanvas.js"></script> -->
</head>
<body>
@ -14,13 +17,10 @@
<img id="base64image" src='' width="450" height="320" style="float: left; clear: both;"/> -->
<script type="text/javascript">
var pos = 0, ctx = null, saveCB,w = 380,h= 200, image = new Array();
var canvas = document.createElement("canvas");//创建画布指定宽度和高度
canvas.setAttribute('width', 320);
canvas.setAttribute('height', 240);
document.body.appendChild(canvas);
// canvas = window.G_vmlCanvasManager.initElement(canvas);
ctx = canvas.getContext("2d");//设置画布为2d未来可能支持3d
image = ctx.getImageData(0, 0, 320, 240);//截图320*240即整个画布作为有效区(cutx?)
var lv = null;
var liveDetectPhoto = null;
var liveDetectPhotoUrl = null;
var canvas = null;
$(document).ready(function() {
$("#webcam").webcam({
width: w,
@ -45,9 +45,10 @@
//当绘制320*240像素的图片时发给后端php
if (pos == 4 * 320 * 240) {
//把图像放到画布上,输出为png格式
ctx.putImageData(img, 0, 0);
window.parent.postMessage({"image": canvas.toDataURL("image/png")}, '*');
image = new Array();
ctx.putImageData(img, 0, 0);
//liveDetectPhotoUrl = canvas.toDataURL("image/png");
liveDetectPhoto = base64ToBlob(canvas.toDataURL("image/png"));
//window.parent.postMessage({"image": liveDetectPhoto}, '*');
pos = 0;
}
// image.push(data);
@ -59,39 +60,131 @@
// pos = 0;
// }
},
onCapture: function(data) {
canvas = document.createElement("canvas");//创建画布指定宽度和高度
canvas.setAttribute('width', 320);
canvas.setAttribute('height', 240);
// document.body.appendChild(canvas);
// canvas = window.G_vmlCanvasManager.initElement(canvas);
ctx = canvas.getContext("2d");//设置画布为2d未来可能支持3d
image = ctx.getImageData(0, 0, 320, 240);//截图320*240即整个画布作为有效区(cutx?)
webcam.save();
// Show a flash for example
},
debug: function(type, string) {
console.log('type:' + type + ',string:' + string);
// Write debug information to console.log() or a div
},
onLoad: function() {
// Page load
}
});
// $('#snapBtn').on('click', function() {
// webcam.capture();
// });
window.addEventListener('message', receiveMessageFromParent, false);
function receiveMessageFromParent ( event ) {
if(event.data == 'releaseCamera'){
location.reload();
}else if(event.data = 'capture'){
webcam.capture();
liveDetectStart();
//webcam.capture();
}
//$('#base64image').attr('src', 'data:image/jpg;base64,' + event.data.data);
};
window.addEventListener('message', receiveMessageFromParent, false);
function setLiveDetectToken() {
let appKey= 'nkYy3g1yT0alE8pF6a1UTC4I';
let appSecrect = 'L30zHpTyAtTlY7tTCpbzdxxKCQgwWIQL';
// Header
var header = {
typ: "JWT", // 声明类型
alg: "HS256" // 声明加密的算法 通常直接使用 HMAC SHA256
};
var payload = {
iss: appKey,
iat: moment().unix(),
exp: moment()
.add(29, "minutes")
.unix()
};
var sHeader = JSON.stringify(header);
var sPayload = JSON.stringify(payload);
var sJWT = KJUR.jws.JWS.sign("HS256", sHeader, sPayload, {
utf8: appSecrect,
});
return sJWT;
}
function liveDetectStart () {
liveDetectStop();
let _lv = new Living(null, {
timer: 10000,
rate: 1000,
action : [1,3,2],
token: setLiveDetectToken(),
proxy:'/living/api',
getFacePicture:function(){
webcam.capture();
return {file:liveDetectPhoto};
},
//开始活体检测此时token已鉴权成功
onDetectStart:function(){
},
//每轮检测开始
onDetectActionStart:function(action){
},
//每轮检测计时
onDetectActionProgress:function(action,timer){
var actionAndTimer = {
arg1: action,
arg2: timer
};
//必须传递字符串
window.parent.postMessage({"actionAndTimer": actionAndTimer}, '*');
},
//每轮检测结束
onDetectActionFinish:function(action,data){
console.log(data)
},
//活体检测完成
onDetectFinish:function(data){
window.parent.postMessage({"detectResult": data}, '*');
}
});
//开始检测
_lv.start();
lv = _lv;
}
/**
* 停止活体检测
*/
function liveDetectStop (){
lv && lv.stop();
}
/**
* base64Url转blob
*/
function base64ToBlob(base64) {
var parts = base64.split(";base64,");
var contentType = parts[0].split(":")[1];
var raw = window.atob(parts[1]);
var rawLength = raw.length;
var uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; i += 1) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], { type: contentType });
};
});
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

1
public/faceLoginIE/living-jq.min.js vendored Normal file
View File

@ -0,0 +1 @@
(function(_0x12ba10,_0x363f5a){if(typeof define==='function'&&define['amd']){define(['jquery'],_0x363f5a);}else if(typeof exports==='object'){module['exports']=_0x363f5a(require('./js/jquery-3.6.1.min'));}else{_0x12ba10['Living']=_0x363f5a(_0x12ba10['$']);}}(this,function(_0x2283ac){function _0x28601d(_0x4d0a63,_0x2a999c){this['page']=_0x4d0a63;this['token']=_0x2a999c['token'];this['proxy']=_0x2a999c['proxy'];this['timer']=_0x2a999c['timer']||0xf0f5d^0xf284d;this['rate']=_0x2a999c['rate']||0xaff99^0xafffd;this['action']=_0x2a999c['action']||[];this['onDetectStart']=_0x2a999c['onDetectStart']&&typeof _0x2a999c['onDetectStart']==='function'?_0x2a999c['onDetectStart']:function(){};this['onDetectActionProgress']=_0x2a999c['onDetectActionProgress']&&typeof _0x2a999c['onDetectActionProgress']==='function'?_0x2a999c['onDetectActionProgress']:function(){};this['onDetectActionStart']=_0x2a999c['onDetectActionStart']&&typeof _0x2a999c['onDetectActionStart']==='function'?_0x2a999c['onDetectActionStart']:function(){};this['onDetectActionFinish']=_0x2a999c['onDetectActionFinish']&&typeof _0x2a999c['onDetectActionFinish']==='function'?_0x2a999c['onDetectActionFinish']:function(){};this['onDetectFinish']=_0x2a999c['onDetectFinish']&&typeof _0x2a999c['onDetectFinish']==='function'?_0x2a999c['onDetectFinish']:function(){};this['getFacePicture']=_0x2a999c['getFacePicture']&&typeof _0x2a999c['getFacePicture']==='function'?_0x2a999c['getFacePicture']:function(){};this['requestId']='';this['t']=null;}_0x28601d['prototype']={'start':function(){let _0x3378f0=this;this['getRequestId'](function(_0x5c3b12){_0x3378f0['requestId']=_0x5c3b12;_0x3378f0['checking']();_0x3378f0['onDetectStart']();});},'getRequestId':function(_0x37686a){let _0xfd3f05=this;_0x2283ac['ajax']({'type':'get','url':_0xfd3f05['proxy']+'/openapi/livingDetect/v1/getRequestId','dataType':'json','beforeSend':function(_0x5578ed){_0x5578ed['setRequestHeader']('Authorization','Bearer\x20'+_0xfd3f05['token']);},'success':function(_0x8186d6){if(_0x8186d6['code']==='0'){_0x37686a&&_0x37686a(_0x8186d6['data']['requestId']);}},'error':function(_0x3ed909){console['log'](_0x3ed909);}});},'checkAction':function(_0xe33a8c){let _0x1f4ccb=this;this['timeLoop'](_0x1f4ccb['action'][_0xe33a8c])['then'](function(_0x239a5a){_0x1f4ccb['stopLoop']();_0x1f4ccb['onDetectActionFinish'](_0x1f4ccb['action'][_0xe33a8c],{'code':0x1,'msg':'动作检测成功'});if(_0x1f4ccb['action'][_0xe33a8c+(0x1b77b^0x1b77a)]){_0x1f4ccb['checkAction'](_0xe33a8c+(0xb7504^0xb7505));}if(_0xe33a8c===_0x1f4ccb['action']['length']-(0x5f816^0x5f817)){_0x1f4ccb['stop']();_0x1f4ccb['onDetectFinish']({'code':0x1,'msg':'活体检测成功','file':_0x239a5a});}},function(){_0x1f4ccb['stop']();_0x1f4ccb['onDetectActionFinish'](_0x1f4ccb['action'][_0xe33a8c],{'code':0x0,'msg':'动作检测失败'});_0x1f4ccb['onDetectFinish']({'code':0x0,'msg':'活体检测失败'});});},'checking':function(){if(!this['action']['length']){return;}this['checkAction'](0x8171f^0x8171f);},'timeLoop':function(_0x358c73){let _0x3b2170=this;let _0x3d2180=this['rate'];this['onDetectActionStart'](_0x358c73,_0x3b2170['timer']);let _0x57c115=0xdfcde^0xdfcdf;var _0x3e15bf=_0x2283ac['Deferred']();let _0x19a9c8=_0x3b2170['timer'];_0x3b2170['t']=setInterval(function(){if(_0x19a9c8===(0x3a426^0x3a426)){_0x3b2170['stopLoop']();_0x3e15bf['reject']();return;}_0x19a9c8-=_0x3d2180;_0x3b2170['onDetectActionProgress'](_0x358c73,_0x19a9c8);_0x3b2170['upload'](_0x57c115++,_0x358c73,function(_0x4101fe){_0x3e15bf['resolve'](_0x4101fe);},function(){_0x3e15bf['reject']();});},_0x3d2180);return _0x3e15bf['promise']();},'upload':function(_0x31444d,_0x3278d8,_0x31de13,_0xb8cec1){let _0x21beb0=this;let _0xac3985=this['getFacePicture']();var _0x53190b=new FormData();_0x53190b['append']('picFile',_0xac3985['file']);_0x53190b['append']('requestId',_0x21beb0['requestId']||'');_0x53190b['append']('actionType',_0x3278d8);_0x53190b['append']('picSerialNumber',_0x31444d+'');_0x2283ac['ajax']({'type':'POST','url':_0x21beb0['proxy']+'/openapi/livingDetect/v1/start?time='+new Date()['getTime'](),'contentType':![],'processData':![],'beforeSend':function(_0x57d52c){_0x57d52c['setRequestHeader']('Authorization','Bearer\x20'+_0x21beb0['token']);},'data':_0x53190b,'success':function(_0x2d4654){if(_0x2d4654['code']==='0'){if(_0x2d4654['data']['isLiving']==='1'){_0x31de13&&_0x31de13({'file':_0xac3985['file']});}}},'error':function(_0x2da092){console['log'](_0x2da092);_0xb8cec1&&_0xb8cec1();}});},'stopLoop':function(){clearInterval(this['t']);},'stop':function(){this['stopLoop']();this['requestId']='';}};return _0x28601d;}));

4600
public/faceLoginIE/moment.js Normal file

File diff suppressed because it is too large Load Diff