我们的应用程序需要使用Lua从网站上获取一些数据。但网站需要身份验证(例如谷歌的登录方法)。
我试图使用LuaSocket库,但我无法找到完整的代码示例,所以我只知道自己需要做什么。
我知道http.request()的第二个可选参数允许我发送POST数据,我还可以使用完整语法来指定POST方法和要发送的数据,但是我不知道数据应该采用什么格式,以及它应该是什么样子。表?串?什么?
我也意识到我还需要设置内容类型和内容长度 - 但我不知道这些值应该是什么,也不知道如何找到它们。我不知道有什么选择和写作。
有人可以帮助我吗?使用lua给我一个完整的示例登录谷歌?
对此有任何帮助将非常感激。非常感谢。
答案 0 :(得分:3)
如果网站不使用HTTP基本身份验证,但使用HTML表单来识别用户,并且您无法访问网站开发人员,那么弄清楚发生了什么的最佳方法是查看浏览器的操作
启动您的Firebug或Google Chrome开发人员工具或某些HTTP调试代理。
在浏览器中打开网站,登录,查看浏览器执行此操作的请求以及网站的回复内容。您必须在程序中模仿相同的请求。
请注意,网站很可能会要求您在后续请求中发送会话信息以保持身份验证。它可以是cookie(或几个)和/或GET参数。再看看浏览器做什么和模仿。
至于格式 - 在网上搜索示例,有一些。
更新:好的,这是一个例子。
请注意,示例中使用的网址很快就会过期。只需在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")
预期产出:
Status: OK HTTP code: 200 Response headers: date : Sat, 23 Jun 2012 07:49:13 GMT content-type : text/html; charset=utf-8 connection : Close content-length : 3 Response body: ok Done dumping response