前言:
自己做Line聊天機器人好像有點遙不可及。隨著開發Python越來越熟悉以後,就可以用Python製作好玩的聊天機器人。
Line的聊天機器人,其實只要到Line Developer的官方網站上,創建一個聊天機器人即可使用關鍵字的方法,自動回應文字。想必然這不是一個厲害的機器人,只是根據一張Table上的觸發關鍵字來取回對應文字串而已。
事實上,聊天機器人好玩的地方在於,可以利用按鈕跟文字與Linebot機器人互動,進而透過背後的Linebot Messange API 來呼叫運行在遠端的Python程式,再透過程式來回吐文字訊息、系統服務或圖片等等。
如上圖,我們的系統就會運作在AWS的Instance上面。而背後就是使用Python的Linebot SDK 與我們自己撰寫的程式來互動。
所以我們要做的事情有以下幾項
- 在AWS的Instance上面裝好Python、以及 python linebot SDK
- AWS Instance 要設定好 SSL加密,也就是Line官方只能對應 https開頭的加密連線所往來的資料封包。
- 申請商用Line帳號,並申請Linebot Messaging API
- 在AWS 上面運作 Flask 以及Linebot Messaging API
- 將自己的代碼混入function中。
- 測試 & 收工
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撰寫。敬請期待囉~