... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$145,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Capturando Data e Hora da Internet

Podemos acessar o Internet Explorer, via código e assim capturar ou passar dados para uma página web de nosso interesse.  

Capturar dados pode ser uma tarefa simples ou complicada, isso depende de como a página web foi construída.   Por exemplo, se o programador usar o atributo ID para identificar, de forma exclusiva, os controles de um formulário na página, ficará muito fácil capturar as informações, utilizando o comando getElementById

Observe na linha HTML abaixo, o uso do atributo ID no campo que fornece a Data e a Hora, da nossa página dataweb.asp.

<form method="get" name="frmRegistro">
<p><input type="text" id="ds" name="dataweb" value="<%=Cdbl(now())%>" size="18"></p>
</form>

Preste bem atenção nos comentários do código utilizado para capturar a data/hora da página dataweb.asp e veja como a tarefa se torna simples com a presença do atributo ID.

Public Function fncCapturaDataHora() As Date
Dim objIE As Object
'------------------------------------------------------------------
'Verifica se o site está ativo com a função fncSiteAtivo()
'Caso o site não esteja ativo, informa valor falso de data
'------------------------------------------------------------------
If Not fncSiteAtivo("www.usandoaccess.com.br") Then
    fncCapturadataHora = #1/1/1800#
    Exit Function
End If
'-----------------------------------------------
'Abre o Internet Explorer
'-----------------------------------------------   
Set objIE = CreateObject("InternetExplorer.Application")
'--------------------------------------
'Esconde o navegador Internet Explorer
'--------------------------------------
objIE.Visible = False
'--------------------------------------------------
'Carrega a página dataweb.asp do site UsandoAccess
'---------------------------------------------------
objIE.Navigate "http://www.usandoaccess.com.br/comum/dataweb.asp"
'------------------------------------------------
'Aguarda até o completo carregamento da página
'------------------------------------------------
Do While objIE.Busy: DoEvents: Loop
Do While objIE.ReadyState <> 4: DoEvents: Loop
'--------------------------------------------------------------------
'Captura o valor do campo que possui o identificador exclusivo ID=ds
'--------------------------------------------------------------------
fncCapturaDataHora = objIE.Document.getElementById("ds").Value
'-----------------------------
'Encerra o Internet Explorer
'-----------------------------
objIE.Quit
Set objIE = Nothing

End Function

Como saber se os campos de um formulário da página utilizam o ID ?

Como exemplo, clique aqui para abrir a página dataweb.asp

Clique sobre a página, com o botão da direita do mouse. 

Selecione a opção "Ver código-fonte" - Observe a seta, na imagem abaixo:

Usando Access - Código fonte página HTML

 

Veja na imagem abaixo, o Identificador Exclusivo ID, do campo que fornece a data e a hora.

Usando Access - Identidicador exclusivo do campo (ID)

 

O que fazer quando não houver o Identificador Exclusivo ID?

Clique aqui para abrir a página do Observatório Nacional, na qual podemos extrair a data e a hora. 

Usando Access - página Observatório Nacional

Ao investigar o código HTML da página, observamos que a data e a hora estão em uma tabela e sem o atributo ID, na tag <TD>

Usando Access - Campos sem o ID

Para este caso, vamos tratar o código HTML da página como um simples texto e utilizarmos algumas das funções de manipulação de string do Access para extrair o valor desejado.

Antes de aplicar a técnica diretamente na página HTML, vamos treinar o uso das funções envolvidas em um caso simples. 

Como exemplo, observe os seguintes textos:

"Avelino Sampaio completa 40 anos no dia 7 de dezembro"

"João Henrique completa 102 anos no dia 5 de fevereiro"

"O sobrinho Luiz Claudio completa 5 anos no dia 25 de março"

Como extrair as idades dos textos acima?  O primeiro passo é identificar uma palavra ou uma frase referencial, que esteja presente em todos os textos e que esteja o mais próximo possível do valor que desejamos extrair.   A palavra "completa" e a palavra "Anos" são as nossas opções de referência mais próximas.  Vamos optar pela palavra "Completa". 

Usaremos a função InStr(), que retorna à posição da palavra, dentro do texto.

Instr("Avelino Sampaio completa 40 anos no dia 7 de dezembro","completa") ::> Retorna à posição 17

Instr("João Henrique completa 102 anos no dia 5 de fevereiro","completa") :::> Retorna à posição 15
			
Instr("O sobrinho Luiz Claudio completa 5 anos no dia 25 de março","completa") :::> Retorna à posição 25

Observe que somando a posição da palavra "completa", dentro do texto + 8 caracteres correspondentes ao comprimento da palavra "completa" + 1 caracter de espaço,  obtemos a posição exata, aonde começa o valor da idade. 

PosiçãoIdade = InStr("Texto","completa") + 9

PosiçãoIdade será utilizada para indicar na função Mid() o início da posição no texto, do valor a ser resgatado.

O comprimento da idade, como podemos observar nos textos acima, pode variar de 1 a 3 caracteres.  Vamos resgatar pelo comprimento máximo 3

Idade = Mid("texto",PosiçãoIdade, 3)

Para os três textos exemplos, temos como resultado:

Idade = 40<espaço>
Idade = 102
Idade = 5<espaço>a

Dependendo da idade, podemos ter no resultado o caracter "<espaço>" ou os caracteres "<espaço>a".  Usaremos a função Replace() para suprimir a letra "a" e a função Val() para suprimir o <espaço>.

Idade = Val(Replace(idade, "a",""))

Pondo em prática o treinamento

Volte a observar o código HTML da página do Observatório Nacional, na imagem acima.  Veja que a nossa frase referencial mais próxima do resultado é "Hora Oficial de Brasília".  Somando a posição desta frase referencial com mais 82 caracteres, teremos a posição exata no texto, dos valores Data e Hora.

intPos = InStr(PaginaHtml, "Hora Oficial de Brasília") + 82

O comprimento máximo da Data/Hora é de 19 caracteres (dd/mm/yyyy hh:mm:ss).  Já que temos a posição inicial (intPos) da data/hora a ser extraída, usaremos na função mid():

datahora = mid(PaginaHtml, intPos, 19)

Observei que o resultado não é fixo em 19 caracteres, podendo ser com 17 caracteres (1/1/2014 13:05:10) ou com 18 caracteres (5/10/2013 15:00:56).  Isso implica em caracteres indesejados no resultado, conforme lista exemplo abaixo:

mid(PaginaHtml, intPos, 19)  ::::> 1/1/2014 13:05:10</
mid(PaginaHtml, intPos, 19)  ::::> 5/10/2013 15:00:56<
mid(PaginaHtml, intPos, 19)  ::::> 15/10/2013 08:17:00

Usaremos a função Replace() para extrair o caracter "<" ou os caracteres "</", ficando o resultado final desta forma:

datahora = Replace(Replace(Mid(PaginaHtml, intPos, 19),"</",""), "<","")

Agora preste bem atenção nos comentários da função completa, usada para extrair a Data e a Hora da página do Observatório Nacional:

Function fncCapturaDataHora() As Date
Dim objIE As Object
Dim intPos As Integer
Dim PaginaHtml As String
'-----------------------------------------------
'Abre o Internet Explorer
'-----------------------------------------------
Set objIE = CreateObject("InternetExplorer.Application")
'--------------------------------------
'Esconde o navegador Internet Explorer
'--------------------------------------
objIE.visible = false
'--------------------------------------------------
'Carrega a página do Observatório Nacional
'---------------------------------------------------
objIE.Navigate "http://pcdsh01.on.br/HoraLegalBrasileira.asp"
'------------------------------------------------
'Aguarda até o completo carregamento da página
'------------------------------------------------
Do While objIE.Busy: DoEvents: Loop
Do While objIE.ReadyState <> 4: DoEvents: Loop
'------------------------------------------------------
'Passa todo o código HTML para a variável PaginaHtml
'------------------------------------------------------
PaginaHtml = objIE.Document.All(0).InnerHTML
'---------------------------------------------------------------------------------
'Posição da frase "Hora Oficial de Brasília" no texto HTML + 82 caracteres
'nos fornece a posição exata da data/hora
'---------------------------------------------------------------------------------
intPos = InStr(PaginaHtml, "Hora Oficial de Brasília") + 82
'----------------------------------------------------------------------------
'Captura o valor Date/Hora e retira com a função Replace(), os caracteres 
'indesejados do resultado
'----------------------------------------------------------------------------
fncCapturaDataHora = Replace(Replace(Mid(PaginaHtml, intPos, 19),"</",""), "<","")
'-----------------------------
'Encerra o Internet Explorer
'-----------------------------
objIE.Quit
Set objIE = Nothing
End Function

O risco

É muito arriscado utilizar este tipo de busca pelo código HTML, pois qualquer modificação que o programador fizer na página, entre o texto de referência (Hora Oficial de Brasília) e o valor da Data/Hora, acarretará erro na função.   Então, o mais garantido é escolher páginas que se utilizam do ID.

Outras Técnicas

Existem outras técnicas de busca pelo código HTML e que serão apresentadas em outros artigos do site.  Caso queira se aprofundar, estude pelo oráculo Google, os seguintes comandos:

innerText, outerText, innerHTML, outerHTML, Document.all

getElementsByTagName("table"), tbl.Rows, row.Cells

Função Auxiliar para verificar conexão com a internet.

Segue abaixo a função WMI, que realiza um PING na página e identifica se a conexão está ativa entre o micro e a página.

Public Function fncSiteAtivo(ByVal NomeSite As String) As Boolean
Dim colPingResults As Object
Dim oPingResult As Variant
Dim strQuery As String
strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & NomeSite & "'"
Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery(strQuery)
For Each oPingResult In colPingResults
    If Not IsObject(oPingResult) Then
        fncSiteAtivo = False
    ElseIf oPingResult.StatusCode = 0 Then
        fncSiteAtivo = True
    Else
        fncSiteAtivo = False
    End If
Next
Set colPingResults = Nothing
End Function

Caso a conexão não esteja ativa, a idéia é abortar a abertura do Internet Explorer, nas funções propostas.  Observe esta função fncSiteAtivo() no primeiro código, apresentado no artigo. 

Arquivo exemplo.

O formulário do arquivo exemplo possui dois botões para resgatar a Data e a Hora dos sites  UsandoAccess e Observatório Nacional.

Desafio

Tente extrair o data e hora do site http://horariodebrasilia.org

Bom estudo!


 

 


17 comentário(s)

Isaias Carvalho - BA   30/05/2013 11:52:35

Avelino,

Parabéns!! Um excelente artigo, perfeito para perfeição da questão segurança em nossos sistemas.

Parabéns!!

Alessandro Batistuti   04/06/2013 08:52:12

Excelente Avelino, com esse exemplo abre-se um leque para várias coisas, obrigado por compartilhar conosco seus conhecimentos.

Wellington Rodrigues - MG   04/06/2013 13:19:40

Muito bom esse artigo. Mais uma vez um excelente conteúdo para podemos aproveitar!!! Muito obrigado por compartilhar um pouco do seu conhecimento com todos nós... Valeu!!!

Diamantino   08/06/2013 19:36:26

Muito bom mesmo, meus parabéns, continue compartilhando conosco é sempre um prazer.
Abraços.
Obrigado por lembrar de mim.

Tiago   10/06/2013 11:16:19

Parabéns Avelino, muito bom e muito bem explanado!

Acredito que posso usar esse método no seu exemplo do sistema shareware ao ao invés do ActiveX Web Browser, certo?

Contudo, a título de feedback, a função fncSiteAtivo() está retornando false apesar de eu conseguir acessar a página, então comentei as linhas dela forçando a abertura do IE sempre. Como será gerado um erro se não conseguir acessar a página e o erro já é tratado está funcionando muito bem aqui. Estou no trabalho atrás de firewall e proxy.

Obrigado por compartilhar seu conhecimento.

Avelino Sampaio   11/06/2013 06:39:27

Tiago,

usando a janela do CMD vc consegue dar um PING em uma página ?

c:\user\Tiago> ping www.usandoaccess.com.br

No aguardo

Tiago   11/06/2013 15:25:24

Pelo cmd também não consigo, dá "esgotado o tempo limite do pedido", para qualquer site.
Mas pelo browser acesso normalmente.

abs.

Renato Silva   01/07/2013 18:46:14

Em alguns sites os sistemas de segurança não aceitam PING.

Avelino Smpaio   02/07/2013 05:02:30

Renato,

a ideia de pingar para um site é de verificar se a conexão com a internet está estabelecida com a máquina. Basta então pingar para a página do Goggle.

Sucesso!

Marcio Melo - RJ   10/07/2013 16:03:13

Gostei muito desse artigo, tava precisando pegar algumas informações de home page de informação de clima tempo para montar numa rádio online no software Zararadio tem uma opção de falar as horas, temperatura e umidade só precisava ter em um arquivo txt formatado com essas informações.
Avelino muitas de suas dicas podemos usar em outras frentes, montar um aplicativo e no agendador de tarefa executa-lo de tempo em tempo para obter um determinado documento formatado com informações de alguma página na internet.

Show, mais alguns mistérios desvendados...

Forte abraço!

WELSON ZEFERINO   29/08/2013 09:52:51

Avelino, primeiramente parabéns pelo seu trabalho. Excelente!

Não poderei realizar o desafio no site http://horariodebrasilia.org, pois no div id=relogio tem um comentário que avisa "!--<<< AVISO: NÃO USE ESTA HORA EM APLICATIVOS -->

kkkkkkkkkk

Aristóteles Luciano   27/10/2013 14:30:16

Prezado Avelino,

Primeiramente, obrigado por mais essa luz.
Não obtive sucesso em nenhuma das formas. Em todas elas, recebo o erro "O objeto não aceita esta propriedade ou método" ao tentar passar o código para a variável PaginaHtml.
É necessário adicionar alguma biblioteca?
Uso o Access 2010.
Grato!

Avelino Sampaio   29/10/2013 06:33:23

Aristóteles,

qual é versão do seu Windows ? 7 ou 8 ? 32 ou 64 bits ?

Seu Access 2010 e de 64 ou 32 bits ?

No aguardo

Aristóteles Luciano   29/10/2013 08:14:19

Avelino,

Windows 7 Professional, 32 Bits.
Access 2010, 32 bits.

Grato.

Bruno La Terza   23/09/2014 19:05:29

Avelino, gostaria de parabeniza-lo pelo site. Realmente é um impulso enorme aos usuários iniciantes ou não.

Bom ... como me encaixo na categoria de iniciantes, venho aqui também tentar esclarecer algumas dúvidas.

Utilizo o Windows 8.1, com EI 11 nativo (versão 11.0.9600) obs. sem possibilidade de instalar o IE10.
Access 2010 32bits

Pelo que andei pesquisando o readystate . document.complete.... document.all. ..... e alguns outros no IE11 foram desabilitados....

Estou procurando algum modo de verificar o carregamento completo de uma página web, e também a verificação do carregamento após um evento click no ie11...

Agradeço qualquer ajuda
Até mais

Ronilson Silva   28/01/2016 11:02:07

Avelino bom dia e agradeço a dica que esta resolvendo um dos muitos problemas que tinha, no entanto no inicio do tópico você diz que também é possível inserir um dado em uma pagina Web.
Ja procurei em vários tutorias e tópicos mais sem êxito, pode nos mostrar como isso é possível.

Obrigado pela sua grande ajuda aos amantes do Access.

[]´s Ronilson


Avelino Sampaio   29/01/2016 19:23:26

Ronilson,

veja no tutorial: Vídeo - Sistema Shareware com liberação online

Bom estudo!


Envie seu comentário: