建置簡單 Line 聊天機器人

Hint: 筆記內容主要來自: iT邦幫忙 - LINE BOT 新手村30日攻略系列 的部分重點節錄。

Our Goal & Ability You Need

1. 目的: 實做出一個可以回應使用者的天氣預報 line 機器人 💪

2. 需要具備的能力:

  • Line 帳號
  • Python 環境
  • Python 基礎語法
  • 分析JSON資料
  • 學習熱誠

接下來進入實作環節 !


Setting Environment

  • LINE Messenging API
  • LINE BOT設定

Hint: 將我們希望回覆的訊息格式和內容以特定的JSON格式回覆給Messenging API,指定的 JSON格式檔案就可以在我們的 BOT Server 及 LINE Platform 之間以HTTPS的方式,傳遞這則訊息給用戶。

Step1. LINE BOT設定

新增LINE BOT

  1. 前往 https://developers.line.biz/ 並 登入/創建LINE帳號

  1. 新增Providers
    登入 LINE 帳號後看到介面如下 👇

接下來點擊 Create
輸入Providers name,可以隨意填寫,只要下面都是綠色勾勾就可以~

  1. 新增 Messenger API channel
    點選 Create a Messenging API channel

接下來修改以下內容:

  • Channel name
  • Channel description
  • Category
  • Subcategory
  • Email address
  • 其餘選填

填完後下方選項打勾並點選 Create

產生Access token

  1. 到 Messaging API
  2. 在最下面找到 Channel access token 並點擊 issue

務必將此token記下來!之後會用到喔!

Channel Secret

  1. 請到 Basic settings
  2. 往下找到Channel secret

務必將此secret記下來!之後會用到喔!

啟用webhook

  1. 前往 LINE manager 選擇剛剛新增的BOT

  1. 按右上角設定

  1. 選擇左側的回應設定 , 將進階設定中的 Webhook勾選啟用、自動回覆訊息改為停用

到這邊關於LINE BOT的設定就告一段落 😄

Step2. 下載Python套件

LINE官方關於python部分有提供 line-bot-sdk
此外,我們也會用到 flask 套件

  1. win+R 開啟cmd
  2. 輸入以下指令
1
pip3 install line-bot-sdk flask

Python的部分完成囉!

Step3. 開發用資料夾

上面的套件都下載&安裝完後就新增一個資料夾吧~
之後所有的資料都會放在這個資料夾裡面

Step4. 下載ngrok

做本機測試會用到ngrok,這邊就先下載
建議放在剛剛新增的資料夾裡面,之後會比較方便使用

  1. 前往 https://ngrok.com/download 下載windows版ngrok
    如果你是使用WSL或是Linux系統可以下載Linux版ngrok

前置作業終於完成 ! 👍


實作 - 鸚鵡式機器人

Hint: 所謂鸚鵡式機器人就是 你說甚麼,它就說甚麼

  1. Coding
  2. 使用webhook建立連線
  3. 接收使用者訊息
  4. 回覆使用者訊息

Coding

先到建立的開發用資料夾中開啟新檔案,建議使用VScode開啟。
名稱就叫main.py

將模板放入main.py中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import *


app = Flask(__name__)
# LINE BOT info
line_bot_api = LineBotApi('Channel Access token')
handler = WebhookHandler('Channel Secret')

@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
print(body)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'

# Message event
@handler.add(MessageEvent)
def handle_message(event):
message_type = event.message.type
user_id = event.source.user_id
reply_token = event.reply_token
message = event.message.text
line_bot_api.reply_message(reply_token, TextSendMessage(text = message))

import os
if __name__ == "__main__":
port = int(os.environ.get('PORT', 8888))
app.run(host='0.0.0.0', port=port)

Channel Access token 以及 Channel Secret 改成上面提到要記的兩個值放入

1
2
3
4
app = Flask(__name__)
# LINE BOT info
line_bot_api = LineBotApi('Channel Access token')
handler = WebhookHandler('Channel Secret')

指定在 /callback 通道上接收訊息,且方法是 POST
callback() 是為了要檢查連線是否正常
其中 signature 是LINE官方提供用來檢查該訊息是否透過LINE官方APP傳送
body 就是用戶傳送的訊息,並且是以 JSON 的格式傳送

1
2
3
4
5
6
7
8
9
10
11
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
print(body)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'

這邊是用來接收訊息的地方
特別注意到 line_bot_api.reply_message()
它是回傳訊息的方法,而我們設定回傳的型態是文字(text)

1
2
3
4
5
6
7
8
# Message event
@handler.add(MessageEvent)
def handle_message(event):
message_type = event.message.type
user_id = event.source.user_id
reply_token = event.reply_token
message = event.message.text
line_bot_api.reply_message(reply_token, TextSendMessage(text = message))

接收到的訊息會被放在event中,一樣會是JSON格式

  • events.message.type
    這裡記錄訊息的型態
  • events.message.text
    如果是文字訊息(text)
    這裡會記錄傳送的文字
  • events.sourse.userId
    這裡記錄使用者的ID

指定BOT執行的位置是在 0.0.0.0:8888
接上前面所說的,BOT會接收訊息的位置會是0.0.0.0:8888/callback

1
2
3
4
import os
if __name__ == "__main__":
port = int(os.environ.get('PORT', 8888))
app.run(host='0.0.0.0', port=port)

Webhook

Hint: 當LINE Platfrom接收到來自使用者的訊息後,透過API接口,webhook通道使得LINE Platform從被動方變成主動方,將訊息傳送到BOT Server

實作開始

實際上,這份code已經完成了鸚鵡的功能了,那接下來就讓它動起來吧 !

  1. 執行ngrok.exe
  2. 在命令提示視窗執行以下指令
1
ngrok.exe http 8888
  1. 執行cmd,移動路徑到專案的資料夾中
  2. 在cmd執行以下指令
1
python main.py 

目前為止,你的畫面應該會是這樣

你會發現有一個會將訊息導向 localhost:80 上的webhook
現在只需要讓LINE 知道webhook在哪裡就完成了!

前往 https://manager.line.biz/ 登入自己的LINE帳號,並進入自己的LINE BOT
點擊右上角的設定 > Messaging API

將Webhook網址改成剛剛ngrok上看到的網址加上/callback並儲存


圖片中忘記加上callback,請記得補上

這樣一來,通道就建構成功啦!
先將LINE BOT加入好友後來試試看功能吧!
LINE ID可以在剛剛的網頁上方找到

接下來就可以跟自己的BOT聊天

分享到