3 votes

Méthode Delphi HTTP POST - problème de cookies

J'essaie de me connecter à un site web mais ce site répond toujours par

"Vous ne semblez pas accepter les cookies. Les cookies sont nécessaires pour se connecter."

pourquoi mon programme n'autorise pas les cookies ?

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;

il s'agit d'un compte gratuit pour tester le site web.

csz0021

Yese0071


Gracias

4voto

Cosmin Prund Points 21063

Cela ne fonctionne pas en une seule étape comme vous le faites, il faut le faire en deux étapes. Demandez d'abord la page de connexion (GET), puis envoyez vos identifiants de connexion (POST). Assurez-vous que vous utilisez le même CookieManager pour les deux opérations.


Modifier pour aider l'expéditeur anonyme à comprendre pourquoi cette réponse est en fait évidente. Le PO obtient ce message d'erreur :

"Vous ne semblez pas accepter les cookies. Les cookies sont nécessaires pour se connecter."

donc le serveur s'attend à voir des cookies de la part du client. Comme le PO ne fait qu'UNE seule requête POST, son CookieManager ne contient aucun cookie, il n'en envoie donc aucun. Néanmoins, le serveur s'attend à voir des cookies. D'où viendraient ces cookies dans une session normale basée sur un navigateur ? Eh bien, il est très, très difficile de remplir le formulaire de connexion sans naviguer d'abord vers le formulaire (la requête GET).

1voto

Darkerstar Points 688

Je vous suggère d'installer un outil de surveillance des requêtes HTTP et de comparer votre requête avec celles d'un navigateur standard.

HTTP Analyzer est un bon début.

1voto

Remy Lebeau Points 130112

Assurez-vous que vous utilisez une version à jour d'Indy 10. La prise en charge des cookies d'Indy 10 a longtemps été défaillante, mais a finalement été corrigée il y a quelques mois. Même si vous avez activé les cookies, il est possible qu'Indy rejette les cookies reçus ou ne les renvoie pas au serveur.

En passant, utilisez l'option Request.CustomHeaders au lieu de la propriété Request.RawHeaders et ne codez pas l'URL des données TStringList que vous passez à Post(). Post codera les données en interne pour vous (si la propriété hoForceEncodeParams est activé dans l'onglet TIdHTTP.HTTPOptions ce qu'elle est par défaut).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X