You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:11:41