iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
AI & Data

我不太懂 AI,可是我會一點 Python 和 Azure系列 第 28

Day 28 Chatbot integration- 匯率預測小工具

Chatbot integration- 匯率預測小工具

醜話先說在前頭,模型雖然可以達到一定程度準確,但你要拿來 ALL IN 炒匯,輸贏可不甘我的事啊!我只是覺得這麼做很有趣而已。這邊會分成兩個部分來執行,第一是取得當下匯率資訊,第二是預測隔天匯率的收盤價。為了避免太過於混亂,我先在 chatbot 實現這兩個功能。

上傳 config

這篇文章只針對之前幾篇在 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.txtapplication.py,記得git push到 Azure machine learning。

嫌打字太麻煩?製作圖文選單吧~

為了查個匯率還要輸入 "currency" ,有時候還會拼錯,我用手機打字也不快。這時候就會需要使用 Line 的圖文選單,讓我們可以直接點擊按鈕,就得到結果,再也不需要打字了!

  • 首先,先進入:https://manager.line.biz/
  • 點選自己的 chatbot 帳號
  • 聊天室相關底下,有個圖文選單
  • 點擊建立之後,接著就能針對版型、圖片和動作進行編輯,以下以我的情況為例:
    • 點選選擇版型,選擇兩個框框就好,我只需要 currency 和 prediction。
    • 點選建立圖片,可以選擇每個框的圖片,可以自行上傳,或者寫個字就好。
    • 動作方面,有 A 和 B ,類型都選擇文字,內容分別是 currency 和 prediction,之後點選圖案就是會直接送出文字,來觸發 chatbot 提供匯率或預測結果。

做完之後,就會得到以下的效果:


利用 Azure 的各種服務之後,我們做到了看圖學英文、韓文翻譯機器人、人臉登入和預測匯率的工具,但都還是零散著做,所以,下一篇文章,要來想辦法把這些功能全部整合起來。(謎之聲:這個不難吧?只要加在一起做撒尿牛丸就好了...)

嗯~~原本我也覺得不難,但還是踩了雷,有些小地方要注意......。下一篇,決戰大魔王吧!


上一篇
Day 27 Azure machine learning: Schedule- Azure 為你定期執行任務
下一篇
Day 29 Chatbot integration- 多功能 chatbot 就此誕生!
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30

尚未有邦友留言

立即登入留言