以下是我加倍检查和尝试的内容:
我能想到的最后一件事是我对reCAPTCHA的POST请求 API本身是不正确的,因为身体的具体格式不是 明确记录(参数记录,我知道)。所以这 是我正在发送的请求正文(密钥和IP已更改 但我在他身边查了一下):
privatekey=6LcHN8gSAABAAEt_gKsSwfuSfsam9ebhPJa8w_EV&remoteip=10.92.165.132& challenge=03AHJ_Vuu85MroKzagMlXq_trMemw4hKSP648MOf1JCua9W-5R968i2pPjE0jjDGX TYmWNjaqUXTGJOyMO3IKKOGtkeg_Xnn2UVAfoXHVQ-0VCHYPNwrj3PQgGj22EFv7RGSsuNfJCyn mwTO8TnwZZMRjHFrsglar2zQ&response=Coleshill areacce
这种格式有问题吗?我必须送特别的吗? 头?我完全错了吗? (我连续工作了16个小时 现在这可能是..)
感谢您的帮助!
答案 0 :(得分:17)
如上面的评论中所述,我能够借助于broofa和https://github.com/mirhampt/node-recaptcha提供的节点重新获取模块来解决问题。
但首先,要完成上面缺少的细节:
我没有发送任何请求标头,因为文档中没有任何说明。在解释必要参数之前,关于请求的所有内容如下:
“页面成功显示reCAPTCHA后,您需要配置表单以检查用户输入的答案是否正确。这是通过向http://www.google.com/recaptcha/api/verify发出POST请求来实现的。以下是相关参数“。
- “{3}}
所以我自己构建了一个查询字符串(这是一个单行程序,但是我现在已经知道了http://code.google.com/apis/recaptcha/docs/verify.html)包含所有参数并将其发送到reCAPTCHA API端点。我收到的只是错误代码invalid-site-private-key
,实际上(正如我们现在所知)实际上是发送400 Bad Request
的错误方法。也许他们应该考虑实施这个,然后人们不会想知道他们的钥匙有什么问题。
这些标题参数显然是必要的(它们暗示你要发送表单):
Content-Length
必须是查询字符串的长度Content-Type
必须为application/x-www-form-urlencoded
我从module模块学到的另一件事是,应该发送编码的utf8
编码。
我的解决方案现在看起来像这样,您可以使用它或在其上构建,但错误处理尚未实现。它是用CoffeeScript编写的。
http = require 'http'
module.exports.check = (remoteip, challenge, response, callback) ->
privatekey = 'placeyourprivatekeyhere'
request_body = "privatekey=#{privatekey}&remoteip=#{remoteip}&challenge=#{challenge}&response=#{response}"
response_body = ''
options =
host: 'www.google.com'
port: 80
method: 'POST'
path: '/recaptcha/api/verify'
req = http.request options, (res) ->
res.setEncoding 'utf8'
res.on 'data', (chunk) ->
response_body += chunk
res.on 'end', () ->
callback response_body.substring(0,4) == 'true'
req.setHeader 'Content-Length', request_body.length
req.setHeader 'Content-Type', 'application/x-www-form-urlencoded'
req.write request_body, 'utf8'
req.end()
谢谢:)
答案 1 :(得分:2)
+1给@florian非常有用的答案。对于后代,我想我会提供一些有关如何验证验证码请求的信息,以帮助您确保指定适当的标题和参数。
如果您使用的是Mac或Linux计算机,或者可以在本地访问其中一台计算机,则可以使用netcat命令设置快速服务器。我猜有netcat windows ports,但我有没有经验。
nc -l 8100
此命令创建一个监听pot 8100的TCP套接字,并等待连接。然后,您可以将服务器代码中http://www.google.com/recaptcha/...
的验证码验证网址更改为http://localhost:8100/
。当您的代码将POST
发送到验证网址时,您应该会看到您的请求通过netcat输出到scree:
POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 277
Host: localhost:8100
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1 (java 1.5)
privatekey=XXX&remoteip=127.0.0.1&challenge=03AHJYYY...&response=some+words
使用此功能,我能够看到我的私钥已损坏。