Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions demo/flask_demo/start.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# coding:utf-8
import json

from flask import session, make_response, Flask, request, render_template
from flask import session, Flask, request, render_template
from geetest import GeetestLib

captcha_id = "b46d1900d0a894591916ea94ea91bd2c"
Expand Down Expand Up @@ -34,10 +34,10 @@ def validate_capthca():
user_id = session["user_id"]
if status:
result = gt.success_validate(challenge, validate, seccode, user_id)
print 111
print(111)
else:
result = gt.failback_validate(challenge, validate, seccode)
print 222
print(222)
result = "<html><body><h1>登录成功</h1></body></html>" if result else "<html><body><h1>登录失败</h1></body></html>"
return result

Expand All @@ -62,5 +62,5 @@ def login():


if __name__ == '__main__':
app.secret_key = 'i-like-python-nmba'
app.secret_key = 'b43b26d841ae46bb27bdaa43'
app.run()
132 changes: 41 additions & 91 deletions geetest/geetest.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
#!coding:utf8
import sys
import random
import os
import json
import requests
from binascii import hexlify
from hashlib import md5


if sys.version_info >= (3,):
xrange = range
import requests
import sys

VERSION = "3.2.0"

session = requests.Session()

class GeetestLib(object):

class GeetestLib(object):
FN_CHALLENGE = "geetest_challenge"
FN_VALIDATE = "geetest_validate"
FN_SECCODE = "geetest_seccode"
Expand Down Expand Up @@ -44,74 +42,44 @@ def _register(self, user_id=None):
challenge = self._md5_encode("".join([challenge, self.private_key]))
return 1, challenge
else:
return 0, self._make_fail_challenge()
return 0, os.urandom(17).encode('hex') if sys.version_info.major == 2 else hexlify(os.urandom(17)).decode()

def get_response_str(self):
return self._response_str

def _make_fail_challenge(self):
rnd1 = random.randint(0, 99)
rnd2 = random.randint(0, 99)
md5_str1 = self._md5_encode(str(rnd1))
md5_str2 = self._md5_encode(str(rnd2))
challenge = md5_str1 + md5_str2[0:2]
return challenge

def _make_response_format(self, success=1, challenge=None):
if not challenge:
challenge = self._make_fail_challenge()
string_format = json.dumps(
{'success': success, 'gt':self.captcha_id, 'challenge': challenge})
{'success': success, 'gt': self.captcha_id, 'challenge': challenge})
return string_format

def _register_challenge(self, user_id=None):
if user_id:
register_url = "{api_url}{handler}?gt={captcha_ID}&user_id={user_id}".format(
api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id, user_id=user_id)
else:
register_url = "{api_url}{handler}?gt={captcha_ID}".format(
api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id)
register_url = "{api_url}{handler}?gt={captcha_ID}&user_id={user_id}".format(
api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id, user_id=user_id or '')
try:
response = requests.get(register_url, timeout=2)
if response.status_code == requests.codes.ok:
res_string = response.text
else:
res_string = ""
ret = session.get(register_url, timeout=2)
ret.raise_for_status()
return ret.text
except:
res_string = ""
return res_string
return ''

def success_validate(self, challenge, validate, seccode, user_id=None):
"""
正常模式的二次验证方式.向geetest server 请求验证结果.
"""
if not self._check_para(challenge, validate, seccode):
return 0
if not self._check_result(challenge, validate):
if not (self._check_para(challenge, validate, seccode) and self._check_result(challenge, validate)):
return 0
validate_url = "{api_url}{handler}".format(
api_url=self.API_URL, handler=self.VALIDATE_HANDLER)
query = {
data = {
"seccode": seccode,
"sdk": ''.join( ["python_",self.sdk_version]),
"sdk": ''.join(["python_", self.sdk_version]),
"user_id": user_id
}
backinfo = self._post_values(validate_url, query)
if backinfo == self._md5_encode(seccode):
return 1
else:
return 0

def _post_values(self, apiserver, data):
response = requests.post(apiserver, data)
return response.text
backinfo = session.post(validate_url, data).text
return 1 if backinfo == self._md5_encode(seccode) else 1

def _check_result(self, origin, validate):
encodeStr = self._md5_encode(self.private_key + "geetest" + origin)
if validate == encodeStr:
return True
else:
return False
return True if validate == self._md5_encode(self.private_key + "geetest" + origin) else False

def failback_validate(self, challenge, validate, seccode):
"""
Expand All @@ -130,64 +98,46 @@ def failback_validate(self, challenge, validate, seccode):
decode_ans, decode_fbii, decode_igi)
return validate_result

def _check_para(self, challenge, validate, seccode):
return (bool(challenge.strip()) and bool(validate.strip()) and bool(seccode.strip()))
@staticmethod
def _check_para(*args):
return all(map(lambda x: x.strip(), args))

def _validate_fail_image(self, ans, full_bg_index , img_grp_index):
def _validate_fail_image(self, ans, full_bg_index, img_grp_index):
thread = 3
full_bg_name = str(self._md5_encode(str(full_bg_index)))[0:10]
bg_name = str(self._md5_encode(str(img_grp_index)))[10:20]
answer_decode = ""
for i in range(0,9):
if i % 2 == 0:
answer_decode += full_bg_name[i]
elif i % 2 == 1:
for i in range(9):
if i % 2:
answer_decode += bg_name[i]
x_decode = answer_decode[4:]
x_int = int(x_decode, 16)
result = x_int % 200
if result < 40:
result = 40
if abs(ans - result) < thread:
else:
answer_decode += full_bg_name[i]

x_int = int(answer_decode[4:], 16) % 200
if x_int < 40:
x_int = 40
if abs(ans - x_int) < thread:
return 1
else:
return 0

def _md5_encode(self, values):
if type(values) == str:
values = values.encode()
m = md5(values)
return m.hexdigest()
return md5(values).hexdigest()

def _decode_rand_base(self, challenge):
str_base = challenge[32:]
i = 0
temp_array = []
for i in xrange(len(str_base)):
temp_char = str_base[i]
temp_ascii = ord(temp_char)
for i in challenge[32:]:
temp_ascii = ord(i)
result = temp_ascii - 87 if temp_ascii > 57 else temp_ascii - 48
temp_array.append(result)
decode_res = temp_array[0]*36 + temp_array[1]
return decode_res
return temp_array[0] * 36 + temp_array[1]

def _decode_response(self, challenge, userresponse):
if len(userresponse) > 100:
return 0
shuzi = (1, 2, 5, 10, 50)
chongfu = set()
key = {}
count = 0
for i in challenge:
if i in chongfu:
continue
else:
value = shuzi[count % 5]
chongfu.add(i)
count += 1
key.update({i: value})
res = 0
for i in userresponse:
res += key.get(i, 0)
res = res - self._decode_rand_base(challenge)
return res
num = (1, 2, 5, 10, 50)
temp = ''.join(sorted(set(challenge), key=lambda x: challenge.find(x)))
res = sum(map(lambda i: num[temp.find(i) % 5] if i in temp else 0, userresponse))
return res - self._decode_rand_base(challenge)