醜話先說在前頭,模型雖然可以達到一定程度準確,但你要拿來 ALL IN 炒匯,輸贏可不甘我的事啊!我只是覺得這麼做很有趣而已。這邊會分成兩個部分來執行,第一是取得當下匯率資訊,第二是預測隔天匯率的收盤價。為了避免太過於混亂,我先在 chatbot 實現這兩個功能。
這篇文章只針對之前幾篇在 Azure machine learning 所做出來的匯率預測服務,所以只需要把之前部署在workspce
的服務連結,放進去config.json
,再上傳到 Azure Web App 就可以了。記得config.json
直接用scp
上傳到/home
,或者直接ssh
連進 Azure Web App 編輯。
config.json
{
"line": {
"line_secret": "your line secret",
"line_token": "your line token",
},
"azure": {
"azureml_endpoint": "your endpoint url of service on azure service",
}
Python
套件Flask==1.0.2
line-bot-sdk
investpy
requests
import json
import requests
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import (
MessageEvent,
TextMessage,
TextSendMessage,
)
import investpy
app = Flask(__name__)
CONFIG = json.load(open("/home/config.json", "r"))
ML_URL = CONFIG["azure"]["azureml_endpoint"]
LINE_SECRET = CONFIG["line"]["line_secret"]
LINE_TOKEN = CONFIG["line"]["line_token"]
LINE_BOT = LineBotApi(LINE_TOKEN)
HANDLER = WebhookHandler(LINE_SECRET)
@app.route("/")
def hello():
"hello world"
return "Hello World!!!!!"
@app.route("/callback", methods=["POST"])
def callback():
"""
LINE bot webhook callback
"""
# get X-Line-Signature header value
signature = request.headers["X-Line-Signature"]
print(signature)
body = request.get_data(as_text=True)
print(body)
try:
HANDLER.handle(body, signature)
except InvalidSignatureError:
print(
"Invalid signature. Please check your channel access token/channel secret."
)
abort(400)
return "OK"
@HANDLER.add(MessageEvent, message=TextMessage)
def handle_message(event):
"""
Reply text message
"""
# 如果使用手機輸入英文,常常會自動補齊,然後再加上" ",所以會特地把空白去掉
# 除了補齊以外,還會自動幫字首大寫,所以這邊乾脆都弄成小寫
text = event.message.text.replace(" ", "").lower()
# 第一個功能:如果使用者對 chatbot 傳送 "currency",便從 investing.com 取得臺幣對美金的匯率
if text == "currency":
recent = investpy.get_currency_cross_recent_data("USD/TWD")
message = TextSendMessage(text=recent.Close.values[-1])
# 第二個功能:如果使用者對 chatbot 傳送 "prediction",不但取得匯率資訊,同時也我們自己部署的服務取得預測結果
elif text == "prediction":
recent = investpy.get_currency_cross_recent_data("USD/TWD")
data = {"data": ""}
input_data = json.dumps(data)
headers = {"Content-Type": "application/json"}
resp = requests.post(ML_URL, input_data, headers=headers)
message = TextSendMessage(
text="Current currency: {}\nPrediction for Next day: {}".format(
recent.Close.values[-1], round(float(resp.text), 2)
)
)
else:
message = TextSendMessage(text=event.message.text)
LINE_BOT.reply_message(event.reply_token, message)
準備好requirements.txt
和application.py
,記得git push
到 Azure machine learning。
為了查個匯率還要輸入 "currency" ,有時候還會拼錯,我用手機打字也不快。這時候就會需要使用 Line 的圖文選單,讓我們可以直接點擊按鈕,就得到結果,再也不需要打字了!
聊天室相關
底下,有個圖文選單
選擇版型
,選擇兩個框框就好,我只需要 currency 和 prediction。建立圖片
,可以選擇每個框的圖片,可以自行上傳,或者寫個字就好。動作
方面,有 A 和 B ,類型都選擇文字,內容分別是 currency 和 prediction,之後點選圖案就是會直接送出文字,來觸發 chatbot 提供匯率或預測結果。做完之後,就會得到以下的效果:
利用 Azure 的各種服務之後,我們做到了看圖學英文、韓文翻譯機器人、人臉登入和預測匯率的工具,但都還是零散著做,所以,下一篇文章,要來想辦法把這些功能全部整合起來。(謎之聲:這個不難吧?只要加在一起做撒尿牛丸就好了...)
嗯~~原本我也覺得不難,但還是踩了雷,有些小地方要注意......。下一篇,決戰大魔王吧!