|
@@ -0,0 +1,99 @@
|
|
|
|
|
+# copied from recaptcha-client-1.0.5
|
|
|
|
|
+# http://pypi.python.org/pypi/recaptcha-client
|
|
|
|
|
+# http://recaptcha.net/resources.html
|
|
|
|
|
+
|
|
|
|
|
+import urllib2, urllib
|
|
|
|
|
+
|
|
|
|
|
+API_SSL_SERVER="https://api-secure.recaptcha.net"
|
|
|
|
|
+API_SERVER="http://api.recaptcha.net"
|
|
|
|
|
+VERIFY_SERVER="api-verify.recaptcha.net"
|
|
|
|
|
+
|
|
|
|
|
+class RecaptchaResponse(object):
|
|
|
|
|
+ def __init__(self, is_valid, error_code=None):
|
|
|
|
|
+ self.is_valid = is_valid
|
|
|
|
|
+ self.error_code = error_code
|
|
|
|
|
+
|
|
|
|
|
+def displayhtml (public_key,
|
|
|
|
|
+ use_ssl = False,
|
|
|
|
|
+ error = None):
|
|
|
|
|
+ """Gets the HTML to display for reCAPTCHA
|
|
|
|
|
+
|
|
|
|
|
+ public_key -- The public api key
|
|
|
|
|
+ use_ssl -- Should the request be sent over ssl?
|
|
|
|
|
+ error -- An error message to display (from RecaptchaResponse.error_code)"""
|
|
|
|
|
+
|
|
|
|
|
+ error_param = ''
|
|
|
|
|
+ if error:
|
|
|
|
|
+ error_param = '&error=%s' % error
|
|
|
|
|
+
|
|
|
|
|
+ if use_ssl:
|
|
|
|
|
+ server = API_SSL_SERVER
|
|
|
|
|
+ else:
|
|
|
|
|
+ server = API_SERVER
|
|
|
|
|
+
|
|
|
|
|
+ # DCR: added comment to force ElementTree to emit </script> tag closer
|
|
|
|
|
+ return """<script type="text/javascript" src="%(ApiServer)s/challenge?k=%(PublicKey)s%(ErrorParam)s"><!-- --></script>
|
|
|
|
|
+
|
|
|
|
|
+<noscript>
|
|
|
|
|
+ <iframe src="%(ApiServer)s/noscript?k=%(PublicKey)s%(ErrorParam)s" height="300" width="500" frameborder="0"></iframe><br />
|
|
|
|
|
+ <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
|
|
|
|
|
+ <input type='hidden' name='recaptcha_response_field' value='manual_challenge' />
|
|
|
|
|
+</noscript>
|
|
|
|
|
+""" % {
|
|
|
|
|
+ 'ApiServer' : server,
|
|
|
|
|
+ 'PublicKey' : public_key,
|
|
|
|
|
+ 'ErrorParam' : error_param,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def submit (recaptcha_challenge_field,
|
|
|
|
|
+ recaptcha_response_field,
|
|
|
|
|
+ private_key,
|
|
|
|
|
+ remoteip):
|
|
|
|
|
+ """
|
|
|
|
|
+ Submits a reCAPTCHA request for verification. Returns RecaptchaResponse
|
|
|
|
|
+ for the request
|
|
|
|
|
+
|
|
|
|
|
+ recaptcha_challenge_field -- The value of recaptcha_challenge_field from the form
|
|
|
|
|
+ recaptcha_response_field -- The value of recaptcha_response_field from the form
|
|
|
|
|
+ private_key -- your reCAPTCHA private key
|
|
|
|
|
+ remoteip -- the user's ip address
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
|
|
+ if not (recaptcha_response_field and recaptcha_challenge_field and
|
|
|
|
|
+ len (recaptcha_response_field) and len (recaptcha_challenge_field)):
|
|
|
|
|
+ return RecaptchaResponse (is_valid = False, error_code = 'incorrect-captcha-sol')
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ def encode_if_necessary(s):
|
|
|
|
|
+ if isinstance(s, unicode):
|
|
|
|
|
+ return s.encode('utf-8')
|
|
|
|
|
+ return s
|
|
|
|
|
+
|
|
|
|
|
+ params = urllib.urlencode ({
|
|
|
|
|
+ 'privatekey': encode_if_necessary(private_key),
|
|
|
|
|
+ 'remoteip' : encode_if_necessary(remoteip),
|
|
|
|
|
+ 'challenge': encode_if_necessary(recaptcha_challenge_field),
|
|
|
|
|
+ 'response' : encode_if_necessary(recaptcha_response_field),
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ request = urllib2.Request (
|
|
|
|
|
+ url = "http://%s/verify" % VERIFY_SERVER,
|
|
|
|
|
+ data = params,
|
|
|
|
|
+ headers = {
|
|
|
|
|
+ "Content-type": "application/x-www-form-urlencoded",
|
|
|
|
|
+ "User-agent": "reCAPTCHA Python"
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ httpresp = urllib2.urlopen (request)
|
|
|
|
|
+
|
|
|
|
|
+ return_values = httpresp.read ().splitlines ();
|
|
|
|
|
+ httpresp.close();
|
|
|
|
|
+
|
|
|
|
|
+ return_code = return_values [0]
|
|
|
|
|
+
|
|
|
|
|
+ if (return_code == "true"):
|
|
|
|
|
+ return RecaptchaResponse (is_valid=True)
|
|
|
|
|
+ else:
|
|
|
|
|
+ return RecaptchaResponse (is_valid=False, error_code = return_values [1])
|