Симуляция входа с использованием lua
Наше приложение должно использовать Lua для получения некоторых данных с веб-сайта. Но веб-сайт требует аутентификации (например, метод входа в Google).
Я пытаюсь использовать библиотеку LuaSocket, но не могу найти полный пример кода, поэтому я лишь наполовину осознаю, что мне нужно делать.
Я знаю, что есть второй, необязательный параметр для http.request(), который позволяет мне отправлять данные POST, и что я также могу использовать полный синтаксис, чтобы указать метод POST и какие данные отправлять, но я не знаю, какой формат данные должны быть в и как это должно выглядеть. Таблица? Строка? Какие?
Я также знаю, что мне также нужно установить тип и длину контента, но я не знаю, какими должны быть эти значения, и как их найти. Я не знаю, какие варианты и что пишут.
Может ли кто-нибудь помочь мне. Дайте мне полный образец входа в Google, используя lua?
Любая помощь с этим будет очень цениться. Спасибо большое.
1 ответ
Если сайт не использует базовую аутентификацию HTTP, но использует HTML-форму для аутентификации пользователя, и у вас нет доступа к разработчикам сайта, лучший способ выяснить, что происходит, - посмотреть, что делает браузер.
Запустите Firebug, Google Chrome Developer Tools или прокси-сервер для отладки 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 Заголовки ответа: дата: сб, 23 июн 2012 07:49:13 GMT Тип контента: текст / HTML; кодировка = UTF-8 соединение: Закрыть длина контента: 3 Тело ответа: Хорошо Закончен сброс ответа