本文实例讲述了php+js实现的拖动滑块验证码验证表单操作。分享给大家供大家参考,具体如下:
现在很多网站,比如淘宝,京东等都改用使用极验拖动验证码实现登录,这种方式比传统的验证码方式有更好的体验,减少用户输入的错误,也同样能起到防盗刷的功能。现在很多极验都是第三方的,也很多都是收费的。今天在这里给大家分享自己用原生php实现的一个极验的代码。用原生php的好处就是以后你要嵌套到什么框架,可以直接用核心代码,改一改就好了。
极验拖动动画图
代码文件截图
代码实现
html文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!DOCTYPE html>
<html lang= "" >
<head>
<meta charset= "utf-8" >
<meta http-equiv= "x-ua-compatible" content= "ie=edge" >
<meta name= "viewport" content= "width=device-width, initial-scale=1" >
<title>极验滑块拖动验证码-码农社区-web视频分享网</title>
<script type= "text/javascript" src= "tn_code.js?v=35" ></script>
<link rel= "stylesheet" type= "text/css" href= "style.css?v=27" rel= "external nofollow" />
<style type= "text/css" ></style>
</head>
<body style= "text-align:center;" >
<div class= "tncode" style= "text-align: center;margin: 100px auto;" ></div>
<script type= "text/javascript" >
$TN.onsuccess( function (){
//验证通过
});
</script>
|
php文件:check.php
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
require_once dirname( __FILE__ ). '/TnCode.class.php' ;
$tn = new TnCode();
if ( $tn ->check()){
$_SESSION [ 'tncode_check' ] = 'ok' ;
echo "ok" ;
} else {
$_SESSION [ 'tncode_check' ] = 'error' ;
echo "error" ;
}
?>
|
主要核心文件:TnCode.class.php
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
<?php
class TnCode
{
var $im = null;
var $im_fullbg = null;
var $im_bg = null;
var $im_slide = null;
var $bg_width = 240;
var $bg_height = 150;
var $mark_width = 50;
var $mark_height = 50;
var $bg_num = 6;
var $_x = 0;
var $_y = 0;
//容错象素 越大体验越好,越小破解难道越高
var $_fault = 3;
function __construct(){
//ini_set('display_errors','On');
//
error_reporting (0);
if (!isset( $_SESSION )){
session_start();
}
}
function make(){
$this ->_init();
$this ->_createSlide();
$this ->_createBg();
$this ->_merge();
$this ->_imgout();
$this ->_destroy();
}
function check( $offset = '' ){
if (! $_SESSION [ 'tncode_r' ]){
return false;
}
if (! $offset ){
$offset = $_REQUEST [ 'tn_r' ];
}
$ret = abs ( $_SESSION [ 'tncode_r' ]- $offset )<= $this ->_fault;
if ( $ret ){
unset( $_SESSION [ 'tncode_r' ]);
} else {
$_SESSION [ 'tncode_err' ]++;
if ( $_SESSION [ 'tncode_err' ]>10){ //错误10次必须刷新
unset( $_SESSION [ 'tncode_r' ]);
}
}
return $ret ;
}
private function _init(){
$bg = mt_rand(1, $this ->bg_num);
$file_bg = dirname( __FILE__ ). '/bg/' . $bg . '.png' ;
$this ->im_fullbg = imagecreatefrompng( $file_bg );
$this ->im_bg = imagecreatetruecolor( $this ->bg_width, $this ->bg_height);
imagecopy( $this ->im_bg, $this ->im_fullbg,0,0,0,0, $this ->bg_width, $this ->bg_height);
$this ->im_slide = imagecreatetruecolor( $this ->mark_width, $this ->bg_height);
$_SESSION [ 'tncode_r' ] = $this ->_x = mt_rand(50, $this ->bg_width- $this ->mark_width-1);
$_SESSION [ 'tncode_err' ] = 0;
$this ->_y = mt_rand(0, $this ->bg_height- $this ->mark_height-1);
}
private function _destroy(){
imagedestroy( $this ->im);
imagedestroy( $this ->im_fullbg);
imagedestroy( $this ->im_bg);
imagedestroy( $this ->im_slide);
}
private function _imgout(){
if (! $_GET [ 'nowebp' ]&&function_exists( 'imagewebp' )){ //优先webp格式,超高压缩率
$type = 'webp' ;
$quality = 40; //图片质量 0-100
} else {
$type = 'png' ;
$quality = 7; //图片质量 0-9
}
header( 'Content-Type: image/' . $type );
$func = "image" . $type ;
$func ( $this ->im,null, $quality );
}
private function _merge(){
$this ->im = imagecreatetruecolor( $this ->bg_width, $this ->bg_height*3);
imagecopy( $this ->im, $this ->im_bg,0, 0 , 0, 0, $this ->bg_width, $this ->bg_height);
imagecopy( $this ->im, $this ->im_slide,0, $this ->bg_height , 0, 0, $this ->mark_width, $this ->bg_height);
imagecopy( $this ->im, $this ->im_fullbg,0, $this ->bg_height*2 , 0, 0, $this ->bg_width, $this ->bg_height);
imagecolortransparent( $this ->im,0); //16777215
}
private function _createBg(){
$file_mark = dirname( __FILE__ ). '/img/mark.png' ;
$im = imagecreatefrompng( $file_mark );
header( 'Content-Type: image/png' );
//imagealphablending( $im, true);
imagecolortransparent( $im ,0); //16777215
//imagepng($im);exit;
imagecopy( $this ->im_bg, $im , $this ->_x, $this ->_y , 0 , 0 , $this ->mark_width, $this ->mark_height);
imagedestroy( $im );
}
private function _createSlide(){
$file_mark = dirname( __FILE__ ). '/img/mark2.png' ;
$img_mark = imagecreatefrompng( $file_mark );
imagecopy( $this ->im_slide, $this ->im_fullbg,0, $this ->_y , $this ->_x, $this ->_y, $this ->mark_width, $this ->mark_height);
imagecopy( $this ->im_slide, $img_mark ,0, $this ->_y , 0, 0, $this ->mark_width, $this ->mark_height);
imagecolortransparent( $this ->im_slide,0); //16777215
//header('Content-Type: image/png');
//imagepng($this->im_slide);exit;
imagedestroy( $img_mark );
}
}
?>
|
附:完整实例代码点击此处本站下载。
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://www.cnblogs.com/zxf100/archive/2019/07/16/11192781.html