Симуляция входа с использованием 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
Тело ответа:
Хорошо

Закончен сброс ответа
Другие вопросы по тегам