Показать сообщение отдельно
  #2  
Старый 31.03.2019, 13:07
VolodinAS VolodinAS вне форума
Прохожий
 
Регистрация: 16.07.2017
Сообщения: 23
Версия Delphi: Delphi XE3
Репутация: 10
По умолчанию

В дополнение ко всему, я себе как-то давно написал юнит, в котором представил 2 функции - для get и post запросов

Код:
unit _SendRequest;

interface

uses
  IdURI,

  Classes,

  IdCookieManager, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,

  System.SysUtils,

  WinInet;

function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String;
function StreamRequest(URL: String; Stream: TStream): Boolean;
function SendGetRequest(URL: String; cookie_dir: String): String;

procedure IdCookieManagerSaveFile(IdCookieManager: TIdCookieManager; dir: string);
function IdCookieManagerLoadFile(IdCookieManager: TIdCookieManager; domain, dir: string): TIdCookieManager;

implementation

uses
  Main;

function SendPostRequest(URL: String; Params: TStringList; cookie_dir: String; domain: String): String;
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  IdCookieManager: TIdCookieManager;
  urlRequest: String;
begin
  urlRequest := URL;

  try
    IdHTTP := TIdHTTP.Create;
  except
    on E: Exception do begin
      Result := 'ERRORMESSAGE: ' + E.Message
    end;
  end;

  IdHTTP.ConnectTimeout := 5000;

  try
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36';
    IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
    IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
    IdCookieManager := TIdCookieManager.Create;
    IdHTTP.CookieManager := IdCookieManager;
    IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;

    try
      Result := Trim(IdHTTP.Post(urlRequest, Params));
    except
      on E: Exception do begin
        Result := 'ERRORMESSAGE: ' + E.Message;
        IdHTTP.Free;
      end;
    end;


    //Result := urlRequest;
  finally
    IdHTTP.Free;
    IdSSLIOHandlerSocketOpenSSL.Free;
    IdCookieManager.Free;
  end;
end;



function StreamRequest(URL: String; Stream: TStream): Boolean;
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  IdCookieManager: TIdCookieManager;
  urlRequest: String;
begin
  urlRequest := URL;

  try
    IdHTTP := TIdHTTP.Create;
  except
    on E: Exception do begin
      Result := False;
    end;
  end;

  IdHTTP.ConnectTimeout := 5000;

  try
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36';
    IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7';
    IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
    IdCookieManager := TIdCookieManager.Create;
    IdHTTP.CookieManager := IdCookieManager;
    IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;

    try
      //ShowMessage(URL);
      IdHTTP.Get(urlRequest, Stream);
      Result := True;
    except
      on E: Exception do begin
        Result := False;
        IdHTTP.Free;
      end;
    end;


    //Result := urlRequest;
  finally
    IdHTTP.Free;
    IdSSLIOHandlerSocketOpenSSL.Free;
    IdCookieManager.Free;
  end;
end;

function SendGetRequest(URL: String; cookie_dir: String): String;
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  IdCookieManager: TIdCookieManager;
  urlRequest: String;
begin
  urlRequest := URL;

  try
    IdHTTP := TIdHTTP.Create;
  except
    on E: Exception do begin
      Result := 'ERRORMESSAGE: Cant init IdHTTP';
    end;
  end;

  IdHTTP.ConnectTimeout := 5000;

  try
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36';
    IdHTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
    IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    IdCookieManager := TIdCookieManager.Create;
    IdHTTP.CookieManager := IdCookieManager;
    IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;

    try
      //ShowMessage(URL);
      Result := IdHTTP.Get(urlRequest);

      IdCookieManagerSaveFile(IdCookieManager, cookie_dir);
      //Result := True;
    except
      on E: Exception do begin
        Result := 'ERRORMESSAGE: ' + E.Message;
        IdHTTP.Free;
      end;
    end;


    //Result := urlRequest;
  finally
    IdHTTP.Free;
    IdSSLIOHandlerSocketOpenSSL.Free;
    IdCookieManager.Free;
  end;
end;

end.

Типа, чтобы через 1 вызов облегчить обращение к собираемым данным. Я не знаю, правильный ли это подход или нет - нужен Ваш совет.

К тому же, как я понял, мне требуется авторизация на основе одних и тех же кук, но я так понимаю, при idhttp.free куки сбрасываются, и при новом соединении генерируются по новой (например, тот же PHPSESSID). Как правильно поступать в таких случаях?
Ответить с цитированием