Mercurial > mercurial > hgweb_golang.cgi
comparison src/getexr/checkusd.go @ 25:2afa7e0ff1f2
add checkusd.go
| author | pyon@macmini |
|---|---|
| date | Wed, 08 Aug 2018 04:59:50 +0900 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 24:f904a5f5b3cf | 25:2afa7e0ff1f2 |
|---|---|
| 1 package main | |
| 2 | |
| 3 import ( | |
| 4 "fmt" | |
| 5 "flag" | |
| 6 "log" | |
| 7 "net/http" | |
| 8 "os" | |
| 9 "strconv" | |
| 10 "time" | |
| 11 | |
| 12 "golang.org/x/net/html" | |
| 13 ) | |
| 14 | |
| 15 func main() { | |
| 16 | |
| 17 var thro, thru float64 | |
| 18 var help bool | |
| 19 | |
| 20 flag.Float64Var( &thro, "o", 999.9, "over" ) | |
| 21 flag.Float64Var( &thru, "u", 0.0, "under" ) | |
| 22 flag.BoolVar( &help, "h", false, "print help" ) | |
| 23 flag.Parse() | |
| 24 | |
| 25 if help { | |
| 26 PrintHelp() | |
| 27 os.Exit( 0 ) | |
| 28 } | |
| 29 if thro < thru { | |
| 30 fmt.Println( "bad rate." ) | |
| 31 os.Exit( 0 ) | |
| 32 } | |
| 33 | |
| 34 url := "http://finance.yahoo.co.jp/" | |
| 35 fmt.Printf( "> get rate from '%s' ...\n", url ) | |
| 36 usd, err := GetUSD( time.Now(), url ) | |
| 37 if err != nil { | |
| 38 log.Fatal( err ) | |
| 39 } | |
| 40 if ( thro == 999.9 && thru == 0.0 ) || | |
| 41 ( thro < usd && thru == 0.0 ) || | |
| 42 ( thru > usd && thro == 999.9 ) || | |
| 43 ( thru > usd && thro < usd ) { | |
| 44 os.Exit( 0 ) | |
| 45 } | |
| 46 | |
| 47 c := time.Tick( 30 * time.Second ) | |
| 48 for now := range c { | |
| 49 usd, _ := GetUSD( now, url ) | |
| 50 if thro < usd || thru > usd { | |
| 51 os.Exit( 0 ) | |
| 52 } | |
| 53 } | |
| 54 } | |
| 55 | |
| 56 func GetUSD( now time.Time, url string ) ( float64, error ) { | |
| 57 | |
| 58 resp, err := http.Get( url ) | |
| 59 if err != nil { | |
| 60 return 0, err | |
| 61 } | |
| 62 | |
| 63 z := html.NewTokenizer( resp.Body ) | |
| 64 usd, _ := ParseHtml( z ) | |
| 65 defer resp.Body.Close() | |
| 66 fmt.Println( fmt.Sprintf( "%s [ %.3f ]", now.Format( "15:04:05" ), usd ) ) | |
| 67 | |
| 68 return usd, nil | |
| 69 } | |
| 70 | |
| 71 func ParseHtml( z *html.Tokenizer ) ( float64, error ) { | |
| 72 for { | |
| 73 tt := z.Next() | |
| 74 switch tt { | |
| 75 case html.ErrorToken: | |
| 76 return 0.0, nil | |
| 77 | |
| 78 case html.StartTagToken: | |
| 79 tag, _ := z.TagName() | |
| 80 key, val, _ := z.TagAttr() | |
| 81 if string( tag ) == "strong" && string( key ) == "class" && string( val ) == "bkLine" { | |
| 82 z.Next() | |
| 83 //fmt.Printf( "%s %s %s\n", key, val, z.Token() ) | |
| 84 return strconv.ParseFloat( z.Token().String(), 32 ) | |
| 85 } | |
| 86 } | |
| 87 } | |
| 88 } | |
| 89 | |
| 90 func PrintHelp() { | |
| 91 fmt.Fprint( os.Stderr, "Usage:\n" ) | |
| 92 fmt.Fprint( os.Stderr, "> checkusd # print rate.\n" ) | |
| 93 fmt.Fprint( os.Stderr, "> checkusd -o 112.987 # continue printing rate and stop when rate over.\n" ) | |
| 94 fmt.Fprint( os.Stderr, "> checkusd -u 112.987 # continue printing rate and stop when rate under.\n" ) | |
| 95 fmt.Fprint( os.Stderr, "> checkusd -o 112.987 -u 112.789 # both.\n" ) | |
| 96 fmt.Fprint( os.Stderr, "> checkusd -h # print this help\n" ) | |
| 97 } | |
| 98 |
