25
|
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
|