前面我們做完了最簡單的回傳,現在要來講一些其他的回傳功能。
LINE Bot SDK提供了許多不同的API讓LINE Bot可以與使用者互動,而其中最常用的就是回傳的部分。
接下來先介紹一些基本的語法,當使用者傳送訊息給LINE Bot時,會觸發MessageEvent事件,再檢查收到的訊息是不是文字訊息:
for event in events:
if isinstance(event, MessageEvent):
if isinstance(event.message, TextMessage):
一開始要先取得使用者傳送的文字,並把它儲存於變數當中:
mtext(變數) = event.message.text
接下來再對變數做一些處理:
if mtext == '(要傳送的文字)':
處理程式(傳送之後會發生的事)
elif mtext == '(要傳送的文字)':
處理程式(傳送之後會發生的事)
回傳訊息的種類分為很多種,舉凡:Text(文字)、Image(圖片)、Video(影片)、Audio(聲音)、Location(位置)、Sticker(貼圖)、Template(樣板) 等等都可以回傳。
這邊以文字回傳當範例:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text=文字內容))
有時候可能裡面的參數會不只一個,如果一個一個列出來回傳,可能會讓程式碼太長也不方便閱讀,這時候就可以改成下列語法直接一次回傳:
message = TextSendMessage(
text(參數)='文字內容',
text2='文字內容2',
text3='文字內容3',
)
line_bot_api.reply_message(event.reply_token,message)
前面簡單介紹完程式碼的意思後,就來帶大家動手做幾個比較常會用到的回傳訊息。
因為前幾天有介紹過製作方法,這邊就直接請大家建立一個6格的圖文選單,選擇喜歡的圖案,類型都選擇文字,內容則分別寫下:#傳送文字、#傳送圖片、#傳送貼圖、#多項傳送#、傳送位置、#快速選單,也就是我們今天要示範的6種訊息傳送。
當然這邊名字都是可以隨意更改的,只要知道自己要什麼功能,並且程式碼有對應到就可以了!
打開命令提示字元進入專案,先新增一個module資料夾,然後在資料夾中新增一個func.py檔
md module
copy /y nul func.py
接下來就進入到程式的部分了,黃框mtext(變數)為前面所提到的用來讀取使用者輸入的文字,下面的if elif則是根據傳送的文字執行對應的功能函式。
view.py完整程式碼如下:
from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextMessage
from module import func
line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)
@csrf_exempt
def callback(request):
if request.method == 'POST':
signature = request.META['HTTP_X_LINE_SIGNATURE']
body = request.body.decode('utf-8')
try:
events = parser.parse(body, signature)
except InvalidSignatureError:
return HttpResponseForbidden()
except LineBotApiError:
return HttpResponseBadRequest()
for event in events:
if isinstance(event, MessageEvent):
if isinstance(event.message, TextMessage):
mtext = event.message.text
if mtext == '#傳送文字':
func.sendText(event)
elif mtext == '#傳送圖片':
func.sendImage(event)
elif mtext == '#傳送貼圖':
func.sendStick(event)
elif mtext == '#多項傳送':
func.sendMulti(event)
elif mtext == '#傳送位置':
func.sendPosition(event)
if mtext == '#快速選單':
func.sendQuickreply(event)
return HttpResponse()
else:
return HttpResponseBadRequest()
要記得放入處理回覆訊息所需的模組們:
訊息變數 = TextSendMessage(
text='文字訊息',
)
line_bot_api.reply_message(event.reply_token,訊息變數)
訊息變數 = ImageSendMessage(
original_content_url = 原始圖片網址,
preview_image_url = 預覽圖片網址
)
line_bot_api.reply_message(event.reply_token,訊息變數)
訊息變數 = StickerSendMessage(
package_id='套組ID',
sticker_id='貼圖ID'
)
line_bot_api.reply_message(event.reply_token,訊息變數)
訊息變數 = [
訊息一,
訊息二、
.....
]
line_bot_api.reply_message(event.reply_token,訊息變數)
訊息變數 = LocationSendMessage(
title = 標題,
address = 地址,
latitude = 緯度,
longitude = 經度
)
line_bot_api.reply_message(event.reply_token,訊息變數)
訊息變數 = TextSendMessage(
text=文字,
quick_reply=QuickReply(
items=[
QuickReplyButton(
action=MessageAction(label="顯示值",text="選取值")
),
QuickReplyButton(
action=MessageAction(label="顯示值",text="選取值")
),
.....
line_bot_api.reply_message(event.reply_token,訊息變數)
func.py完整程式碼如下:
from django.conf import settings
from linebot import LineBotApi
from linebot.models import TextSendMessage,ImageSendMessage,StickerSendMessage,LocationSendMessage,QuickReply,QuickReplyButton,MessageAction
line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
def sendText(event):
try:
message = TextSendMessage(
text='嚕喵毛,換毛季是打掃季!',
)
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
def sendImage(event):
try:
message = ImageSendMessage(
original_content_url = "https://imgur.com/TcSD7FL.png",
preview_image_url = "https://imgur.com/TcSD7FL.png"
)
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
def sendStick(event):
try:
message = StickerSendMessage(
package_id='11539',
sticker_id='52114124'
)
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
def sendMulti(event):
try:
message = [
TextSendMessage(
text='嚕喵毛,換毛季是打掃季!',
),
ImageSendMessage(
original_content_url = "https://imgur.com/TcSD7FL.png",
preview_image_url = "https://imgur.com/TcSD7FL.png"
),
StickerSendMessage(
package_id='11539',
sticker_id='52114124'
)
]
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
def sendPosition(event):
try:
message = LocationSendMessage(
title = '台北教育大學',
address = '台北市大安區和平東路二段134號',
latitude = 25.024163 ,#緯度
longitude = 121.544888 #經度
)
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
def sendQuickreply(event):
try:
message = TextSendMessage(
text='嚕喵毛,今天要打掃哪裡呢?',
quick_reply=QuickReply(
items=[
QuickReplyButton(
action=MessageAction(label="客廳",text="客廳")
),
QuickReplyButton(
action=MessageAction(label="房間",text="房間")
),
QuickReplyButton(
action=MessageAction(label="廚房",text="廚房")
),
QuickReplyButton(
action=MessageAction(label="廁所",text="廁所")
),
QuickReplyButton(
action=MessageAction(label="不想打掃",text="不想打掃")
),
]
)
)
line_bot_api.reply_message(event.reply_token,message)
except:
line_bot_api.reply_message(event.reply_token,TextSendMessage(text='發生錯誤!'))
這樣我們就做好基本的幾個訊息回傳功能啦!是不是很簡單呢~~~
學會這些功能後,就可以根據想做的機器人類型去變化回傳的訊息種類,後面還會教更多不同的功能,也可以結合這些回傳去跟使用者互動~
那麼話不多說,明天也繼續跟我們一起練習吧!٩(ˊᗜˋ*)و✧*。