Mercurial > mercurial > hgweb_golang.cgi
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 |