leitura de página da internet via Harbour

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

Moderador: Moderadores

Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

leitura de página da internet via Harbour

Mensagem por Daniel »

Ola
este e com o YAHOO

Código: Selecionar todos

Try
      oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
   Catch
   	MsgInfo('Erro na Criação do Serviço')
      Return .f.
   End
   Try
      oServer:Open( "GET", 'https://finance.yahoo.com/quote/PETR3.SA/', .f. )
      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
      oServer:SetRequestHeader( "Connection", "keep-alive" )
      oServer:Send()
      oServer:WaitForResponse( 100000 )
   Catch
   	MsgInfo('Erro na Conexão com o Site')
      Return .f.
   End
   cHtml:= oServer:ResponseBody
 //  MemoWrit('siteA.txt', cHtml)
   nIni  := At('" window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
   cHtml1:= SubStr( cHtml, nIni)

   nIni  := At('D(ib)" data-reactid="35">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
   nFim  := At('</span>', cHtml) - 1
   msginfo(SubStr(cHtml1, nIni, nFim))

   nIni  := At('" data-reactid="36">',  cHtml) + 20
   cHtml1:= SubStr( cHtml, nIni)
   nFim  := At('</span>', cHtml1) - 1
   msginfo(SubStr(cHtml, nIni, nFim))
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Daniel,

Em primeiro lugar, obrigado pela ajuda.

Entendi teu código, mas ainda não consegui fazer funcionar aqui.

Em primeiro lugar, está dando erro na compilação por causa do TRY e do msginfo. Talvez falte alguma lib aqui, ou a versão do Harbour que eu estou usando (3.2) seja diferente da tua. Pode me ajudar com isto?

De qualquer forma, coloquei num .txt a leitura completa da página. É bastante código. Consegui achar informações bem próximas à cotação, como "Market open", e "-0,85 (-4,53%)", mas não achei ainda a cotação em si. Me ajude, por favor.
Inacio de Carvalho Neto
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

leitura de página da internet via Harbour

Mensagem por Daniel »

Código: Selecionar todos

  
#xcommand TRY              => BEGIN SEQUENCE WITH {|o| break(o)}
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
Function main()

   setMode(25,80)
   Cls
   @ 12, 40 Say 'Aguarde'
   Try
	      oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
   Catch
	      alert('Erro na Criação do Serviço')
	      Return .f.
   End
   Try
      oServer:Open( "GET", 'https://finance.yahoo.com/quote/PETR3.SA/', .f. )
      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
      oServer:SetRequestHeader( "Connection", "keep-alive" )
      oServer:Send()
      oServer:WaitForResponse( 100000 )
   Catch
      alert('Erro na Conexão com o Site')
      Return .f.
   End
   cHtml:= oServer:ResponseBody
   @ 12, 40 Say '                ' 
 //  MemoWrit('siteA.txt', cHtml)
	nIni  := At('" window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
   cHtml1:= SubStr( cHtml, nIni)

	nIni  := At('D(ib)" data-reactid="35">',  cHtml1) + 25
   cHtml:= SubStr( cHtml1, nIni)
	nFim  := At('</span>', cHtml) - 1
	cValor:= SubStr(cHtml1, nIni, nFim)
	
	nIni  := At('" data-reactid="36">',  cHtml) + 20
   cHtml1:= SubStr( cHtml, nIni)
	nFim  := At('</span>', cHtml1) - 1
	cIndice:= SubStr(cHtml, nIni, nFim)
   
   alert('Petroleo Brasileiro S.A. - Petrobras (PETR3.SA): ' + cValor + '  ' + 'Indece do dia: ' + cIndice )
   Return Nil
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Maravilha, muito obrigado.

Funcionou com PETR3, e alguns outros códigos da bolsa, mas não com todos.

Fiz assim, veja se tem algo errado, por favor:

Código: Selecionar todos

function lercotacoes(cod)
         local link :="https://finance.yahoo.com/quote/"+cod+".SA/"
   
   
	   Cls
	   @ 5,5 Say 'Lercotacoes: lendo a cotação de '+cod+'; aguarde...'
*	   Try
	         oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
*	   Catch
*	         alert('Erro na Criação do Serviço')
*	         Return .f.
*	   End
*	   Try
	      oServer:Open( "GET", link, .f. )
	      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
	      oServer:SetRequestHeader( "Connection", "keep-alive" )
	      oServer:Send()
	      oServer:WaitForResponse( 100000 )
*	   Catch
*	      alert('Erro na Conexão com o Site')
*	      Return .f.
*	   End
	   cHtml:= oServer:ResponseBody
	   @ 12, 40 Say '                '
	 //  MemoWrit('siteA.txt', cHtml)
	   nIni  := At('" window.rapidInstance = new window.YAHOO.i13n.Rapid(rapidConfig);',  cHtml)
	   cHtml1:= SubStr( cHtml, nIni)
	 
	   nIni  := At('D(ib)" data-reactid="35">',  cHtml1) + 25
	   cHtml:= SubStr( cHtml1, nIni)
	   nFim  := At('</span>', cHtml) - 1
	   cValor:= SubStr(cHtml1, nIni, nFim)
	    
	   nIni  := At('" data-reactid="36">',  cHtml) + 20
	   cHtml1:= SubStr( cHtml, nIni)
	   nFim  := At('</span>', cHtml1) - 1
	   cIndice:= SubStr(cHtml, nIni, nFim)
	   
	   ?cod
	   ?cValor
	   ?link
	   inkey(5)
	   if empty(cValor)
	      ?"cValor vazio"
		  tone(261.7,33)
		  inkey(11)
		  return .f.
	   endif
	   exqado("insert into acoes (codigo,empresa,dtcotacao,hrcotacao,cotacao,compvenda,quemcad,conta,vinculo) values('"+cod+"','     ','"+dtsql(date())+"','"+time()+"',"+cValor+",0,'automático','  ',0)",nProvAcoes)
	   inkey(.2)
return .t.

As linhas do TRY estão comentadas porque ainda não funcionou, não sei porque, mas ainda está dando erro na compilação.

Consegue me explicar porque não está funcionando com todos os códigos?
Inacio de Carvalho Neto
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

leitura de página da internet via Harbour

Mensagem por Jairo Maia »

Inácio, para funcionar o TRY, coloque acima dessa função (ou no início do .PRG), a seguinte diretiva:

Código: Selecionar todos

#include "hbcompat.ch"
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Agora funcionou o TRY. Muito obrigado.

Aproveitando, poderia me ensinar a melhorar esse recurso?

Notei que ele usa o begin sequence / recover, que eu já uso, mas desta forma:

Código: Selecionar todos

             bError := ErrorBlock( {|e| Break(e) } )
             begin sequence
                      ...  (aqui vai o trecho do meu programa que pode eventualmente dar erro)
             recover using e
                   RDDSETDEFAULT("DBFNTX")
	               cMessage := ErrorMessage(e)
                       logerro()
                       mandmail1("error.log","Erro na função... contornado com o recover do begin sequence")
             endsequence
             ErrorBlock( bError )
Creio que esse TRY vai simplificar isso, mas preciso colocar o mandmail com o log do erro. Como posso fazer isso?
Inacio de Carvalho Neto
Avatar do usuário
André Corrêa
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 03 Nov 2015 07:46
Localização: Caraguatatuba/SP

leitura de página da internet via Harbour

Mensagem por André Corrêa »

Olá cjp,

Com o TRY, CATCH, END, ficaria assim:

Código: Selecionar todos

TRY
    ...  (aqui vai o trecho do seu programa que pode eventualmente dar erro)
CATCH oError
    RDDSETDEFAULT("DBFNTX")
    cMessage := oError:description
    logerro()
    mandmail1("error.log","Erro na função... contornado com o TRY CATCH")
END
O funcionamento é o mesmo do BEGIN SEQUENCE/RECOVER.
Na verdade, pelo que eu entendi, o Harbour não tem o TRY/CATCH, ele usa a hbcompat.ch para "traduzir" as funções,
conforme trecho retirado do código fonte dela:

Código: Selecionar todos

/* TRY / CATCH / FINALLY / END */
#xcommand TRY => BEGIN SEQUENCE WITH __BreakBlock()
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS
Abraço,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Entendido, obrigado.
Inacio de Carvalho Neto
wanesperes
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 24 Jul 2018 23:54
Localização: rio branco - acre

leitura de página da internet via Harbour

Mensagem por wanesperes »

Boa noite, estou com a mesma necessidade. Pegar informações de uma pagina. Mas precisamente o retorno de uma pesquisa de DANFE, porem nao consegui fazer o conteudo da pagina ser salva conforme este exemplo.

///---
oHttp := TIPClientHTTP():new( cUrlWS )
if oHttp:Open()
cRetorno := oHttp:readAll()
Hb_MemoWrit( "buffer.txt", cRetorno )
oHttp:Close()
endif
///--- GEROU ESTE ERRO

│Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
│Error: Unresolved external 'WSAIoctl' referenced from
│C:\MINIGUI\HARBOUR\LIB\HBRTL.LIB|hbsocket
│Error: Unresolved external 'GetAdaptersInfo' referenced from
│C:\MINIGUI\HARBOUR\LIB\HBRTL.LIB|hbsocket
///---

Estou usando Harbour MiniGUI Extended Edition 18.06 (Release)

Fico grato por qualquer ajuda.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

leitura de página da internet via Harbour

Mensagem por Mário Isa »

Boa noite !
Em qual LIB está a função win_OleCreateObject ?

Não consigo abrir sites que tenham https e dá erro de Unsuportted protocol.
Isso é porque esses sites com esse "s" tem uma proteção SSL.
E a função que tenho não abre esses tipos.

Estou tentando utilizar novas funções.

Mário
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

leitura de página da internet via Harbour

Mensagem por alxsts »

Olá!

Leia os posts do tópico Harbour+ADO+SQL Server 2008 + Automação OLE - Como fazer?. Creio que vá ajudar.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Caros colegas, em especial o Daniel,

O código postado acima pelo Daniel estava funcionando perfeitamente até ontem.

Hoje, estranhamente, parou de funcionar, está fornecendo sempre um valor vazio.

Imagino que possa ter sido alterado alguma coisa na página de origem, mas não consegui identificar.

Veja como está retornando o cHtml:
Inacio de Carvalho Neto
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

leitura de página da internet via Harbour

Mensagem por Daniel »

mudar esta linhas

Código: Selecionar todos

    nIni  := At('D(ib)" data-reactid="34">',  cHtml1) + 25
	   cHtml:= SubStr( cHtml1, nIni)
	   nFim  := At('</span>', cHtml) - 1
	   cValor:= SubStr(cHtml1, nIni, nFim)
	    
	   nIni  := At('" data-reactid="35">',  cHtml) + 20
	   cHtml1:= SubStr( cHtml, nIni)
	   nFim  := At('</span>', cHtml1) - 1
	   cIndice:= SubStr(cHtml, nIni, nFim)
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Deu certo; muito obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

leitura de página da internet via Harbour

Mensagem por cjp »

Caro Daniel, e demais colegas.

Hoje de novo este código parou de funcionar.

Creio que deve ter mudado alguma coisa na página de origem.

Consegue me ajudar novamente?
Inacio de Carvalho Neto
Responder