Página 1 de 2

Baixar um arquivo da Internet

Enviado: 22 Dez 2022 08:31
por Hasse
Bom dia colegas.
Preciso baixar um arquivo de um determinado endereço da internet, e estou com dificuldades.

O endereço:
"https://treinamento.olostech.com.br/ips ... ac=4772509"'

O resultado é um pequeno arquivo XML que deve ser gravado no HD.

Alguém pode me indicar o caminho ?
Agradeço de antemão.

Baixar um arquivo da Internet

Enviado: 23 Dez 2022 10:52
por jbsantos
c_URL := "https://treinamento.olostech.com.br/ips ... ac=4772509"
oHttp := TIpClientHttp():new( c_URL )
oHttp:nConnTimeout := 20000

if ! oHttp:open()
? "Erro de conexao: "+oHttp:lastErrorMessage()
quit
endif
cResultado := oHttp:readAll()

Baixar um arquivo da Internet

Enviado: 23 Dez 2022 15:42
por Hasse
Boa tarde JBSantos

Obrigado pelo teu retorno, mas a tua rotina gerou o erro abaixo:

Error BASE/1081 Operation not supported:
TIPCLIENTHTTP:new() Arguments: ( [ 1] = Type: O Val: {
TIPCLIENTHTTP Object } [ 2] = Type: C Val: https)

Quit

No manual ainda segue uma recomendação como à seguir:
=================================
A url de conexão com o webservice no ambiente de homologação é: https://treinamento.olostech.com.br/ips ... 2.ipso.asp

Conforme descrito no manual a partir da página 11, o comando sugerido para fazer essa conexão é:
curl -k --data "user=xxx&pwd=xxx&service=1&numpac=xxx" https://treinamento.olostech.com.br/ips ... .ipso.asp;

Informando nas variáveis "user" e "pwd" as credenciais que enviei no e-mail anterior (usuário: labjaraguá / senha:123456);

A variável "service", nesse caso será 1, pois estamos fazendo uma consulta. E por fim, temos a variável "numpac" onde será informado o número da autorização;

Se a conexão for bem sucedida, o sistema irá lhe retornar o xml para ser importado:
================================

Na citada página 11 temos somente as outras opções de serviços disponíveis. Para baixar o XML o serviço é 1.

Baixar um arquivo da Internet

Enviado: 23 Dez 2022 21:27
por alxsts
Olá!

A lib hbTip não suporta o protocolo https. Tente usar cUrl.

Baixar um arquivo da Internet

Enviado: 24 Dez 2022 00:53
por Vlademiro
Veja se esse exemplo ajuda

Código: Selecionar todos

 
*****************************/
FUNCTION __DownloadHTTP( cRemoteFile , lOverwrite , cNewName )

    
   LOCAL hCurl 
   LOCAL cContent, cFileName
   LOCAL lDownload
   local aHeaders 
   #ifdef __PLATFORM__WINDOWS
   LOCAL cTempDir := ""//GetEnv("TEMP") 
   #else
   LOCAL cTempDir := ""//IIF( hb_DirExists( "/tmp/" ) , "/tmp/" , "./"  ) 
   #endif

   IF cNewName == NIL
      cFileName := HB_FNameName( cRemoteFile ) + HB_FNameExt( cRemoteFile )
   Else
      cFileName := cNewName    
   ENDIF   
   IF FILE( cFileName ) // Se o arquivo já existe
       IF lOverwrite // Se é para sobrepor sempre
           lDownload := .t. 
       ELSE
           lDownload := .f.
       ENDIF
    ELSE // Se não existe é para baixar
        lDownload := .t.
    ENDIF    
    IF lDownload               
        curl_global_init()
      
        if ! empty( hCurl := curl_easy_init() )
            aHeaders := { "Cache-Control: no-cache"            }
            curl_easy_setopt( hCurl, HB_CURLOPT_HTTPHEADER, aHeaders)
          curl_easy_setopt( hCurl, HB_CURLOPT_URL, cRemoteFile )  
          
          //Disabling the SSL peer verification (you can use it if you have no SSL certificate yet, but still want to test HTTPS)
          curl_easy_setopt(hCurl, HB_CURLOPT_FOLLOWLOCATION, 1)
          curl_easy_setopt(hCurl, HB_CURLOPT_SSL_VERIFYPEER, 0)
          curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
          
          //Sending the request and getting the response
          IF (curl_easy_perform( hCurl )) == 0
              cContent := curl_easy_dl_buff_get( hCurl )
              cFileName := hb_PathJoin( cTempDir, cFileName )
              
              LOG _t( "Downloading to %s", cFileName  ) INFO DISPLAY
              IF .NOT. hb_MemoWrit( cFileName , cContent )
                  LOG _t( "Error when writing %s",  cFileName  ) INFO DISPLAY
                   
              ENDIF
          ELSE 
              LOG _t( "Download failed."  ) ERROR DISPLAY
              IF FILE( cFileName  )
                 ?? " Using local version."
              ENDIF        
          ENDIF
        ENDIF
    ENDIF
        
RETURN cFileName 
Da uma olhada no código, ele não cai funcionar de cara porque tem umas funções minha. Eu tô no celular, fiz só copiar e colar do meu repositório. Pra editar fica difícil e podia errar.

Não esqueça de colocar

#require "hbcurl"

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 11:45
por Hasse
Bom dia.
Testei exaustivamente este último exemplo:

1)-Se uso: #require "hbcurl"
Resposta de erro ao compilar: TST_OLOS_2.PRG(4) Error F0032 Invalid name follows #

2)-Se uso: #include "hbcurl.ch"
Resposta de erro ao compilar: TST_OLOS_2.PRG(6) Error F0029 Can't open #include file: 'hbcurl.ch'

3)-Se uso: #include "C:\xHarbour\contrib\hbcurl\hbcurl.c"
Resposta de erro ao compilar: C:\xHarbour\contrib\hbcurl\hbcurl.c(51) Error F0029 Can't open #include file: 'windows.h'
OBS: procurei este arquivo "windows.h" e não encontrei para testar com o path incluso.

4)-Se uso: #include "C:\xHarbour\contrib\hbcurl\hbcurl.ch"
Resposta de erro ao compilar:
C:\BCC55\BIN\ilink32 @makefile.lnk
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_HB_FNAMENAME' referenced from F:\DEV\PROLAZ1
\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_HB_FNAMEEXT' referenced from F:\DEV\PROLAZ1\
OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_GLOBAL_INIT' referenced from F:\DEV\PRO
LAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_INIT' referenced from F:\DEV\PROLA
Z1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_SETOPT' referenced from F:\DEV\PRO
LAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_PERFORM' referenced from F:\DEV\PR
OLAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_DL_BUFF_GET' referenced from F:\DE
V\PROLAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_HB_PATHJOIN' referenced from F:\DEV\PROLAZ1\
OBJ\TST_OLOS_2.OBJ

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 14:20
por ANDRIL
Se não me engano, na geração do harbour deve inclui-la para que possa ser usado nos programas gerados com ele.

Tente assim:

Código: Selecionar todos

//--url de consulta
cURL="https://treinamento.olostech.com.br/ipso/controle_v1.2.ipso.asp?user=labjaragua&pwd=123456&service=1&numpac=4772509"

//--caso precise enviar algo no body
cJSON=""

//--define o metodo HTTP use conforme a API ou url solicita, geralmente, será GET
cMetodo="GET"

//--cria o servidor HTTP local
oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP.5.0" )	 
oServer:Open( cMetodo, cURL, .F. )

//--caso precise setar header
*oServer:SetRequestHeader( "Accept","application/json")
*oServer:SetRequestHeader( "Content-Type","application/json")

//--envia url ao servidor
oServer:Send( cJSON )

//--retorno da url
cRetorno := oServer:ResponseBody()  

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 15:05
por Vander
Olá;
Já tentou usar um programinha chamado "wget" que funciona em linha de comando.
Testei com Windows 10 Pro de 64 bits e o resultado foi este :

Código: Selecionar todos

<?xml version='1.0' encoding='ISO-8859-1'?><ipso><status><codigo type='varchar(10)'>E102</codigo><servico type='integer'>1</servico><numpac type='bigint'>4772509</numpac><versao type='varchar(7)'>1.2</versao></status></ipso>
Código

Código: Selecionar todos

//
LOCAL cCommand := 'wget -O arquivo_de_saida.XML   --no-check-certificate "https://treinamento.olostech.com.br/ipso/controle_v1.2.ipso.asp?user=labjaragua&pwd=123456&service=1&numpac=4772509"'

RUN (cCommand)
//

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 15:27
por Vander
No navegador Edge

Imagem

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 16:50
por Hasse
Caro Vander.

Sim, no navegador carrega normalmente, porém preciso que o arquivo seja salvo no HD automaticamente, pois são uns 20 a 30 arquivos diários.
Estes arquivos devem ser gravados no HD, lidos, tratados e gravados no sistema local.

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 16:57
por Vander
O "wget" baixa o arquivo e pode ser salvo em qualquer pasta e o nome do arquivo de origem e destino podem ser uma Variável.

LOCAL cCommand := 'wget -O arquivo_de_saida.XML --no-check-certificate "https://treinamento.olostech.com.br/ips ... ac=4772509"'

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 17:20
por Hasse
OK.
Beleza.
Funcionou perfeito com o wget.

Obrigado a TODOS que me auxiliaram direta ou inderetamente.

Baixar um arquivo da Internet

Enviado: 26 Dez 2022 19:55
por Vlademiro
Uso a solução que postei sem problemas com o Harbour 3.2 compilado com suporte a cUrl. Uso o mingw para compilar. No Linux uso gcc. Faz tempo que abandonei o xharbour e o bcc. Talvez não tenha suporte a cUrl. Nesse caso é melhor usar o wget.

Baixar um arquivo da Internet

Enviado: 27 Dez 2022 09:15
por sygecom
Vlademiro escreveu:Uso a solução que postei sem problemas com o Harbour 3.2 compilado com suporte a cUrl. Uso o mingw para compilar. No Linux uso gcc. Faz tempo que abandonei o xharbour e o bcc. Talvez não tenha suporte a cUrl. Nesse caso é melhor usar o wget.
Só para deixar registrado, funciona com xHarbour+BCC, estamos usando aqui.

Baixar um arquivo da Internet

Enviado: 28 Jan 2023 20:36
por dbsh
Se for no window, tenta este, não precisa incluir nenhuma biblioteca.

Código: Selecionar todos

FUNCTION Download_WinHttpRequest( sUrl, lErro )
LOCAL oOle, sTexto

lErro := .F.

BEGIN SEQUENCE WITH Break()
   sTexto := "ERRO: CreateObject(WinHttp.WinHttpRequest.5.1)"
   IF ( oOle := win_oleCreateObject( "WinHttp.WinHttpRequest.5.1" ) ) != NIL
      sTexto := 'ERRO: Open(GET) [' + sUrl + ']'
      oOle:Open( "GET", sUrl, .F. )
      sTexto := 'ERRO: Send() [' + sUrl + ']'
      oOle:Send()
      //sTexto := "ERRO: readyState"
      //WHILE oOle:readyState <> 4
      //    oOle:waitForResponse( 1000 )
      //ENDDO
      sTexto := 'ERRO: Status [' + sUrl + ']'
      IF oOle:Status() == 200
         sTexto := oOle:responseBody
      ELSE
         sTexto := 'ERRO: WinHttp.WinHttpRequest.5.1 STATUS: ' + NTrim(oOle:Status()) + ' [' + sUrl + ']'
         lErro := .T.
      ENDIF
   ELSE
      sTexto := 'ERRO: CreateObject(WinHttp.WinHttpRequest.5.1) [' + win_oleErrorText() + '] [' + sUrl + ']'
      lErro := .T.
   ENDIF
RECOVER
   IF Empty(sTexto) .or. Left(sTexto, 5) <> 'ERRO:'
      //sTexto := 'ERRO: ao baixar; [' + sUrl + ']'
      sTexto := ''
   ENDIF
   lErro := .T.
END SEQUENCE

RETURN sTexto
set retornar string vazia, deu erro no download
ou passe lErro por referencia