Ver Mensaje Individual
  #3  
Antiguo 26-06-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
Hola

El proceso es el siguiente:
- descargar el contenido HTML de la página
- Analizar el contenido HTML en busca del patrón que contenga los ficheros que deseas
- Descargar el fichero desde la URL obtenida anteriormente.

Aquí te dejo un código de ejemplo, para que funcione inserta un componente TIdHTTP de las indy en tu formulario

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);

  function GetHTMLContent(const AURL: string): string;
  begin
    Result := '';
    if AURL <> '' then
    try
      try
        Result := IdHTTP1.Get(AURL);
      finally
        if (IdHTTP1.ResponseCode <> 200) then begin
          Result := '';
          MessageDlg(IdHTTP1.ResponseText, mtError, [mbOK], 0);
        end;
      end;
    except
      on E: Exception do
        MessageDlg(E.message, mtError, [mbOK], 0);
    end;
  end;

  function GetURLZip(const AContent: string; const Prefijo: string = '''../zips/cheques/'; const Sufijo: string = '.zip'''): string;
  var
    inicio, fin, longitud:Integer;
  begin
    Result := '';
    // localiza el inicio de la cadena de descarga
    inicio := Pos(Prefijo, AContent);
    if inicio > 0 then begin
      // localiza el fin de la cadena de descarga
      fin := Pos(Sufijo, AContent, inicio);
      if (fin > inicio) then begin
        // calcula la longitud
        longitud := (fin + Sufijo.Length) - inicio;
                //extrae la cadena
        Result := Copy(AContent, inicio, longitud);
        // la cadena esta en formato '../XXX/XXX.zip'
        // se elimina las comillas iniciales y finales y los dos puntos
        Result := result.Replace('''', '').Replace('../', '');
      end;
    end;
  end;

  function ExtractFileNameFromURL(const AURL: string): string;
   /// este proceso separa las partes de una URL y obtiene solo la ultima parte.
   /// no esta optimizado en cuanto que pudiera llevar parámetros o no ser un nombre del fichero valido.
   /// pero para este caso en concreto es suficiente
  Begin
    with TStringList.Create do
    try
      StrictDelimiter := true;
      Delimiter := '/';
      DelimitedText := AURL;
      Result := Strings[count - 1];
    finally
      Free;
    end;
  End;

  function DescargarFileURL(const AURL: string): string;
  var
    s: TStream;
    LocalFileName:string;
  begin
    Result := '';
    try
      LocalFileName := ExtractFilePath(Application.ExeName) + ExtractFileNameFromURL(AURL);
      s := TFileStream.Create(LocalFileName, fmCreate);
      try
        IdHttp1.Get(AURL, s);
        if IdHTTP1.ResponseCode = 200 then
          result := LocalFileName
        else
          MessageDlg(IdHTTP1.ResponseText, mtError, [mbOK], 0);
      finally
        s.Free;
      end;
    except
      on E: Exception do
        MessageDlg(E.message, mtWarning, [mbOK], 0);
    end;
  end;

  function DonwloadZIP (const APageBase, AURL:string):string;
  var
    HTMLContent,          //Contenido de la pagina en HTML
    URLZip: string;        // URL al fichero ZIP
    LocalFileZip: string; // Ruta local al fichero ZIP
  begin
    // Se descarga el contenido de la pagina en formato HTML
    HTMLContent := GetHTMLContent(APageBase + AURL);
    if (HTMLContent = '') then
      MessageDlg('No se ha podido realizar la descarga', mtError, [mbOK], 0)
    else begin
      // Se busca la primera URL a un fichero ZIP
      URLZip := GetURLZip(HTMLContent);
      if URLZip = '' then
        MessageDlg('No se ha podido extraer la URL del fichero ZIP', mtError, [mbOK], 0)
      else begin
        LocalFileZip := DescargarFileURL(APageBase + URLZip);
        if LocalFileZip = '' then
          MessageDlg('No se ha podido descargar el fichero ZIP desde la URL ', mtError, [mbOK], 0)
        else
          result := LocalFileZip;
      end;
    end;
  end;

var
  FileName: string;
begin
  FileName := DonwloadZIP('http://www.bcra.gob.ar/', 'cheques/actualiza.asp');
  if FileName <> '' then
    MessageDlg('Descarga completa', mtInformation, [mbOK], 0)
  else
    MessageDlg('Error en la descarga', mtError, [mbOK], 0);
end;

Añadir que como peculiaridad, para realizar las llamadas he separado la URL en dos partes, <ruta publica del servidor> y ruta al script que se va a ejecutar. Con esto se facilita el poder obtener luego la ruta al ZIP, puesto que la URL del zip contiene "../" que es un retroceso en la carpeta de la ruta con respecto a la ruta que hay en el momento.

saludos
Responder Con Cita