source: CMESS/captcha/trunk/com/zms/captcha/reCaptcha.py @ 355

Revision 355, 3.0 KB checked in by mike, 3 years ago (diff)
  • include reCaptcha-Service
Line 
1import urllib2, urllib
2
3API_SSL_SERVER="https://api-secure.recaptcha.net"
4API_SERVER="http://api.recaptcha.net"
5VERIFY_SERVER="api-verify.recaptcha.net"
6
7class RecaptchaResponse(object):
8    def __init__(self, is_valid, error_code=None):
9        self.is_valid = is_valid
10        self.error_code = error_code
11
12def displayhtml (public_key,
13                 use_ssl = False,
14                 error = None):
15    """Gets the HTML to display for reCAPTCHA
16
17    public_key -- The public api key
18    use_ssl -- Should the request be sent over ssl?
19    error -- An error message to display (from RecaptchaResponse.error_code)"""
20
21    error_param = ''
22    if error:
23        error_param = '&error=%s' % error
24
25    if use_ssl:
26        server = API_SSL_SERVER
27    else:
28        server = API_SERVER
29
30    return """<script type="text/javascript" src="%(ApiServer)s/challenge?k=%(PublicKey)s%(ErrorParam)s"></script>
31
32<noscript>
33  <iframe src="%(ApiServer)s/noscript?k=%(PublicKey)s%(ErrorParam)s" height="300" width="500" frameborder="0"></iframe><br />
34  <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
35  <input type='hidden' name='recaptcha_response_field' value='manual_challenge' />
36</noscript>
37""" % {
38        'ApiServer' : server,
39        'PublicKey' : public_key,
40        'ErrorParam' : error_param,
41        }
42
43
44def submit (recaptcha_challenge_field,
45            recaptcha_response_field,
46            private_key,
47            remoteip):
48    """
49    Submits a reCAPTCHA request for verification. Returns RecaptchaResponse
50    for the request
51
52    recaptcha_challenge_field -- The value of recaptcha_challenge_field from the form
53    recaptcha_response_field -- The value of recaptcha_response_field from the form
54    private_key -- your reCAPTCHA private key
55    remoteip -- the user's ip address
56    """
57
58    if not (recaptcha_response_field and recaptcha_challenge_field and
59            len (recaptcha_response_field) and len (recaptcha_challenge_field)):
60        return RecaptchaResponse (is_valid = False, error_code = 'incorrect-captcha-sol')
61   
62
63    def encode_if_necessary(s):
64        if isinstance(s, unicode):
65            return s.encode('utf-8')
66        return s
67
68    params = urllib.urlencode ({
69            'privatekey': encode_if_necessary(private_key),
70            'remoteip' :  encode_if_necessary(remoteip),
71            'challenge':  encode_if_necessary(recaptcha_challenge_field),
72            'response' :  encode_if_necessary(recaptcha_response_field),
73            })
74
75    request = urllib2.Request (
76        url = "http://%s/verify" % VERIFY_SERVER,
77        data = params,
78        headers = {
79            "Content-type": "application/x-www-form-urlencoded",
80            "User-agent": "reCAPTCHA Python"
81            }
82        )
83   
84    httpresp = urllib2.urlopen (request)
85
86    return_values = httpresp.read ().splitlines ();
87    httpresp.close();
88
89    return_code = return_values [0]
90
91    if (return_code == "true"):
92        return RecaptchaResponse (is_valid=True)
93    else:
94        return RecaptchaResponse (is_valid=False, error_code = return_values [1])
95
96
Note: See TracBrowser for help on using the repository browser.