Skip to content
This repository was archived by the owner on Jun 29, 2026. It is now read-only.

Commit c22812b

Browse files
committed
fix failbak bug
modify flask demo for new version
1 parent 064bab6 commit c22812b

2 files changed

Lines changed: 47 additions & 76 deletions

File tree

demo/flask_demo/start.py

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,30 @@
11
# coding:utf-8
22
from flask import session, make_response, Flask, request, render_template
3-
from sdk.geetestlib import GeetestLib
4-
5-
id = "a40fd3b0d712165c5d13e6f747e948d4"
6-
key = "0f1a37e33c9ed10dd2e133fe2ae9c459"
7-
product = "embed"
8-
9-
# 弹出式
10-
# product = "popup&popupbtnid=submit-button"
3+
from geetest import GeetestLib
4+
captcha_id = "a40fd3b0d712165c5d13e6f747e948d4"
5+
private_key = "0f1a37e33c9ed10dd2e133fe2ae9c459"
116

127
app = Flask(__name__)
138
app.config.update(
149
DEBUG=True,
15-
#SERVER_NAME='127.0.0.1:5000'
1610
)
1711

1812
@app.route('/getcaptcha', methods=["GET"])
1913
def get_captcha():
20-
gt = GeetestLib(id, key)
21-
if gt.pre_process():
22-
res_str = gt.success_pre_process()
23-
gt.set_gtserver_session(session.__setitem__, 1, gt.challenge)
24-
else:
25-
res_str = gt.fail_pre_process()
26-
gt.set_gtserver_session(session.__setitem__, 0, gt.challenge)
27-
return res_str
14+
gt = GeetestLib(captcha_id, private_key)
15+
status, response_str = gt.pre_process()
16+
session[gt.GT_STATUS_SESSION_KEY] = status
17+
return response_str
2818

2919
@app.route('/validate', methods=["POST"])
3020
def validate_capthca():
31-
challenge = request.form['geetest_challenge']
32-
validate = request.form['geetest_validate']
33-
seccode = request.form['geetest_seccode']
34-
gt = GeetestLib(id,key)
35-
gt.challenge = gt.get_gtserver_challenge(session.__getitem__)
36-
gt_server_status = gt.get_gtserver_session(session.__getitem__)
37-
if gt_server_status == 1:
38-
result = gt.post_validate(challenge, validate, seccode)
39-
else:
40-
result = gt.failback_validate(challenge, validate, seccode)
21+
gt = GeetestLib(captcha_id, private_key)
22+
status = session[gt.GT_STATUS_SESSION_KEY]
23+
challenge = request.form[gt.FN_CHALLENGE]
24+
validate = request.form[gt.FN_VALIDATE]
25+
seccode = request.form[gt.FN_SECCODE]
26+
gt = GeetestLib(captcha_id, private_key)
27+
result = gt.validate(status, challenge, validate, seccode)
4128
return result
4229

4330
@app.route('/')

geetest/geetest.py

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class GeetestLib(object):
1616
FN_VALIDATE = "geetest_validate"
1717
FN_SECCODE = "geetest_seccode"
1818

19+
GT_STATUS_SESSION_KEY = "gt_server_status"
20+
1921
SUCCESS_RES = "success"
2022
FAIL_RES = "fail"
2123

@@ -24,9 +26,9 @@ class GeetestLib(object):
2426
VALIDATE_HANDLER = "/validate.php"
2527

2628

27-
def __init__(self, id, key):
28-
self.private_key = key #私钥
29-
self.captcha_id = id #公钥
29+
def __init__(self, captcha_id, private_key):
30+
self.private_key = private_key #私钥
31+
self.captcha_id = captcha_id #公钥
3032
self.sdk_version = VERSION #SDK版本
3133

3234
def pre_process(self):
@@ -36,17 +38,18 @@ def pre_process(self):
3638
:return Boolean:
3739
"""
3840
status, challenge = self._register()
41+
return status, self._make_response_format(status, challenge)
3942

4043
def _register(self):
41-
challenge=self._register_challenge()
44+
challenge = self._register_challenge()
4245
if len(challenge) == 32:
4346
return 1, challenge
4447
else:
4548
return 0, self._make_fail_challenge()
4649

4750
def _make_fail_challenge(self):
48-
rnd1 = int(round(random.random()*100))
49-
rnd2 = int(round(random.random()*100))
51+
rnd1 = random.randint(0, 99)
52+
rnd2 = random.randint(0, 99)
5053
md5_str1 = self.md5_encode(str(rnd1))
5154
md5_str2 = self.md5_encode(str(rnd2))
5255
challenge = md5_str1 + md5_str2[0:2]
@@ -55,7 +58,7 @@ def _make_fail_challenge(self):
5558
def _make_response_format(self, success=1, challenge=None):
5659
if not challenge:
5760
challenge = self._make_fail_challenge()
58-
string_format = json.dumps({'success': success, 'gt':self.captcha_ID ,'challenge': challenge})
61+
string_format = json.dumps({'success': success, 'gt':self.captcha_id ,'challenge': challenge})
5962
return string_format
6063

6164
def _register_challenge(self):
@@ -67,7 +70,7 @@ def _register_challenge(self):
6770
res_string = ""
6871
return res_string
6972

70-
def post_validate(self, status, challenge, validate, seccode):
73+
def validate(self, status, challenge, validate, seccode):
7174
"""
7275
validate二次验证.
7376
@@ -131,52 +134,40 @@ def failback_validate(self, challenge, validate, seccode):
131134
:param seccode:
132135
:return result:
133136
"""
134-
if not self.request_is_legal(challenge, validate, seccode):
135-
return self.fail_res
136-
validate_str = "".join(validate.split('_'))
137+
if not self._check_para(challenge, validate, seccode):
138+
return self.FAIL_RES
139+
validate_str = validate.split('_')
137140
encode_ans = validate_str[0]
138141
encode_fbii = validate_str[1] #_fbii : Full Bg Img Index
139142
encode_igi = validate_str[2]
140-
decode_ans = self.decode_response(self.challenge, encode_ans)
141-
decode_fbii = self.decode_response(self.challenge, encode_fbii)
142-
decode_igi = self.decode_response(self.challenge, encode_igi) #_igi : Img Grp Index
143-
validate_result = self.validate_fail_image(decode_ans, decode_fbii, decode_igi)
144-
if not validate_result == self.fail_res:
145-
rand1 = self.random_num()
146-
md5Str = self.md5_encode(rand1 + "")
147-
self.challenge = md5Str
143+
decode_ans = self.decode_response(challenge, encode_ans)
144+
decode_fbii = self.decode_response(challenge, encode_fbii)
145+
decode_igi = self.decode_response(challenge, encode_igi) #_igi : Img Grp Index
146+
validate_result = self._validate_fail_image(decode_ans, decode_fbii, decode_igi)
148147
return validate_result
149148

150149
def _check_para(self, challenge, validate, seccode):
151150
return bool(challenge.strip()) and bool(validate.strip()) and bool(seccode.strip())
152151

153-
def validate_fail_image(self, ans, full_bg_index , img_grp_index):
154-
"""
155-
failback模式下,简单判断轨迹是否通过
156-
157-
:param ans:
158-
:param full_bg_index:
159-
:param img_grp_index:
160-
:return result:
161-
"""
152+
def _validate_fail_image(self, ans, full_bg_index , img_grp_index):
162153
thread = 3
163154
full_bg_name = str(self.md5_encode(str(full_bg_index)))[0:10]
164-
bg_name = str(self.md5_encode(str(img_grp_index)))[0:10]
155+
bg_name = str(self.md5_encode(str(img_grp_index)))[10:20]
165156
answer_decode = ""
166157
for i in range(0,9):
167158
if i % 2 == 0:
168159
answer_decode += full_bg_name[i]
169160
elif i % 2 == 1:
170161
answer_decode += bg_name[i]
171-
x_decode = answer_decode[4]
172-
x_int = string.atoi(x_decode, 16)
162+
x_decode = answer_decode[4:]
163+
x_int = int(x_decode, 16)
173164
result = x_int % 200
174165
if result < 40:
175166
result = 40
176167
if abs(ans - result) < thread:
177-
return self.success_res
168+
return self.SUCCESS_RES
178169
else:
179-
return self.fail_res
170+
return self.FAIL_RES
180171

181172
def md5_encode(self, values):
182173
"""
@@ -196,16 +187,15 @@ def decode_rand_base(self, challenge):
196187
:param challenge:
197188
:return decode_result:
198189
"""
199-
str_base = challenge[32:34]
190+
str_base = challenge[32:]
200191
i = 0
201192
temp_array = []
202-
while i < len(str_base):
193+
for i in xrange(len(str_base)):
203194
temp_char = str_base[i]
204-
temp_Ascii = ord(temp_char)
205-
result = temp_Ascii - 87 if temp_Ascii > 57 else temp_Ascii - 48
195+
temp_ascii = ord(temp_char)
196+
result = temp_ascii - 87 if temp_ascii > 57 else temp_ascii - 48
206197
temp_array.append(result)
207-
i += 1
208-
decode_res = temp_array[1]*36 + temp_array[1]
198+
decode_res = temp_array[0]*36 + temp_array[1]
209199
return decode_res
210200

211201
def decode_response(self, challenge, userresponse):
@@ -219,20 +209,21 @@ def decode_response(self, challenge, userresponse):
219209
if len(userresponse) > 100:
220210
return 0
221211
shuzi = (1, 2, 5, 10, 50)
222-
chongfu = []
212+
chongfu = set()
223213
key = {}
224214
count = 0
225215
for i in challenge:
226216
if i in chongfu:
227217
continue
228218
else:
229219
value = shuzi[count % 5]
230-
chongfu.append(i)
220+
chongfu.add(i)
231221
count += 1
232222
key.update({i: value})
233223
res = 0
234224
for i in userresponse:
235225
res += key.get(i, 0)
226+
res = res - self.decode_rand_base(challenge)
236227
return res
237228

238229
def random_num():
@@ -242,11 +233,4 @@ def random_num():
242233
:return Float:
243234
"""
244235
rand_num = random.random()*100
245-
return rand_num
246-
247-
248-
249-
250-
251-
252-
236+
return rand_num

0 commit comments

Comments
 (0)