Baixar um arquivo da Internet

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Baixar um arquivo da Internet

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
jbsantos
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 20 Out 2012 08:40
Localização: Sorocaba / SP

Baixar um arquivo da Internet

Mensagem 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()
João Bosco
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Baixar um arquivo da Internet

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Baixar um arquivo da Internet

Mensagem por alxsts »

Olá!

A lib hbTip não suporta o protocolo https. Tente usar cUrl.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Baixar um arquivo da Internet

Mensagem 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"
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Baixar um arquivo da Internet

Mensagem 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
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Baixar um arquivo da Internet

Mensagem 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()  
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Baixar um arquivo da Internet

Mensagem 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)
//
HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Baixar um arquivo da Internet

Mensagem por Vander »

No navegador Edge

Imagem
HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Baixar um arquivo da Internet

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
Vander
Usuário Nível 3
Usuário Nível 3
Mensagens: 214
Registrado em: 23 Jul 2004 01:43
Localização: João Monlevade - MG

Baixar um arquivo da Internet

Mensagem 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"'
HbMake v1.17
xHarbour build 0.99.70 Intl. (SimpLex)
Borland C++ 5.5.1
fivewin 6.12 (FREE)
Workshop 4.5
MEdit
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Baixar um arquivo da Internet

Mensagem por Hasse »

OK.
Beleza.
Funcionou perfeito com o wget.

Obrigado a TODOS que me auxiliaram direta ou inderetamente.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Baixar um arquivo da Internet

Mensagem 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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Baixar um arquivo da Internet

Mensagem 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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Baixar um arquivo da Internet

Mensagem 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
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Responder