サイトが HTTP 基本認証を使用せず、HTML フォームを使用してユーザーを認証し、サイト開発者にアクセスできない場合、何が起こっているかを把握する最善の方法は、ブラウザーの動作を確認することです。
Firebug または Google Chrome 開発者ツール、または HTTP デバッグ プロキシを起動します。
ブラウザーでサイトを開き、ログインして、ブラウザーがそれを行うために行った要求と、サイトの応答を確認します。プログラムで同じ要求を模倣する必要があります。
ほとんどの場合、Web サイトでは、認証を維持するために、後続のリクエストでセッション情報を送信する必要があることに注意してください。Cookie(または複数)および/またはGETパラメーターの場合があります。繰り返しますが、ブラウザが何をしているかを見て、模倣してください。
形式については、Web で例を検索してください。いくつかあります。
更新: OK、これが例です。
例で使用されている 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")
期待される出力:
ステータス: OK
HTTP コード: 200
応答ヘッダー:
日付: 2012 年 6 月 23 日 (土) 07:49:13 GMT
コンテンツタイプ: テキスト/html; 文字セット=utf-8
接続 : 閉じる
コンテンツの長さ: 3
応答本文:
わかった
ダンピング完了応答