iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

30天建構出一個簡單 LineBot 機器人系列 第 8

DAY 8 回傳訊息的各種類型

  • 分享至 

  • xImage
  •  

前面我們做完了最簡單的回傳,現在要來講一些其他的回傳功能。
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)

前面簡單介紹完程式碼的意思後,就來帶大家動手做幾個比較常會用到的回傳訊息。

1.建立圖文選單

因為前幾天有介紹過製作方法,這邊就直接請大家建立一個6格的圖文選單,選擇喜歡的圖案,類型都選擇文字,內容則分別寫下:#傳送文字、#傳送圖片、#傳送貼圖、#多項傳送#、傳送位置、#快速選單,也就是我們今天要示範的6種訊息傳送。
當然這邊名字都是可以隨意更改的,只要知道自己要什麼功能,並且程式碼有對應到就可以了!

2.沿用Django並新增func.py檔

打開命令提示字元進入專案,先新增一個module資料夾,然後在資料夾中新增一個func.py檔

md module
copy /y nul func.py


3.view.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()

4.func.py程式碼(執行功能的函式)

要記得放入處理回覆訊息所需的模組們:

  • 回傳文字訊息(TextSendMessage)
    語法:
        訊息變數 = TextSendMessage(
            text='文字訊息',
           )
        
        line_bot_api.reply_message(event.reply_token,訊息變數)


  • 回傳圖片(ImageSendMessage)
    語法:
        訊息變數 = ImageSendMessage(
            original_content_url = 原始圖片網址,
            preview_image_url = 預覽圖片網址
           )
        
        line_bot_api.reply_message(event.reply_token,訊息變數)


  • 回傳貼圖(StickerSendMessage)
    貼圖ID可以看這邊:[https://developers.line.biz/en/docs/messaging-api/sticker-list/#sticker-definitions]
    語法:
        訊息變數 = StickerSendMessage(
             package_id='套組ID',
             sticker_id='貼圖ID'         
             )
        
        line_bot_api.reply_message(event.reply_token,訊息變數)


  • 回傳多個訊息
    將訊息變數設為串列,就能一次回傳多個訊息~
    語法:
        訊息變數 = [
            訊息一,
            訊息二、
            .....
        ]
        
        line_bot_api.reply_message(event.reply_token,訊息變數)


  • 回傳位置(LocationSendMessage)
    這個方法是直接顯示指定經緯度的Google地圖。
    語法:
        訊息變數 = LocationSendMessage(
            title = 標題,
            address = 地址,
            latitude = 緯度,
            longitude = 經度  
        )
        
        line_bot_api.reply_message(event.reply_token,訊息變數)


  • 回傳快速選單(QuickReply)
    語法:
         訊息變數 = 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='發生錯誤!'))   
       

這樣我們就做好基本的幾個訊息回傳功能啦!是不是很簡單呢~~~
學會這些功能後,就可以根據想做的機器人類型去變化回傳的訊息種類,後面還會教更多不同的功能,也可以結合這些回傳去跟使用者互動~
那麼話不多說,明天也繼續跟我們一起練習吧!٩(ˊᗜˋ*)و✧*。


上一篇
DAY 7 回話機器人(鸚鵡LINE Bot)與ngrok
下一篇
DAY 9 LINE Bot 進階互動功能(上篇)
系列文
30天建構出一個簡單 LineBot 機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言