用Python处理Google reCAPTCHA表单遇报错:body未定义及Requests调用问题
解决reCaptcha验证的两个常见问题:body未定义与请求方式错误
嘿,我来帮你一步步解决遇到的问题:
1. 为什么会出现'body未定义'的错误?
原来的代码里的body是假设你已经从前端提交的表单请求中获取到了请求体数据,但不同Web框架获取请求体的方式不一样:
- 如果你用Flask,应该用
request.form.get('recaptchaResponse', None)来获取前端传来的reCaptcha响应值; - 如果你用Django,则是
request.POST.get('recaptchaResponse', None); - 要是你直接处理原始请求,可能需要先解析请求体的表单数据。
举个Flask环境下的修改示例:
from flask import request import urllib import json URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify' # 从表单中获取前端传来的recaptcha响应 recaptchaResponse = request.form.get('recaptchaResponse', None) private_recaptcha = '6LdXXXXXXXXXXXXXXXXXXXXXXXX' remote_ip = request.remote_addr params = urllib.urlencode({ 'secret': private_recaptcha, 'response': recaptchaResponse, 'remote_ip': remote_ip, }) data = urllib.urlopen(URIReCaptcha, params).read() result = json.loads(data) success = result.get('success', None) if success == True: print 'reCaptcha passed' else: print 'recaptcha failed'
2. 改用requests.get为什么会出错?
reCaptcha的siteverify接口要求用POST请求提交参数,而不是GET!GET请求会把参数拼在URL里,不符合接口的参数提交规范,所以会返回大量错误。
用requests库重写的正确代码应该是这样的(更简洁易读):
import requests from flask import request # 这里根据你的框架调整,比如Django用from django.http import HttpRequest URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify' recaptchaResponse = request.form.get('recaptchaResponse', None) private_recaptcha = '6LdXXXXXXXXXXXXXXXXXXXXXXXX' remote_ip = request.remote_addr payload = { 'secret': private_recaptcha, 'response': recaptchaResponse, 'remote_ip': remote_ip } # 用POST请求提交参数 response = requests.post(URIReCaptcha, data=payload) result = response.json() success = result.get('success', False) if success: print('reCaptcha passed') else: print('recaptcha failed') # 还可以打印错误信息排查问题 print('错误原因:', result.get('error-codes'))
3. 验证表单是否只需传递captcha-response即可?
不是的,reCaptcha验证有两个必填参数:
secret:你的服务器端私钥(就是代码里的private_recaptcha),这个绝对不能泄露给前端;response:前端传来的captcha-response值(也就是代码里的recaptchaResponse)。
而remote_ip是可选参数,用来验证请求的IP地址,提升安全性,但不是必须的。所以最少需要传递secret和response两个参数才能完成有效验证。
内容的提问来源于stack exchange,提问作者lucky simon
相关产品推荐
相关产品推荐

