Mercurial > mercurial > hgweb_golang.cgi
diff src/getexr/checkusd.go @ 25:2afa7e0ff1f2
add checkusd.go
author | pyon@macmini |
---|---|
date | Wed, 08 Aug 2018 04:59:50 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/getexr/checkusd.go Wed Aug 08 04:59:50 2018 +0900 @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "flag" + "log" + "net/http" + "os" + "strconv" + "time" + + "golang.org/x/net/html" +) + +func main() { + + var thro, thru float64 + var help bool + + flag.Float64Var( &thro, "o", 999.9, "over" ) + flag.Float64Var( &thru, "u", 0.0, "under" ) + flag.BoolVar( &help, "h", false, "print help" ) + flag.Parse() + + if help { + PrintHelp() + os.Exit( 0 ) + } + if thro < thru { + fmt.Println( "bad rate." ) + os.Exit( 0 ) + } + + url := "http://finance.yahoo.co.jp/" + fmt.Printf( "> get rate from '%s' ...\n", url ) + usd, err := GetUSD( time.Now(), url ) + if err != nil { + log.Fatal( err ) + } + if ( thro == 999.9 && thru == 0.0 ) || + ( thro < usd && thru == 0.0 ) || + ( thru > usd && thro == 999.9 ) || + ( thru > usd && thro < usd ) { + os.Exit( 0 ) + } + + c := time.Tick( 30 * time.Second ) + for now := range c { + usd, _ := GetUSD( now, url ) + if thro < usd || thru > usd { + os.Exit( 0 ) + } + } +} + +func GetUSD( now time.Time, url string ) ( float64, error ) { + + resp, err := http.Get( url ) + if err != nil { + return 0, err + } + + z := html.NewTokenizer( resp.Body ) + usd, _ := ParseHtml( z ) + defer resp.Body.Close() + fmt.Println( fmt.Sprintf( "%s [ %.3f ]", now.Format( "15:04:05" ), usd ) ) + + return usd, nil +} + +func ParseHtml( z *html.Tokenizer ) ( float64, error ) { + for { + tt := z.Next() + switch tt { + case html.ErrorToken: + return 0.0, nil + + case html.StartTagToken: + tag, _ := z.TagName() + key, val, _ := z.TagAttr() + if string( tag ) == "strong" && string( key ) == "class" && string( val ) == "bkLine" { + z.Next() + //fmt.Printf( "%s %s %s\n", key, val, z.Token() ) + return strconv.ParseFloat( z.Token().String(), 32 ) + } + } + } +} + +func PrintHelp() { + fmt.Fprint( os.Stderr, "Usage:\n" ) + fmt.Fprint( os.Stderr, "> checkusd # print rate.\n" ) + fmt.Fprint( os.Stderr, "> checkusd -o 112.987 # continue printing rate and stop when rate over.\n" ) + fmt.Fprint( os.Stderr, "> checkusd -u 112.987 # continue printing rate and stop when rate under.\n" ) + fmt.Fprint( os.Stderr, "> checkusd -o 112.987 -u 112.789 # both.\n" ) + fmt.Fprint( os.Stderr, "> checkusd -h # print this help\n" ) +} +