Exemplo HttpClient - Yahoo Tickers

Visão Geral

Neste artigo vemos como acessar o serviõ de tickers do Yahoo para capturar informações como cotação de moedas, bolsa, etc..

O Yahoo oferece um site web - Yahoo Finance - que permite consultas a diversos tipos de índices de bolsa de valores, cotações de moedas, etc... Por exemplo a cotação do ouro pode ser acessada, via página web, através deste link :

Uma necessidade de sistema seria poder obter as informações oferecidas pelo Yahoo Finance para serem utilizadas em uma aplicação em particular.

Para isso o Yahoo oferece uma url que pode ser acessada via http e retorna como saída um texto com as informações do ticker requisitado no formato CSV.

Por exemplo, para a URL de acesso :

http://download.finance.yahoo.com/d/quotes.csv?s=BRLUSD%3DX+SN11.CBT+SF11.CBT+CN11.CBT&f=snl1d1t1ohgdr 

O retorno do Yahoo é uma estrutura de dados deste tipo :

"BRLUSD=X","BRL to USD",0.6385,"8/2/2011","11:56am",N/A,N/A,N/A,N/A,N/A

"SN11.CBT","Soybean Futures,J",1396.00,"7/14/2011","12:21pm",1390.25,1396.75,1352.50,0.00,N/A

"SF11.CBT","SF11.CBT",0.00,"N/A","N/A",N/A,N/A,N/A,N/A,N/A

"CN11.CBT","Corn Futures,Jul-",718.00,"7/14/2011","1:00pm",724.00,742.00,711.50,0.00,N/A

Assim para que possamos recuperar a informação de uma cotação do Yahoo devemos formatar corretamente a URL de acesso e depois realizar a extração dos dados da estrutura de dados CSV retornada pelo Yahoo.

A estrutura da URL de acesso permite diversos parâmetros. Neste link é possível encontrar uma explicação sobre a URL de acesso do Yahoo :

Exemplo de Uso em GeneXus

Basicamente o que devemos fazer em GeneXus é utilizar o HTTPClient Data Type e, após recuperar o seu retorno (neste exemplo seria a estrutura de dados no formato CSV) processar esta informação utilizando as funções/recursos para manipular texto.

Abaixo vemos um código em GeneXus para realizar este trabalho onde o resultado final estará armazenado em uma variável string do tipo collection denominada &campoCol. 

Um XPZ está disponível ao final da página e para realizar um teste basta apenas compilar e executar esta Procedure. Se trata de uma Procedure Main - Command Line e que apresentará o resultado da consulta diretamente na janela OutPut do GeneXus X.

//exemplo de url para acessar desde o browser

//http://download.finance.yahoo.com/d/quotes.csv?s=BRLUSD%3DX+SN11.CBT+SF11.CBT+CN11.CBT&f=snl1d1t1ohgdr 

//acessa página inicial

&httpClient.Host = "download.finance.yahoo.com"

&httpClient.Port = 80

&httpClient.Secure = False

&urlString = "/d/quotes.csv?s="

//tickers para real para dolar, real para euro, e euro para dolar

&urlString += "BRLUSD%3DX+BRLEUR=X+EURUSD=X"

//parâmetros adicionas da consulta

&urlString += "&f=snl1d1t1ohgdr"

&httpClient.Execute("GET",&urlString)

&httpClient.Timeout = 5000

if &httpClient.ErrCode <> 0

    msg(Format("Erro : %1 - %2", &httpClient.ErrCode.ToString(), &httpClient.ErrDescription), nowait)

else

    msg(Format("+++ Yahoo Tickers ! - %1", ServerNow()), nowait)

    msg(Format("http://%1%2",&httpClient.Host, &urlString),nowait)

    &linhaCol = &httpClient.ToString().SplitRegEx(NewLine())

    

    For &linha in &linhaCol

        //exemplo de string de retorno

        //"SN11.CBT","Soybeans Jul 11",1370.50,"1/11/2011","2:36pm",1393.00,1400.00,1368.75,0.00,N/A

        

        //elimina a vírgula dentro de uma string delimitada por ""

        &linhaVirgula = &linha

        &linha.SetEmpty()

        &isString = False

        For &i = 1 to &linhaVirgula.Length()

            &char = &linhaVirgula.Substring(&i ,1)

            &isString = iif( &char= '"', not &isString, &isString)

            &char = iif( &isString and &char= ',', ' ', &char)

            &linha += &char

        EndFor                

        &linha = &linha.Replace('"','')

        &campoCol = &linha.SplitRegEx(",")

        //não processa linhas onde a data ou a hora estão com o valor N/A

        if &campoCol.Item(4).IndexOf("N/A") = 0 and  &campoCol.Item(5).IndexOf("N/A") = 0

            Msg("  ------------------------------",nowait)

            Msg(Format("  Simbolo = %1", &campoCol.Item(1)),nowait)

            Msg(Format("  Descricao = %1", &campoCol.Item(2)),nowait)

            Msg(Format("  Valor = %1", &campoCol.Item(3)),nowait)

            Msg(Format("  Data = %1", &campoCol.Item(4)),nowait)

            Msg(Format("  Hora = %1", &campoCol.Item(5)),nowait)

            Msg(Format("  ValorAbertura = %1", &campoCol.Item(6)),nowait)

            Msg(Format("  ValorMaximo = %1", &campoCol.Item(7)),nowait)

            Msg(Format("  ValorMinimo = %1", &campoCol.Item(8)),nowait)

            Msg("  ------------------------------",nowait)

        endif

    EndFor

    commit

endif