view src/getexr/checkusd.go @ 56:7396e7407abd

searcher version up.
author pyon@macmini
date Sat, 27 Jun 2020 16:25:13 +0900
parents 2afa7e0ff1f2
children
line wrap: on
line source

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