recaptcha.py
59 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
Bradley M. Kuhn
|
r4187 | # -*- coding: utf-8 -*- | ||
Mads Kiilerich
|
r7718 | import json | ||
Mads Kiilerich
|
r8068 | import urllib.parse | ||
import urllib.request | ||||
Bradley M. Kuhn
|
r4187 | |||
class RecaptchaResponse(object): | ||||
def __init__(self, is_valid, error_code=None): | ||||
self.is_valid = is_valid | ||||
self.error_code = error_code | ||||
def __repr__(self): | ||||
return '<RecaptchaResponse:%s>' % (self.is_valid) | ||||
Patrick Vane
|
r7170 | def submit(g_recaptcha_response, private_key, remoteip): | ||
Bradley M. Kuhn
|
r4187 | """ | ||
Patrick Vane
|
r7170 | Submits a reCAPTCHA request for verification. Returns RecaptchaResponse for the request | ||
Bradley M. Kuhn
|
r4187 | |||
Patrick Vane
|
r7170 | g_recaptcha_response -- The value of g_recaptcha_response from the form | ||
Bradley M. Kuhn
|
r4187 | private_key -- your reCAPTCHA private key | ||
Mads Kiilerich
|
r5125 | remoteip -- the user's IP address | ||
Bradley M. Kuhn
|
r4187 | """ | ||
Patrick Vane
|
r7170 | if not (g_recaptcha_response and len(g_recaptcha_response)): | ||
return RecaptchaResponse(is_valid=False, error_code='incorrect-captcha-sol') | ||||
Bradley M. Kuhn
|
r4187 | |||
def encode_if_necessary(s): | ||||
Mads Kiilerich
|
r8081 | if isinstance(s, str): | ||
Bradley M. Kuhn
|
r4187 | return s.encode('utf-8') | ||
return s | ||||
Mads Kiilerich
|
r8068 | params = urllib.parse.urlencode({ | ||
Patrick Vane
|
r7170 | 'secret': encode_if_necessary(private_key), | ||
Bradley M. Kuhn
|
r4187 | 'remoteip': encode_if_necessary(remoteip), | ||
Patrick Vane
|
r7170 | 'response': encode_if_necessary(g_recaptcha_response), | ||
Mads Kiilerich
|
r8046 | }).encode('ascii') | ||
Bradley M. Kuhn
|
r4187 | |||
Mads Kiilerich
|
r8068 | req = urllib.request.Request( | ||
Patrick Vane
|
r7170 | url="https://www.google.com/recaptcha/api/siteverify", | ||
Bradley M. Kuhn
|
r4187 | data=params, | ||
headers={ | ||||
"Content-type": "application/x-www-form-urlencoded", | ||||
"User-agent": "reCAPTCHA Python" | ||||
} | ||||
) | ||||
Mads Kiilerich
|
r8068 | httpresp = urllib.request.urlopen(req) | ||
Patrick Vane
|
r7170 | return_values = json.loads(httpresp.read()) | ||
Bradley M. Kuhn
|
r4187 | httpresp.close() | ||
Patrick Vane
|
r7170 | if not (isinstance(return_values, dict)): | ||
return RecaptchaResponse(is_valid=False, error_code='incorrect-captcha-sol') | ||||
Mads Kiilerich
|
r7722 | elif (("success" in return_values) and ((return_values["success"] is True) or (return_values["success"] == "true"))): | ||
Bradley M. Kuhn
|
r4187 | return RecaptchaResponse(is_valid=True) | ||
Patrick Vane
|
r7170 | elif (("error-codes" in return_values) and isinstance(return_values["error-codes"], list) and (len(return_values["error-codes"]) > 0)): | ||
return RecaptchaResponse(is_valid=False, error_code=return_values["error-codes"][0]) | ||||
Bradley M. Kuhn
|
r4187 | else: | ||
Patrick Vane
|
r7170 | return RecaptchaResponse(is_valid=False, error_code='incorrect-captcha-sol') | ||