html 程序 自动取 汇率,go开发 - 科技改变生活之自动获取汇率

x行账号中机缘巧合得到了一笔美金,但是需要结汇转成人仔才能花,手机银行登录一看这汇率惨不忍睹啊还是忍忍。为了多几十块钱整天刷汇率性价比太高,遂决定让机器帮忙脏活。方案很简单,定时拉取汇率,超过设定的阈值之后发邮件通知自己。任务拆分一下:

一,定时拉取汇率

1, API获取

这是最理想的方式,但是天下没有免费的午餐,很多聚合API的供应商提供的免费API有次数限制而且需要实名认证。所以本着省钱为主这个方式放弃了。

2,爬虫

网上搜索之后发现x行有自己的汇率公布页面而且会定时(经观察大概是10分钟)更新汇率,只不过获取下来的是html文件。需要用goquery自己解析出需要的数据,先上一段get拉取页面和解析的代码:

func HttpGet(){

response,err := http.Get(my_url)

if err!= nil { //如果访问不成功,url不存在则会进入改判断

log.Println(err)

return

}

if response.StatusCode != 200 {

log.Fatalf("status code error: %d %s", response.StatusCode, response.Status)

return

}

defer response.Body.Close() //请求完了关闭回复主体

doc, err := goquery.NewDocumentFromReader(response.Body)

if err != nil {

log.Fatal(err)

}

// goquery的用法和jquery很相似

var seg []string

doc.Find("tr:nth-child(5) td").Each(func(i int, s *goquery.Selection) {

// For each item found, get the band and title

text := s.Find("font").Text()

fmt.Printf("Review %d: %s\n", i, text)

seg = append(seg, text)

if i == 5{

parseAndSend(text)

}

})

/*

Review 0: 美元 USD

Review 1: 100

Review 2: 人民币 CNY

Review 3: 629.97

Review 4: 629.97

Review 5: 627.27

Review 6: 622.12

*/

// parse feed back

}

goquery和jQuery的用法一致,大佬的话估计看一眼抓下来的html文本就知道选择器怎么写。作为前端渣渣有个技巧,先用curl把html存到本地,注入jQuery之后用chrome打开,之后就可以在chrome的控制台里边随便试jQuery选择器了。

二,发送邮件

这个没啥好说的了,网上搜的代码根据自己的需求改了内容:

func notifyMe(rateStr string){

user := "bill-gays@163.com"

password := "longlivejobs"

host := "smtp.163.com:25"

to := "bill-gays@163.com"

subject := fmt.Sprintf("美元 USD 现汇买入价 %s", rateStr)

body := `

"尽快卖出"

`

fmt.Println("send email")

err := SendToMail(user, password, host, to, subject, body, "html")

if err != nil {

fmt.Println("Send mail error!")

fmt.Println(err)

} else {

fmt.Println("Send mail success!")

}

}

func SendToMail(user, password, host, to, subject, body, mailtype string) error {

hp := strings.Split(host, ":")

auth := smtp.PlainAuth("", user, password, hp[0])

var content_type string

if mailtype == "html" {

content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"

} else {

content_type = "Content-Type: text/plain" + "; charset=UTF-8"

}

msg := []byte("To: " + to + "\r\nFrom: " + user + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)

send_to := strings.Split(to, ";")

err := smtp.SendMail(host, auth, user, send_to, msg)

return err

}

三,定时任务

这个功能的实现方式很灵活,go自己有timer,不过最简单的还是cron大法:

0,30 * * * * /root/fetch >> /root/rate.txt

半个小时一次,足够“高频”了。最后交叉编译成linux的执行文件,放到阿x云服务器,等着好消息去了。

四,改进

能找到免费发送短信的途径来通知就更好了,毕竟对邮件通知还是不够敏感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值