Shell Script版的台銀匯率漲跌通知程式
因為常常沒注意盤勢而錯失外幣進場和出場的時機,
想寫個程式解決又不想寫太多code,
因此決定偷懶用Shell Script寫一寫加上crontab定時執行就好了。
(不過說真的用shell寫這種程式真的不是什麼好主意~)
漲跌反正就用買價和賣價相加後除以2的均價為依據,
只要漲跌超過敏感值則寄email通知,並將目前的匯率存至本機,
如果沒跨越敏感值則繼續等待下一次的檢查。
目前只關注美金就先用USD,也可以改成其他貨幣,例如把USD改成JPY或AUD等等。
寫完後命名為foreignex-alert-usd.cron
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/bin/bash # ============================================== # ### 台銀匯率漲跌通知 # 2015/03/27 Edit by forink # ### http://techblog.forink.net/ # ### 轉貼請保留原作者與文章網址,盜文必究 # ============================================== MAIL_TO="user@gmail.com" #收件者信箱 CUR="USD" #要抓取的貨幣種類,可依需求改為JPY或AUD等等 CUR_NAME="美金" #要抓取的貨幣名稱,會顯示在信件中 RATE_SENSITIVE=0.05 #敏感值,決定漲跌金額多少才寄信通知 TMP_CUR_PATH="/tmp/tmp_curs_${CUR}.txt" #匯率暫存檔路徑 URL="http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm" #台銀匯率公告頁網址 MAX_RETRY=10 #最大重試次數,超過則終止程式 #更新本機暫存匯率資料 function UpdateTmpEx(){ upd_tmp_path=$1 upd_rate=$2 upd_catch_time=$3 echo ${upd_catch_time} > ${upd_tmp_path} echo ${upd_rate} >> ${upd_tmp_path} echo "Update the temp foreign echange rates completed." } rate_buy="" #買價 rate_sell="" #賣價 recnt=0 #擷取次數 #抓取台銀匯率網頁,如果失敗就重抓N次 float_re=^[+-]?[0-9]+\.?[0-9]*$ while ([[ ! ${rate_buy} =~ ${float_re} ]] || [[ ! ${rate_sell} =~ ${float_re} ]]) && [ ${recnt} -lt ${MAX_RETRY} ] do recnt=$((${recnt}+1)) echo "Retry # ${recnt} ..." #依序查找台銀匯率表格,取得美金匯率資料 rate_buy=$(curl --silent ${URL}|grep ${CUR}| awk '{ print $12 }'|sed -e 's/[^0-9\.]*//g') #抓台銀匯率買價 echo "Buy rate: ${rate_buy}" sleep 5 rate_sell=$(curl --silent ${URL}|grep ${CUR}| awk '{ print $13 }'|sed -e 's/[^0-9\.]*//g') #抓台銀匯率賣價 echo "Sell rate: ${rate_sell}" sleep 5 done #測試N次仍抓不到值,便終止程式 if [[ ! ${rate_buy} =~ ${float_re} ]] || [[ ! ${rate_sell} =~ ${float_re} ]]; then echo "Can not get exchange rate from BOT. Program suspend!" exit 0 fi #計算均價並取得目前時間 rate=$(echo "scale=5;(${rate_buy}+${rate_sell})/2"|bc) #均價 catch_time=$(date +"%Y-%m-%d %H:%M:%S") #匯率更新時間 echo "Get new exchange rate of ${CUR}: ${rate} [${catch_time}]." #檢查儲存變數檔是否已存在,如果沒有上一次資料則抓取並儲存後中止程式 if [ ! -e ${TMP_CUR_PATH} ];then UpdateTmpEx "${TMP_CUR_PATH}" "${rate}" "${catch_time}" echo "Temp exchange rate has been upadted without alert mail." exit 0 fi #取得新舊買賣匯率 tmp_catch_time=$(cat ${TMP_CUR_PATH} | sed -n '1p') #上次暫存時間 tmp_rate=$(cat ${TMP_CUR_PATH} | sed -n '2p') #上次暫存中間價 #計算新舊匯率差 diff_rate=$(echo "scale=5;${rate}-${tmp_rate}"|bc) #取得絕對值 diff_rate_abs=$(echo ${diff_rate#-}) echo "Current rate: ${rate} / TMP rate: ${tmp_rate}" echo "Differences: ${diff_rate} / Sensitive value: ${RATE_SENSITIVE}" #檢查本機暫存匯率是否有誤,出錯則再重新取得,毋需寄信 if [[ -z "${tmp_rate}" ]]; then UpdateTmpEx "${TMP_CUR_PATH}" "${rate}" "${catch_time}" echo "Temp exchange rate error and has been fixed without alert mail." exit 0 fi #有上一次資料可供比對時,比對匯差,超過敏感值時寄信並設定通知內容 #差異超過敏感值則更新暫存數值並寄信通知,否則結束程式 if [ $(echo "$diff_rate_abs > ${RATE_SENSITIVE}"|bc) -eq 1 ]; then updown_desc="" updown_mark="" if [ $(echo "$diff_rate > 0"|bc) -eq 1 ]; then updown_desc="上漲" updown_mark="▲" else updown_desc="下跌" updown_mark="▽" fi #更新數值 UpdateTmpEx "${TMP_CUR_PATH}" "${rate}" "${catch_time}" echo "Temp exchange rate has been upadted." #準備信件內容 mail_subject="${CUR_NAME}匯率${updown_desc}通知" mail_contents="${CUR_NAME}匯率${updown_desc}通知:\n" mail_contents+="==================================================\n" mail_contents+="□ 上次匯率均價:${tmp_rate} → 時間:${tmp_catch_time}\n" mail_contents+="▣ 最新匯率均價:${rate} → 時間:${catch_time} \n" mail_contents+=" 漲跌幅度:${updown_mark} ${diff_rate} ◈ 大於敏感值±${RATE_SENSITIVE}\n" mail_contents+="==================================================\n" #寄出信件 echo "Send notification email......" echo ${mail_subject} echo ${mail_contents} echo -e ${mail_contents} | mail -s ${mail_subject} ${MAIL_TO} if [ $? -eq 0 ];then echo "Mail Success!" else echo "Mail Fail!" fi else echo "Do nothing." exit 0 fi |
寄信的部分使用mailx指令,如果要使用外部SMTP寄信,
要在/etc/mail.rc裡設定位址、帳號和密碼,在檔案的最末端加入以下設定:
(相關設定與驗證密碼依實際情況填寫)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# SMTP Server 基本設定 set smtp-use-starttls set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/ # 設定SMTP=smtp://網址:PORTS set smtp=smtp://smtp-mail.outlook.com:587 # 設定SMTP的驗證方法和登入帳號 set smtp-auth=login set smtp-auth-user=user@outlook.com # 設定SMTP的驗證密碼 set smtp-auth-password=1234567 # 設定寄件者名稱 set from="user@outlook.com (USER)" |
為了讓程式可以在可交易日的交易時間每10分鐘跑一次,在crontab中增加紅框處的設定,
並將 foreignex-alert-usd.cron 丟到/etc/cron.foreign-ex裡面,權限設定為755。
收到信件的效果如下圖:(因為測試故意先把暫存檔匯率改成31.4000)