如果站点不使用 HTTP 基本身份验证,而是使用 HTML 表单来验证用户,并且您无法访问站点开发人员,那么弄清楚发生了什么的最好方法是查看浏览器的功能。
启动您的 Firebug 或 Google Chrome 开发者工具,或一些 HTTP 调试代理。
在浏览器中打开该站点,登录,然后查看浏览器为此做了哪些请求,以及该站点的回复是什么。您必须在程序中模仿相同的请求。
请注意,网站很可能会要求您在后续请求中发送会话信息以保持身份验证。它可能是一个 cookie(或多个)和/或一个 GET 参数。再次,看看浏览器做什么和模仿。
至于格式——在网上搜索示例,有一些。
更新:好的,这是一个例子。
请注意,示例中使用的 URL 将很快过期。只需在http://requestb.in/创建您自己的。在浏览器中打开http://requestb.in/vbpkxivb?inspect以查看您的程序发送了哪些数据。不要向该服务发送真实的登录名和密码!
require 'socket.http'
local request_body = [[login=user&password=123]]
local response_body = { }
local res, code, response_headers = socket.http.request
{
url = "http://requestb.in/vbpkxivb";
method = "POST";
headers =
{
["Content-Type"] = "application/x-www-form-urlencoded";
["Content-Length"] = #request_body;
};
source = ltn12.source.string(request_body);
sink = ltn12.sink.table(response_body);
}
print("Status:", res and "OK" or "FAILED")
print("HTTP code:", code)
print("Response headers:")
if type(response_headers) == "table" then
for k, v in pairs(response_headers) do
print(k, ":", v)
end
else
-- Would be nil, if there is an error
print("Not a table:", type(response_headers))
end
print("Response body:")
if type(response_body) == "table" then
print(table.concat(response_body))
else
-- Would be nil, if there is an error
print("Not a table:", type(response_body))
end
print("Done dumping response")
预期输出:
状态:好的
HTTP 代码:200
响应标头:
日期:2012 年 6 月 23 日星期六 07:49:13 GMT
内容类型:文本/html;字符集=utf-8
连接:关闭
内容长度:3
回复正文:
好的
完成倾销响应