iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
AI & Data

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

Day 05 Line Massaging API- 打造自己的 Chatbot

Line Massaging API- 打造自己的 Chatbot

接下來,如果要在 Azure Web App 上打造 chatbot ,那就必須會用到 Line Massaging API ,透過 Line Massaging API 才能讓 chatbot 與使用者溝通。

How it works

  • 使用者發送訊息到 LINE chatbot 帳號
  • LINE platform 發送webhook event到 chatbot server
  • Chatbot server 透過 LINE platform 回應給使用者

建立 Messaging API channel

  • 進入 Line Developers
  • 使用 LINE 帳號登入
  • 找到 Providers
    • 按下 Create
    • 為自己的 Provider name 取名
  • 選擇 Create a Messaging API channel

建立 Messaging API channel

  • 填寫基本資料
    • Channel name
    • Channel discription
    • Category
    • Subcategory
  • 打勾- I have read and agree ....
  • Create

Chatbot 一定會用到的參數- Secret & Token

  • 取得 Secret & Token

    • 點選 Basic Setting: Channel Secret
    • 點選 Messaging API:按下issue,得到 Channel access token
  • Channel SecretChannel access token 存到config.json上傳到 Azure Web App。

    • config.json
    {
    "line": {
        "line_secret": "your line secret",
        "line_token": "your line token",
        }
    }
    
    • 建立連結 Web App 的 tunnel。
    az webapp create-remote-connection \
    -n <你的Web App名稱> --resource-group <你的資源群組> &
    
    • 使用scp上傳config.json,這邊要注意只能上傳到/home,這樣在 Web App 的 chatbot 才能讀到此檔案。
    scp -P <port> config.json ben@127.0.0.1:/home/config.json
    
  • 或者,直接利用az webapp config appsettings set設定環境變數,詳情請看Day 04 Azure Web App- 方便部署服務

安裝 Line chatbot python package

pip3.7 install line-bot-sdk

Flask + Line Chatbot

把之前的 "hello world" 的Flask網頁改寫成以下的樣子,並且部署到 Azure Web App ,就能讓 chatbot 與 Line Platform 溝通。

application.py

import json
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
app = Flask(__name__)

# 讀取 config.json,取得 secret 和 token
CONFIG = json.load(open("/home/config.json", "r"))
LINE_SECRET = CONFIG["line"]["line_secret"]
LINE_TOKEN = CONFIG["line"]["line_token"]
LINE_BOT = LineBotApi(LINE_TOKEN)
HANDLER = WebhookHandler(LINE_SECRET)


@app.route("/callback", methods=["POST"])
def callback():
    # X-Line-Signature: 數位簽章
    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("Check the channel secret/access token.")
        abort(400)
    return "OK"

Webhook setting

接著就要到剛剛建立的 Messaging API channel ,設定webhook

  • 進入 Messaging API channel
  • 點選 Messaging API
  • 找到 Webhook URL
    • 點擊 Edit
    • 填上 Azure Web APP 的 URL 加上 /callback
      • Example: https://<YOUR WEB APP NAME>.azurewebsites.net/callback
    • 點擊 Verify,如果出現的視窗顯示 Success,就沒有問題了。
  • 開啟 Use Webhook

讓 Chatbot 回話

訊息種類

application.py加上以下這一段,就可以讓chatbot學你說話。透過 HANDLER ,可以辨別 chatbot 接受到的訊息種類,基本的訊息種類有:

  • Text
  • Image
  • Video
  • Audio
  • Location
  • Sticker

我們可以讓 chatbot 針對接收到的訊息種類做相對應的動作,在這邊是針對文字訊息做處理。收到文字訊息後,如果有收到特定文字,便給予特定答覆,其餘則直接學對方說話,回覆相同的文字。要回覆給使用者的字串需要經由TextMessage包裝成物件之後,才能透過reply_message回覆給使用者。可以試著在application.py加入以下示範程式,確認效果。

from linebot.models import (
    MessageEvent,
    TextMessage,
    TextSendMessage,
)

# 可以針對收到的訊息種類作出處理,這邊是針對 TextMessage
@HANDLER.add(MessageEvent, message=TextMessage)
def handle_message(event):
    url_dict = {
      "ITHOME":"https://www.ithome.com.tw/", 
      "HELP":"https://developers.line.biz/zh-hant/docs/messaging-api/"}
# 將要發出去的文字變成TextSendMessage
    try:
        url = url_dict[event.message.text.upper()]
        message = TextSendMessage(text=url)
    except:
        message = TextSendMessage(text=event.message.text)
# 回覆訊息
    LINE_BOT.reply_message(event.reply_token, message)

Reference


下一篇比較輕鬆,教大家怎麼美化自己的 Line 訊息。


上一篇
Day 04 Azure Web App- 方便部署服務
下一篇
Day 06 Flex message simulator- 美化自己的chatbot
系列文
我不太懂 AI,可是我會一點 Python 和 Azure30

尚未有邦友留言

立即登入留言