汇率提醒小工具

Posted by Faushine on September 13, 2018

事情是这样的,因为最近深陷汇率波动的风波中,亏得要叫爸爸了,所以想有个工具可以提醒我买进卖出这样,但是看了一圈都没app有这个功能的,于是我打算自己写一个脚本来做这个事情。

需求如下:

  • 定时刷新(1分钟为间隔)
  • 一旦发现买入价格、卖出价格到达某个值触发通知
  • 汇率信息发送到指定邮箱

编码

其实这个事情还是蛮简单的,首先要拿到数据,我的做法是直接访问url拿到网页源码,再用正则匹配找到数据,然后判断是否需要发邮件,最后整理消息把邮件发出来就好。Smtp服务器我用的gmail,谷歌大法好。

源码如下:

# -*- coding:utf-8 -*-
import re
import requests
import smtplib
from email.mime.text import MIMEText

url = 'http://www.boc.cn/sourcedb/whpj/index.html'
html = requests.get(url).content.decode('utf8')
from_addr = 'from_addr@gmail.com'
password = 'password'
smtp_server = 'smtp.gmail.com'
subject = '汇率提醒'
to_addr = 'to_addr@qq.com'

def getCurrency():
    a = html.index('<td>加拿大元</td>')
    s = html[a:a + 300]
    result = re.findall('<td>(.*?)</td>', s)
    return result

def sendEmail(result):
    content = result[0] + '\n' + \
          '现汇买入价:' + result[1] + '\n' + \
          '现钞买入价:' + result[2] + '\n' + \
          '现汇卖出价:' + result[3] + '\n'+ \
          '现钞卖出价:' + result[4] + '\n' + \
          '中行折算价:' + result[5] + '\n' + \
          '发布时间:' + result[6] + ' ' + result[7] + '\n'
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = subject
    try:
        smtpObj = smtplib.SMTP_SSL(smtp_server, 465)
        smtpObj.login(from_addr, password)
        smtpObj.sendmail(from_addr, to_addr, msg.as_string())
        print("mail has been send successfully.")
    except smtplib.SMTPException as e:
        print(e)

if __name__ == '__main__':
    result = getCurrency()
    if float(result[4])>5.24 || float(result[1])<5.1:
        sendEmail(result)
    else:
        print("nothing need to mention.")

部署

代码这样写已经差不多能用了,剩下就是部署,我本来的想法是放在lambda上,在cloudwatch创建定时任务去运行 lambda,后来发现python打包有点麻烦,import的库打到zip里面之后运行 lambda总是报找不到module。于是我决定转换思路,把它放到ec2上创建crontab去运行脚本。反正怎么免费怎么来,下面说下怎么在mac上访问ec2以及代码的部署。

创建ec2实例

这个部分就不赘述了,不过有两点需要稍微注意一下,一个是配置安全组,入站规则要保留TCP 22端口,这个是建立SSH连接的端口,至于来源你可以自定义或者不指定。

alt text

另外一点是创建密钥对,这个是连接ec2要用到的私钥,如果你是第一次创建密钥对的话这个文件要妥善保存起来,如果你之前已经创建过密钥对的话,你会看到如下情况。

alt text

建立SSH连接

首先你要把pem文件设置成400权限,否则系统会提醒你这是未受保护的文件。

chmod 400 xxx.pem

接着建立连接,ec2-54-213-212-29.us-west-2.compute.amazonaws.com是ec2实例的公有DNS地址,ec2-user是用户名(不同实例类型的用户名有区别,具体参考官方文档),/Users/faushine/Documents/ec2.pem是密钥对的绝对路径。

ssh -i /Users/faushine/Documents/ec2.pem ec2-user@ec2-54-213-212-29.us-west-2.compute.amazonaws.com

确认可以连上ec2之后就可以着手把代码放上去了,这一步是用scp实现。

scp -i /Users/faushine/Documents/ec2.pem /Users/faushine/Documents/currency.zip ec2-user@ec2-54-213-212-29.us-west-2.compute.amazonaws.com:~

创建crontab

代码已经部署完了就要让它跑起来。crontab是linux上用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。crontab命令格式是这样的:

crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

编辑crontab

crontab -e

创建crontab

cron表达式* * * * *表示每分钟执行一次,python3 /home/ec2-user/currency/lambda_function.py是需要执行的命令,2>&1把所有的标准输出和错误输出都重定向到/home/ec2-user/currency/crontablog这个文件。

* * * * * python3 /home/ec2-user/currency/lambda_function.py > /home/ec2-user/currency/crontablog 2>&1 &

查看crontab

crontab -l

AWS—使用 SSH 连接到 Linux 实例

Linux Tools Quick Tutorial—crontab 定时任务