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


