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