Mercurial > mercurial > hgweb_golang.cgi
changeset 12:aea69f84ed33
add getexr ( Get Foreign-Exchange )
author | pyon@macmini |
---|---|
date | Sun, 12 Nov 2017 20:10:26 +0900 |
parents | c3a589f0521d |
children | 4fb189ae0a46 |
files | src/getexr/getexr.go |
diffstat | 1 files changed, 119 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/getexr/getexr.go Sun Nov 12 20:10:26 2017 +0900 @@ -0,0 +1,119 @@ +package main + +import ( + "fmt" + "flag" + "io/ioutil" + "log" + "math" + "net/http" + "net/smtp" + "os" + "strconv" + "strings" + "time" + + "golang.org/x/net/html" +) + +var ver = "0.1" + +func main() { + + version := flag.Bool( "v", false, "print version" ) + file := flag.String( "f", "usd.dat", "print version" ) + flag.Parse() + + if ( *version ) { + fmt.Fprintf( os.Stderr, "getexr - Get Exchange Rate [ version = %s ]\n",ver ) + os.Exit( 0 ) + } + + // Get USD Rate + url := "http://finance.yahoo.co.jp/" + resp, err := http.Get( url ) + if err != nil { + log.Fatal( err ) + } + + z := html.NewTokenizer( resp.Body ) + usd, err := ParseHtml( z ) + if err != nil { + log.Fatal( err ) + } + defer resp.Body.Close() + + // Compare Past Rate + content, err := ioutil.ReadFile( *file ) + if err != nil { + log.Fatal( err ) + } + + buf1 := strings.Split( string( content ), "\n" ) + buf2 := strings.Split( buf1[ len( buf1 ) - 2 ], "," ) + usd0, _ := strconv.ParseFloat( buf2[1], 32 ) + + alart := false + if ( math.Abs( usd0 - usd ) > 1.0 ) { + alart = true + } + + if ( alart ) { + t := time.Now() + now := t.Format( "2006-01-02 15:04:05" ) + + // Save Rate + buf := fmt.Sprintf( "%s,%.2f\n", now, usd ) + content = append( content, buf... ) + + err = ioutil.WriteFile( *file, content, 0777 ) + if err != nil { + log.Fatal( err ) + } + + // Post E-mail + err = SendMail( now, usd, "muty@willcom.com" ) + if err != nil { + log.Fatal( err ) + } + err = SendMail( now, usd, "pyon4pyon@yahoo.co.jp" ) + if err != nil { + log.Fatal( err ) + } + } +} + +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 SendMail( now string, usd float64, addr string ) error { + hostname := "sdm.sakura.ne.jp" + auth := smtp.PlainAuth( "", "bad_user@sdm.sakura.ne.jp", "hogehoge3", hostname ) + to := []string{ addr } + msg := []byte( "To: " + addr + "\r\n" + + "Subject: Exchange-Mail\r\n" + + "\r\n" + + now + fmt.Sprintf( "\r\nrate changed\r\n[ USD/JPY : %.2f ].", usd ) + "\r\n" ) // mail body + err := smtp.SendMail( hostname + ":587", auth, "bad_user@sdm.sakura.ne.jp", to, msg ) + if err != nil { + return err + } + return nil +} +