Página 1 de 2

Função para Previsão do Tempo - acessando API do Google

Enviado: 10 Nov 2010 07:00
por Stanis Luksys
Fala Rapazeada,

Estava lendo na internet sobre os vários tipos de recursos on-line que podemos implementar em sistemas, seja através de XML, RSS, JSON ou outros formatos disponíveis em web services mundo afora, e comecei a pesquisar algumas ferramentas do Harbour para interagir com este mundo de informações que é a internet.

Resolvi então fazer uma funçãozinha bem legal em Harbour para pegar a previsão do tempo de determinada cidade em tempo real, acessando a API do Google Weather.

A função utiliza recursos das bibliotecas HBTIP e XHB. Lembrando que a XHB.LIB é um amontoado de funções que só existiam no xHarbour e foram pro Harbour em forma de LIB, portanto quem compilar com o Xharbour não precisa ficar procurando essa lib pelo computador.

Enfim, a função é simples, o mais complicado é entender o retorno que é um hash "hasheado" de dados... rs

Quem quiser ver funfando pode baixar neste link o código-fonte de um exemplo de uso e o programa compilado para Windows:
http://sites.google.com/site/hblibs/exe ... otempo.rar

Obs: Executar preferencialmente pelo Prompt de Comandos.

Aí vai o código:

Código: Selecionar todos

/********* * * * * *
*
*	PrevisaoDoTempo 
*
*	Parametro: string com o 'nome da cidade, estado'
*
*	Retorno: hash com dados sobre o clima
*
*	hash["CidadeBase"]			=> Cidade localizada com este nome
*	hash["CondicaoAtual"]		=> Condição climatica atual na cidade
*	hash["TemperaturaAtual"]	=> Temperatura atual na cidade
*	hash["UmidadeAtual"]			=> Umidade atual na cidade
*	hash["VentoAtual"]			=> Vento atual na cidade (direcao e velocidade)
*	hash["aProximosDias"]		=> Array com a previsao para os proximos dias
*		   aProximosDias	= { cDiaDaSemana, cTempMax, cTempMin, cCondicao }
*
*
*/
FUNCTION PrevisaoDoTempo( cCidade )

	LOCAL oHttp, cXML, oXML
	LOCAL oCidade,	oTemperatura, oUmidade, oVento, oCondicao
	LOCAL oPrevisao, oTagAtual, oIterator
	
	LOCAL cDia, cMax, cMin, cCond, i
	LOCAL	aDias := {}
	
	LOCAL hPrevisaoDoTempo	:= HB_Hash()
	LOCAL hDiasSemana 		:= HB_Hash()
	
	hDiasSemana["dom"] := "Domingo"
	hDiasSemana["seg"] := "Segunda-feira"
	hDiasSemana["ter"] := "Terçaa-feira"
	hDiasSemana["qua"] := "Quarta-feira"
	hDiasSemana["qui"] := "Quinta-feira"
	hDiasSemana["sex"] := "Sexta-feira"
	hDiasSemana["sáb"] := "Sábado"

	cCidade := StrTran( AllTrim( cCidade ), " ", "%20" )
	
	oHttp:= TIpClientHttp():new( "http://www.google.com/ig/api?weather="+cCidade+"&hl=pt-br" ) 
   IF ! oHttp:open()
      RETURN 0
   ENDIF
	cXML := oHttp:readAll()
	oHttp:close()
			
   oXML := TXmlDocument():New( cXML )
   IF oXML:nError != HBXML_ERROR_NONE
      RETURN 0
   ENDIF
	
	oCidade 		  := oXML:findfirst( "city" )	
	oCondicao		 := oXML:findfirst( "condition" )
	oTemperatura    := oXML:findfirst( "temp_c" )
	oUmidade		  := oXML:findfirst( "humidity" ) 
	oVento		    := oXML:findfirst( "wind_condition" ) 
	
   oPrevisao := oXML:findfirst( "forecast_conditions" )
   IF oPrevisao == NIL
		RETURN hPrevisaoDoTempo
   ENDIF
   
	DO WHILE .T.
      oIterator := TXmlIterator():New( oPrevisao )
      DO WHILE .T.
         oTagAtual := oIterator:Next()
         IF oTagAtual == NIL
            aAdd( aDias, { cDia, cMin, cMax, cCond } )
            EXIT
         ELSE
            IF oTagAtual:cName == "day_of_week"
            	cDia	:= oTagAtual:aAttributes[ "data" ]
            ELSEIF oTagAtual:cName == "low"
            	cMin	:= StrZero( val( oTagAtual:aAttributes[ "data" ] ), 2 )
            ELSEIF oTagAtual:cName == "high"
            	cMax	:= StrZero( val( oTagAtual:aAttributes[ "data" ] ), 2 )
            ELSEIF oTagAtual:cName == "condition"
            	cCond	:= oTagAtual:aAttributes[ "data" ]
            ENDIF
         ENDIF
      ENDDO
      oPrevisao := oXML:findnext()
      IF oPrevisao == NIL
         EXIT
      ENDIF
	ENDDO	

	hPrevisaoDoTempo["CidadeBase"]			= oCidade:aAttributes[ "data" ]
	hPrevisaoDoTempo["CondicaoAtual"]		= oCondicao:aAttributes[ "data" ]
	hPrevisaoDoTempo["TemperaturaAtual"]	= oTemperatura:aAttributes[ "data" ]
	hPrevisaoDoTempo["UmidadeAtual"]			= oUmidade:aAttributes[ "data" ]
	hPrevisaoDoTempo["VentoAtual"]			= oVento:aAttributes[ "data" ]
	hPrevisaoDoTempo["aProximosDias"]		= {}
	FOR i:=1 to LEN( aDias )
		AAdd( hPrevisaoDoTempo["aProximosDias"], { hDiasSemana[aDias[i][1]], aDias[i][3], aDias[i][2], aDias[i][4] } )
	NEXT


RETURN hPrevisaoDoTempo

Re: Função para Previsão do Tempo - acessando API do Google

Enviado: 23 Nov 2010 10:53
por HASA
:{
Bom dia, apenas para agradecer a dica, já coloquei em uso
:)Pos

Função para Previsão do Tempo - acessando API do Google

Enviado: 15 Ago 2011 22:46
por Adalberto
Olá Stanis,

Pesquisando coisinhas esquisitas encontre esta função para a previcao do tempo, interessante demais, copie e intente compilar com xHb, com tristeza só obtive um mensagem de erro: HB_HASH e uma função que não tem o xHb, me ajuda por favor, para poder compilar.

Agradecido, desde já, e sempre.

Com atenção, Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 15 Ago 2011 23:29
por Stanis Luksys
Olá,

Se não me engano, no xharbour é somente Hash() ao invés de HB_Hash().

Acho é só esta a diferença. Tenta aí e diz para nós. MESMO QUE DÊ CERTO.

Abraços.

Função para Previsão do Tempo - acessando API do Google

Enviado: 16 Ago 2011 00:13
por Adalberto
Stanis,

Gracias, de verdad por tua resposta tão rápida, foi mesmo assim, a função e Hash, agora compila sem problemas o erro acontece na execução diz:

Error BASE/1004 Class: 'NIL' has no exported method:
NPORT Arguments: ()


Justo nesta linña:

Código: Selecionar todos

IF !oHttp:open()
Aguardo seus acertados comentários.

Muito obrigado. Com atenção, Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 16 Ago 2011 16:47
por HASA
:))
Olá Adalberto se estiver usando xHarbour acrescente no inicio do PRG

#include "hbxml.ch"

:)Pos

Função para Previsão do Tempo - acessando API do Google

Enviado: 16 Ago 2011 18:59
por Adalberto
Hasa, boa tarde

Incrementei a linha que me sugeriu , trabalho com xHb modo consola, e o erro continua na mesma linha.

Muito obrigado, se tem alguma outra dica por favor não duvide em me ajudar.

Fico aguardando.

Deus seja com você

Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 16 Ago 2011 20:34
por sygecom
Deve está faltando linkar no seu projeto a lib TIP.LIB, de uma revisada.

Função para Previsão do Tempo - acessando API do Google

Enviado: 17 Ago 2011 00:30
por Adalberto
Olá sygecom,

Agradeço sua colaboração, inseri a TIP.LIB em o Arquivo.MLk compila sem problemas, na execução continua o mesmo erro, que estará faltando.
Rogo a você e a todas as pessoas caritativas me ajude com este tema.

Muito abrigado, aguardo suas noticias.

Com atenção, Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 17 Ago 2011 09:33
por HASA
:-O
Adalberto, isirá também a hbole.lib
Hasa

Função para Previsão do Tempo - acessando API do Google

Enviado: 17 Ago 2011 13:08
por Adalberto
Olá Hasa

Na pasta (em meu Pc) C:\xHarbour\Lib não tem a HbOle, será que você pode me facilitar essa libraria?

Grato com tu ajuda, aguardo tus noticias.

Um grande abraço.

Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 18 Ago 2011 10:58
por HASA
:))
Bom dia, segue anexo,
Hasa

Função para Previsão do Tempo - acessando API do Google

Enviado: 18 Ago 2011 18:14
por Adalberto
Olá Hasa, boa tarde.

Agradecido com você, mais ainda compilando com as Lib propostas e realizando os câmbios sugeridos não consigo rodar esse exemplo tão bonito.
O erro já citado continua imutável, no mesmo lugar e com a mesma cara seria.

Quero matar essa fera, e só será possível com a ajuda de você e a ajuda de todas as pessoas que quiser ajudar.

Mais uma vez, Graças.

Com atenção Adalberto

Função para Previsão do Tempo - acessando API do Google

Enviado: 19 Ago 2011 09:15
por HASA
:-O
Ok, poste seu exemplo que vou compilar aqui
Hasa

Função para Previsão do Tempo - acessando API do Google

Enviado: 19 Ago 2011 21:07
por Adalberto
Olá Hasa,

O exemplo e o fornecido por Stanis no inicio de este tópico, só modifique as linhas seguintes:

LOCAL hPrevisaoDoTempo := HB_Hash()
LOCAL hDiasSemana := HB_Hash()

LOCAL hPrevisaoDoTempo := Hash()
LOCAL hDiasSemana := Hash()

Todo o código e o código do Stanis

Muito obrigado Hasa, aguardo com ânsias seus comentários.

Adalberto