Python – Line聊天機器人 Linebot + AWS instance (1)

前言:

自己做Line聊天機器人好像有點遙不可及。隨著開發Python越來越熟悉以後,就可以用Python製作好玩的聊天機器人。

Line的聊天機器人,其實只要到Line Developer的官方網站上,創建一個聊天機器人即可使用關鍵字的方法,自動回應文字。想必然這不是一個厲害的機器人,只是根據一張Table上的觸發關鍵字來取回對應文字串而已。

事實上,聊天機器人好玩的地方在於,可以利用按鈕跟文字與Linebot機器人互動,進而透過背後的Linebot Messange API 來呼叫運行在遠端的Python程式,再透過程式來回吐文字訊息、系統服務或圖片等等。

取自官方圖片

如上圖,我們的系統就會運作在AWS的Instance上面。而背後就是使用Python的Linebot SDK 與我們自己撰寫的程式來互動。

所以我們要做的事情有以下幾項

  1. 在AWS的Instance上面裝好Python、以及 python linebot SDK
  2. AWS Instance 要設定好 SSL加密,也就是Line官方只能對應 https開頭的加密連線所往來的資料封包。
  3. 申請商用Line帳號,並申請Linebot Messaging API
  4. 在AWS 上面運作 Flask 以及Linebot Messaging API
  5. 將自己的代碼混入function中。
  6. 測試 & 收工

Messaging API

Push and reply messages

如上圖,我們想要的就是使用者傳訊息,然後機器人會自動回話。很簡單的。

開始:

關於在AWS、架站及在上設定安裝Python與pip,若你不了解可以先觀看下面幾篇文章。把網站Webhost基本知識建立起來。

架站101影響網站速度的原因 – 網路主機地點參考

架站101站長基本工具 – 使用SSH快速連入網路主機的方法

Python – AWS Lightsail 安裝pip實戰

另外文章一開頭也有提到,把網址做SSL加密。這部分就自行上網Google囉。我先預設大家已經做好這一部分了。或是有機會我再來做另一篇教學。

安裝 Linebot SDK

我們直接SSH進去AWS的instance之後,輸入

 sudo pip3 install line-bot-sdk

Collecting line-bot-sdk
Downloading line_bot_sdk-1.18.0-py2.py3-none-any.whl (66 kB)
|████████████████████████████████| 66 kB 5.9 MB/s
Requirement already satisfied: requests>=2.0 in /usr/lib/python3/dist-packages (from line-bot-sdk) (2.21.0)
Collecting future
Downloading future-0.18.2.tar.gz (829 kB)
|████████████████████████████████| 829 kB 22.6 MB/s
Building wheels for collected packages: future
Building wheel for future (setup.py) … done
Created wheel for future: filename=future-0.18.2-py3-none-any.whl size=491059 sha256=c36182524d66f1582e1412cc407e260985528fc563a5ffd91f6544f827b067be
Stored in directory: /root/.cache/pip/wheels/56/b0/fe/4410d17b32f1f0c3cf54cdfb2bc04d7b4b8f4ae377e2229ba0
Successfully built future
Installing collected packages: future, line-bot-sdk
Successfully installed future-0.18.2 line-bot-sdk-1.18.0

很順的就裝完了,記得用pip3去裝。用pip 就沒反應。

觀看SDK說明以及取得Sample Code

可以到下面連結的Line官方 github看看關於SDK的說明。

https://github.com/line/line-bot-sdk-python

我們可以順便把官方的Sample Code拿下來備用

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook 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):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


if __name__ == "__main__":
    app.run()

安裝Flask 套件

sudo pip3 install flask

Collecting flask
Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
|████████████████████████████████| 94 kB 388 kB/s
Collecting itsdangerous>=0.24
Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting Jinja2>=2.10.1
Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 1.6 MB/s
Collecting click>=5.1
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
|████████████████████████████████| 82 kB 87 kB/s
Collecting Werkzeug>=0.15
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
|████████████████████████████████| 298 kB 1.3 MB/s
Requirement already satisfied: MarkupSafe>=0.23 in /usr/lib/python3/dist-packages (from Jinja2>=2.10.1->flask) (1.1.0)
Installing collected packages: Werkzeug, Jinja2, itsdangerous, click, flask
Attempting uninstall: Jinja2
Found existing installation: Jinja2 2.10
Uninstalling Jinja2-2.10:
Successfully uninstalled Jinja2-2.10
Successfully installed Jinja2-2.11.3 Werkzeug-1.0.1 click-7.1.2 flask-1.1.2 itsdangerous-1.1.0

完成!

什麼是Flask? 我們先看一下Wiki的定義

Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。

Flask被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有預設使用的資料庫、表單驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension頁面存檔備份,存於網際網路檔案館[2]加入這些功能:ORM、表單驗證工具、檔案上傳、各種開放式身分驗證技術。

簡單的說,就是Flask會把伺服器上跑起一個python web 框架。讓我們可以將Linebot的web hook連進來。如下圖的右邊那塊,就是會由Flask來幫忙做資料的出入的串接

取自官方圖片

小結:

由於過程較長,礙於閱讀篇幅,將分幾篇文章完成。目前我們已經把Server上需要運作的東西先建立好了。接下來只要專注在Linebot API 申請,以及我們自己的Script撰寫。敬請期待囉~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *