Python - 建立Line Bot聊天機器人
黃敬恆Fri, Feb 26, 2021
1. 前言
由於Line Bot一般的Messaging API在電腦版上無法正常顯示,改為請使用者至手機上查看之替代文字呈現,因此這次Line Bot開發選擇可自訂排版且能在電腦版顯示之Flex Message。
應用範例選擇使用大學專題所製作的WhatToEat APP,將少數與使用者關係較深且常用到之功能套用至Line Bot上。
2. 建立Line官方帳號
進入LINE Developers,點擊Create按鈕新增Provider

進入Provider後,點擊Create a new channel,會跳出選擇channel type的視窗

選擇Messaging API選項,將資料填寫完畢後點擊Create,便完成了當前步驟。
3. 設定Django環境並與Line官方帳號連結
以下將不會對Django建置多做敘述,如有需要請參考官方文件
安裝所需的套件line-bot-sdk
進入剛新建的Channel中,點擊Messaging API

滑到底部後會看到Channel access token,點擊Issue(由於我已創建過token,所以顯示Reissue)

Channel Secret在Basic setting裡便可找到

取到Access token和Secret後,在views.py中加入Line Bot SDK所需之初始化宣告
新增WebHook驗證功能
至LINE Official Account Manager選擇官方帳號,點擊聊天,選擇設定回應模式

設定結果如下

設定完後便能啟動Server,將產生的網址填入LINE Developers Messaging API中的webhook URL並點擊Verify,如成功便會跳出Success視窗

Django使用虛擬環境執行且無固定IP之問題,推薦使用ngrok
4. 建立Flex Message模板
這邊選擇使用官方提供的Flex Message Simulator,中間可以進行元件的新增修改刪除,右邊則是可調整之元件屬性,而Showcase裡有官方所提供的數個模板可供套用,也可點擊View as JSON直接修改或取得模版之Json檔

5. 撰寫Line Bot API及結合Flex Message
以下皆以WhatToEat之功能為範例來做說明
目前只有用到其中幾種情況監聽一般訊息的MessageEvent
、監聽追蹤的FollowEvent
、監聽取消追蹤的UnFollowEvent
及監聽按鈕回傳值的PostbackEvent
只要是出現在聊天室的訊息都會觸發到監聽一般訊息的MessageEvent
,寫一個鸚鵡機器人來當作測試,確認能夠順利取得聊天室訊息
監聽追蹤的FollowEvent
是在點擊追蹤或取消封鎖時會觸發,監聽取消追蹤的UnFollowEvent
則是在封鎖時觸發,兩者內容其實差不多,可撰寫歡迎訊息來測試是否成功
再來,就是比較需要注意的監聽按鈕回傳值PostbackEvent
,在這邊可先利用剛剛的鸚鵡機器人傳送一個有button且type為postback的Flex Message至聊天室中,以下直接取用Showcase中的模板進行測試
postback button中的action可自訂,但欄位不可作更改,alt_text欄位為聊天室之預覽訊息,將程式碼複製進前面所寫的echo
功能中,並使之觸發
如不清楚如何修改,可將以下Json值複製進Flex Message Simulator查看
contents = {
"type": "bubble",
"hero": {
"type": "image",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/01_1_cafe.png",
"size": "full",
"aspectRatio": "20:12",
"aspectMode": "cover",
"action": {
"type": "uri",
"uri": "http://linecorp.com/"
}
},
"body": {
"type": "box",
"layout": "vertical",
"contents": [
{
"type": "text",
"text": "Store Name",
"weight": "bold",
"size": "xl"
},
{
"type": "box",
"layout": "baseline",
"contents": [
{
"type": "icon",
"url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/review_gold_star_28.png"
},
{
"type": "text",
"text": "Star",
"flex": 0,
"margin": "md",
"size": "sm",
"color": "#999999"
}
],
"margin": "md"
},
{
"type": "box",
"layout": "vertical",
"margin": "lg",
"spacing": "sm",
"contents": [
{
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{
"type": "text",
"text": "Place",
"color": "#aaaaaa",
"size": "sm",
"flex": 1
},
{
"type": "text",
"text": "Address",
"wrap": true,
"color": "#666666",
"size": "sm",
"flex": 5
}
]
},
{
"type": "box",
"layout": "baseline",
"spacing": "sm",
"contents": [
{
"type": "text",
"text": "Time",
"color": "#aaaaaa",
"size": "sm",
"flex": 1
},
{
"type": "text",
"text": "24 hour",
"wrap": true,
"color": "#666666",
"size": "sm",
"flex": 5
}
]
}
]
}
]
},
"footer": {
"type": "box",
"layout": "vertical",
"spacing": "sm",
"contents": [
{
"type": "button",
"style": "link",
"height": "sm",
"action": {
"type": "postback",
"label": "label",
"data": "YOUR_POST_BACK_DATA",
"displayText": "displayText"
}
}
],
"flex": 0
}
}
line_bot_api.reply_message(event.reply_token,
FlexSendMessage(alt_text='YOUR_ALT_TEXT', contents=contents))
點擊Flex Message具有postback type的按鈕,就會觸發監聽按鈕回傳值PostbackEvent
,可在功能裡加入判斷回傳資料之if或是直接將資料print出來在terminal,確認資料是否正確
6. 總結
此篇文章只有大略介紹了一下常用的Line Bot API,可再自行作延伸,還有例如群發等API,詳細的資料可至line-bot-sdk-python,裡面有各個API及資料內容的介紹,感謝您的閱讀。