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 |