3

私はウェブサイトにログインしようとしていますが、このサイトは常に次のように応答します

「Cookieを受け入れていないようです。ログインするにはCookieが必要です。」

私のプログラムがCookieを許可しないのはなぜですか?

function HF_Login(): boolean;
var
 HTTP : TIDHTTP;
 Cookie : TidCookieManager;
 Data, Page : TStringList;
begin
 HTTP := TIDHTTP.Create(NIL);
 Cookie := TidCookieManager.Create(NIL);

 HTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1';
 HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
 HTTP.Request.AcceptLanguage := 'en-us;q=0.7,en;q=0.3';
 HTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
 HTTP.Request.Pragma := 'no-cache';
 HTTP.Request.CacheControl := 'no-cache';
 HTTP.Request.RawHeaders.Add('X-Requested-With: XMLHttpRequest');
 HTTP.AllowCookies := True;
 HTTP.HandleRedirects := True;
 HTTP.ProtocolVersion := pv1_1;
 HTTP.Request.Connection := 'Keep-Alive';
 HTTP.CookieManager  := Cookie;

 Data := TStringList.Create;
 Page := TStringList.Create;

        //  returnto=%2F&user=[user]&pass=[pass]
 Data.Add('returnto=%2F&user=csz0021&pass=Yese0071');

 page.Text := HTTP.Post('http://hotfile.com/login.php', Data);
 //form1.RichEdit1.Text := HTTP.Post('http://hotfile.com/login.php', Data);

 If Pos('Bad username/password combination.', Page.Text) <> 0 Then Result := False
 else Result := True;

 Page.Free;
 Data.Free;
end;

これは、Webサイトをテストするための無料のアカウントです。

csz0021

はいe0071


ありがとう

4

3 に答える 3

4

あなたがやっているように、それは 1 つのステップでは機能しません。2 つのステップで行う必要があります。最初にログイン ページを要求し (GET)、次にログイン資格情報を送信します (POST)。両方の操作で同じ CookieManager を使用していることを確認してください。


匿名の反対票を投じた人が、この答えが実際に明白である理由を理解できるように編集してください。OP は次のエラー メッセージを受け取ります。

「Cookie を受け入れていないようです。ログインするには Cookie が必要です。」

そのため、サーバーはクライアントからのいくつかの Cookie を期待しています。OPは1つのPOSTリクエストのみを実行しているため、CookieManagerにはCookieが含まれていないため、Cookieを送信していません。それでもなお、サーバーはいくつかの Cookie を見ることを期待しています。これらの Cookie は、通常のブラウザベースのセッションではどこから来るのでしょうか? ログインフォームへの入力は、最初に実際にフォームに移動しないと非常に困難です (GET 要求)。

于 2011-04-20T04:40:48.467 に答える
1

Indy 10 の最新バージョンを使用していることを確認してください。Indy 10 の Cookie サポートは長い間壊れていましたが、数か月前にようやく修正されました。Cookie を有効にしている場合でも、Indy が受信した Cookie を拒否しているか、サーバーに Cookie を返していない可能性があります。

Request.CustomHeaders余談ですが、プロパティの代わりにプロパティを使用し、Request.RawHeadersPost() に渡す TStringList データを URL エンコードしないでください。Post はデータを内部的にエンコードします (プロパティでhoForceEncodeParamsフラグが有効になっている場合TIdHTTP.HTTPOptions、デフォルトでは有効です)。

于 2011-04-20T17:57:22.147 に答える
1

HTTP リクエスト監視ツールをインストールして、リクエストを標準ブラウザのものと比較することをお勧めします。

HTTP アナライザーは良い出発点です。

于 2011-04-20T06:49:39.620 に答える