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" )
+}
+