how to login to website using HTTP Client in Delph

2019-07-27 11:06发布

问题:

i am trying to implement the HTTP Client in my project, i cant login to my account,i get Forbidden!, with IdHTTP its working well, whats is missing or wrong in my code ?

NetHTTPClient1 properties:

Connectiontimeout = 30000  
AllowCookies = True  
HandleRedirects = True  
UserAgent = Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36

NetHTTPRequest1 Properties :

Method String = POST  

URL = https://www.instagram.com/accounts/web_create_ajax/attempt/

Code:

procedure TForm2.Button1Click(Sender: TObject);
var
  Params : TStrings;
  lHTTP: TIdHTTP;
  IdSSL : TIdSSLIOHandlerSocketOpenSSL;
  N: Integer;
  Token,email,S: string;
  Reply: TStringList;
  Cookie: TIdCookie;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
    IdSSL.SSLOptions.Method := sslvTLSv1;
    IdSSL.SSLOptions.Mode := sslmClient;
    lHTTP.IOHandler := IdSSL;
    lHTTP.ReadTimeout := 30000;
    lHTTP.HandleRedirects := True;
    lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
    lHTTP.Get('https://www.instagram.com', TStream(nil));
    Cookie := lHTTP.CookieManager.CookieCollection.Cookie['csrftoken', 'www.instagram.com'];
    if Cookie <> nil then
      Token := Cookie.Value;
  finally

  end;

  try
    Params := TStringList.Create;
    Params.Add('username=' +'myusername');
    Params.Add('password=' + 'mypassword');
    NetHTTPClient1.CustomHeaders['X-CSRFToken'] := Token;
    NetHTTPClient1.CustomHeaders['X-Instagram-AJAX'] := '1';
    NetHTTPClient1.CustomHeaders['X-Requested-With'] := 'XMLHttpRequest';
    NetHTTPClient1.CustomHeaders['Referer'] := 'https://www.instagram.com/';
    Memo1.Lines.Add(NetHTTPRequest1.Post('https://www.instagram.com/accounts/login/ajax/', Params).StatusText);
  finally

  end;
///login with IdHTTP///Wroks//
  try
  lHTTP.Request.CustomHeaders.Values['X-CSRFToken'] := Token;
  lHTTP.Request.CustomHeaders.Values['X-Instagram-AJAX'] := '1';
  lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest';
  lHTTP.Request.Referer := 'https://www.instagram.com/';
  lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
  Reply := lHTTP.Post('https://www.instagram.com/accounts/login/ajax/', Params);
  Memo1.Lines.Add(Reply);
end;

回答1:

TNetHTTPClient is buggy with handleRedirect and post. https://quality.embarcadero.com/browse/RSP-14671

after when you login, you receive the cookie (the key in some way) and you must use theses cookies in all futur connexion.



回答2:

"TNetHTTPClient is buggy with handleRedirect and post. "

This is already fix in version: 10.2 Tokyo Release 2