comparison src/getexr/getexr.go @ 12:aea69f84ed33

add getexr ( Get Foreign-Exchange )
author pyon@macmini
date Sun, 12 Nov 2017 20:10:26 +0900
parents
children 4fb189ae0a46
comparison
equal deleted inserted replaced
11:c3a589f0521d 12:aea69f84ed33
1 package main
2
3 import (
4 "fmt"
5 "flag"
6 "io/ioutil"
7 "log"
8 "math"
9 "net/http"
10 "net/smtp"
11 "os"
12 "strconv"
13 "strings"
14 "time"
15
16 "golang.org/x/net/html"
17 )
18
19 var ver = "0.1"
20
21 func main() {
22
23 version := flag.Bool( "v", false, "print version" )
24 file := flag.String( "f", "usd.dat", "print version" )
25 flag.Parse()
26
27 if ( *version ) {
28 fmt.Fprintf( os.Stderr, "getexr - Get Exchange Rate [ version = %s ]\n",ver )
29 os.Exit( 0 )
30 }
31
32 // Get USD Rate
33 url := "http://finance.yahoo.co.jp/"
34 resp, err := http.Get( url )
35 if err != nil {
36 log.Fatal( err )
37 }
38
39 z := html.NewTokenizer( resp.Body )
40 usd, err := ParseHtml( z )
41 if err != nil {
42 log.Fatal( err )
43 }
44 defer resp.Body.Close()
45
46 // Compare Past Rate
47 content, err := ioutil.ReadFile( *file )
48 if err != nil {
49 log.Fatal( err )
50 }
51
52 buf1 := strings.Split( string( content ), "\n" )
53 buf2 := strings.Split( buf1[ len( buf1 ) - 2 ], "," )
54 usd0, _ := strconv.ParseFloat( buf2[1], 32 )
55
56 alart := false
57 if ( math.Abs( usd0 - usd ) > 1.0 ) {
58 alart = true
59 }
60
61 if ( alart ) {
62 t := time.Now()
63 now := t.Format( "2006-01-02 15:04:05" )
64
65 // Save Rate
66 buf := fmt.Sprintf( "%s,%.2f\n", now, usd )
67 content = append( content, buf... )
68
69 err = ioutil.WriteFile( *file, content, 0777 )
70 if err != nil {
71 log.Fatal( err )
72 }
73
74 // Post E-mail
75 err = SendMail( now, usd, "muty@willcom.com" )
76 if err != nil {
77 log.Fatal( err )
78 }
79 err = SendMail( now, usd, "pyon4pyon@yahoo.co.jp" )
80 if err != nil {
81 log.Fatal( err )
82 }
83 }
84 }
85
86 func ParseHtml( z *html.Tokenizer ) ( float64, error ) {
87 for {
88 tt := z.Next()
89 switch tt {
90 case html.ErrorToken:
91 return 0.0, nil
92
93 case html.StartTagToken:
94 tag, _ := z.TagName()
95 key, val, _ := z.TagAttr()
96 if string( tag ) == "strong" && string( key ) == "class" && string( val ) == "bkLine" {
97 z.Next()
98 //fmt.Printf( "%s %s %s\n", key, val, z.Token() )
99 return strconv.ParseFloat( z.Token().String(), 32 )
100 }
101 }
102 }
103 }
104
105 func SendMail( now string, usd float64, addr string ) error {
106 hostname := "sdm.sakura.ne.jp"
107 auth := smtp.PlainAuth( "", "bad_user@sdm.sakura.ne.jp", "hogehoge3", hostname )
108 to := []string{ addr }
109 msg := []byte( "To: " + addr + "\r\n" +
110 "Subject: Exchange-Mail\r\n" +
111 "\r\n" +
112 now + fmt.Sprintf( "\r\nrate changed\r\n[ USD/JPY : %.2f ].", usd ) + "\r\n" ) // mail body
113 err := smtp.SendMail( hostname + ":587", auth, "bad_user@sdm.sakura.ne.jp", to, msg )
114 if err != nil {
115 return err
116 }
117 return nil
118 }
119