美文网首页程序员
go开发 - 科技改变生活之自动获取汇率

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

作者: darkengine | 来源:发表于2018-04-18 11:22 被阅读28次

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 := `
        <html>
        <body>
        <h3>
        "尽快卖出"
        </h3>
        </body>
        </html>
        `
    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云服务器,等着好消息去了。

四,改进

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

相关文章

  • go开发 - 科技改变生活之自动获取汇率

    x行账号中机缘巧合得到了一笔美金,但是需要结汇转成人仔才能花,手机银行登录一看这汇率惨不忍睹啊还是忍忍。为了多几十...

  • 科技的变化

    随着全球的科技发展,我们的生活越来丰富。地铁、高铁、飞机、电话、手机、自动电梯等。这些科技的发展改变了我们的生活。...

  • GO 从入门开始放弃

    GO现在比较流行的游戏等服务器开发语言。 配置beego 插件: 下载安装go 环境因为go环境安装时,自动生成的...

  • 记一次go尝试经历

    初学go,确实go在网络开发方面提供的很多便捷 自动化的编译工具,一个go build搞定一切 丰富的标准库,几乎...

  • 通过项目学习Go语言之gatekeeper请求流程

    在前面的《通过项目学习Go语言之...》系列文章中,我们对Go语言开发环境的配置以及开发项目最基础的功能之go m...

  • 机器

    科技带来的进步不止一点,科技改变我们的生活方式,科技带给我们力量。 从头到尾全是机械化的设备,自动化形成的产品,人...

  • 汇率接口

    1、获取全部iSO标准货币的 参照汇率(包含当前汇率情况):http://finance.yahoo.com/we...

  • docker+jenkins+golang持续集成持续交付(CI

    最近因公司发展需要,增加了一些go语言开发,对项目要求使用jenkins+go+docker自动部署上线。6.12...

  • 科技:改变生活!

    一直以来,不认识朋友或新的场合,就会有人问起我的职业,我常常说自己是一名持续创业者,也是一名斜杠小姐姐,今天想记入...

  • 如何正确的开始用 Go 编程

    本文会演示简单的Go软件包的开发过程,并介绍了go命令行工具,这是我们获取,构建和安装Go软件包和命令的标准方法。...

网友评论

    本文标题:go开发 - 科技改变生活之自动获取汇率

    本文链接:https://www.haomeiwen.com/subject/eacvkftx.html