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