// Copyright (c) 2013 by Michael Dvorkin. All Rights Reserved. //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= package mop import ( "bytes" "io/ioutil" "net/http" "regexp" "strings" ) type Market struct { Dow map[string]string Nasdaq map[string]string Sp500 map[string]string Advances map[string]string Declines map[string]string Unchanged map[string]string Highs map[string]string Lows map[string]string } const yahoo_market_url = `http://finance.yahoo.com/marketupdate/overview` func GetMarket() Market { response, err := http.Get(yahoo_market_url) if err != nil { panic(err) } // Fetch response and get its body. defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { panic(err) } return extract(trim(body)) } func trim(body []byte) []byte { start := bytes.Index(body, []byte("` const some = `<.+?` const space = `\s*` const color = `#([08c]{6});">\s*` const price = `([\d\.,]+)` const percent = `\(([\d\.,%]+)\)` regex := []string{ "(Dow)", any, price, some, color, price, some, percent, any, "(Nasdaq)", any, price, some, color, price, some, percent, any, "(S&P 500)", any, price, some, color, price, some, percent, any, "(Advances)", any, price, space, percent, any, price, space, percent, any, "(Declines)", any, price, space, percent, any, price, space, percent, any, "(Unchanged)", any, price, space, percent, any, price, space, percent, any, "(New Hi's)", any, price, any, price, any, "(New Lo's)", any, price, any, price, any, } re := regexp.MustCompile(strings.Join(regex, "")) matches := re.FindAllStringSubmatch(string(snippet), -1) // if len(matches) > 0 { // fmt.Printf("%d matches\n", len(matches[0])) // for i, str := range matches[0][1:] { // fmt.Printf("%d) [%s]\n", i, str) // } // } else { // println("No matches") // } m := Market{ Dow: make(map[string]string), Nasdaq: make(map[string]string), Sp500: make(map[string]string), Advances: make(map[string]string), Declines: make(map[string]string), Unchanged: make(map[string]string), Highs: make(map[string]string), Lows: make(map[string]string), } m.Dow[`name`] = matches[0][1] m.Dow[`latest`] = matches[0][2] m.Dow[`change`] = matches[0][4] switch matches[0][3] { case "008800": m.Dow[`change`] = "+" + matches[0][4] m.Dow[`percent`] = "+" + matches[0][5] case "cc0000": m.Dow[`change`] = "-" + matches[0][4] m.Dow[`percent`] = "-" + matches[0][5] default: m.Dow[`change`] = matches[0][4] m.Dow[`percent`] = matches[0][5] } m.Nasdaq[`name`] = matches[0][6] m.Nasdaq[`latest`] = matches[0][7] switch matches[0][8] { case "008800": m.Nasdaq[`change`] = "+" + matches[0][9] m.Nasdaq[`percent`] = "+" + matches[0][10] case "cc0000": m.Nasdaq[`change`] = "-" + matches[0][9] m.Nasdaq[`percent`] = "-" + matches[0][10] default: m.Nasdaq[`change`] = matches[0][9] m.Nasdaq[`percent`] = matches[0][10] } m.Sp500[`name`] = matches[0][11] m.Sp500[`latest`] = matches[0][12] switch matches[0][13] { case "008800": m.Sp500[`change`] = "+" + matches[0][14] m.Sp500[`percent`] = "+" + matches[0][15] case "cc0000": m.Sp500[`change`] = "-" + matches[0][14] m.Sp500[`percent`] = "-" + matches[0][15] default: m.Sp500[`change`] = matches[0][14] m.Sp500[`percent`] = matches[0][15] } m.Advances[`name`] = matches[0][16] m.Advances[`nyse`] = matches[0][17] m.Advances[`nysep`] = matches[0][18] m.Advances[`nasdaq`] = matches[0][19] m.Advances[`nasdaqp`] = matches[0][20] m.Declines[`name`] = matches[0][21] m.Declines[`nyse`] = matches[0][22] m.Declines[`nysep`] = matches[0][23] m.Declines[`nasdaq`] = matches[0][24] m.Declines[`nasdaqp`] = matches[0][25] m.Unchanged[`name`] = matches[0][26] m.Unchanged[`nyse`] = matches[0][27] m.Unchanged[`nysep`] = matches[0][28] m.Unchanged[`nasdaq`] = matches[0][29] m.Unchanged[`nasdaqp`] = matches[0][30] m.Highs[`name`] = matches[0][31] m.Highs[`nyse`] = matches[0][32] m.Highs[`nasdaq`] = matches[0][33] m.Lows[`name`] = matches[0][34] m.Lows[`nyse`] = matches[0][35] m.Lows[`nasdaq`] = matches[0][36] return m }