使用C#開發Linebot(27) - 在發送的訊息中加上Quick Reply

LINE在2018/7月底推出了Quick Reply機制,他可以讓使用者可以更輕鬆的回覆Line bot所發送的問題,官方細節你可以參可底下連結:
https://developers.line.me/en/news/2018/07/31

過去,我們要讓用戶回答Line bot的某個問題,除了透過自然語言(讓用戶隨意打)的方式,就是透過Template Message,讓line bot跳出一整塊大面積的選單訊息,像是:

但這樣的Tempalte Message佔用了很大一塊版面,每塊卻又只能最多放四個選項,有些時候顯得大而無當。特別是若你其實只是要用戶選擇一個簡單的答案時,根本不需要像上面這樣的Template Message又是大圖又是標題的。

這時,你可以採用底下這樣的QuickReply來解決:

Quick Reply 就是上圖Menu上方的小小選項(Action),最多可以出現13個Action,並且支援postback, message, datetime picker, camera, camera roll等各種action。

要實現這樣的功能很簡單,請參考底下這樣的程式碼:

過去我們在發送訊息的時候,也是採用PushMessage,而為了支援QuickReply的功能,我們額外建立了一個TextMessage類別(第2行),你可以直接建立該物件,並指定要顯示的訊息。

接著,透過該物件的quickReply屬性,你可以在items集合中以Add方法加入想要新增的QuickReply item。

在上面例子中,我們新增了三個都是一般的QuickReplyMessageAction,該action的行為如同先前介紹過在TemplateMessage中的MessageAction一般,就是顯示一個標題,執行結果如下:

圖示則是第三個參數 new Uri(…)所指定的,別忘了必須是https並且為.png格式。

如此一來,用戶就可以直接點選上面的『特休』、『事假』、『病假』其中之一。點選時的行為就等同於用戶說了『特休』、『事假』、『病假』這幾個字一般,這就是QuickReplyMessageAction所呈現的功能。

而更精彩的是,除了QuickReplyMessageAction之外,前面提到過,還有可以讓用戶直接選擇時間日期的QuickReplyDatetimePickerAction,支援地圖位置選擇的QuickReplyLocationAction,支援相機的QuickReplyCameraAction與QuickReplyCamerarollAction…,這些功能可以讓你的Line bot,直接要求用戶提供座標位置、照片、輸入時間日期…等,像是:

如此一來,就不用全部仰賴自然語言輸入了,不錯吧,快試試看囉…

要透過LineBotSDK使用此功能,別忘了要升級到 0.8.2以上的版本唷。更詳細的教學影片請參考我們的線上課程囉。

------------------
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
相關課程:http://www.studyhost.tw/NewCourses/LineBot
線上課程:https://www.udemy.com/line-bot/
更多內容,請參考電子書:https://www.pubu.com.tw/ebook/103305
LINE Bot實體書籍:https://www.tenlong.com.tw/products/9789865020354
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

留言

Unknown寫道…
老師好
有兩個問題請教
我試著用您提供的範例 在LineChatController.cs裡加入
public class LineChatController : ApiController
{
[HttpPost]
public IHttpActionResult PostAA()
{.......................}
}
1.這樣是代表所有與LINE溝通都是透過這個方法(name=PostAA)嗎?
2.可以有多個不同的method嗎?例如再多一個
public IHttpActionResult PostBB()
{.......................}
謝謝~~
isDavid寫道…
1.是的。
2.不太建議,原因是WebAPI就是單一入口,如果你想擬出多個"事件"的狀況,可以在POstAA裡面,判斷不同的LineHookEvent去Run不同的其他Method,即可。

但依照LineEvent去切Method不一定很好,因為一個對談行為,常常會跨不同的Event,例如先收到Message Event然後收到postback event,然後完成一件事情...這樣,導致你切不同的Method會讓一個段談的code散落在不同的Method...可能增加管理上的困難。
匿名表示…
老師,不好意思。

這個方法是不是還不能用在reply上面?
飛馬寫道…
老師您好 :
感謝您所提供的Linebotsdk , 目前正在測試中。

其中有個問題是,在安裝好 Linebotsdk 0.8.3的版本後,要在controllers的目錄按右鍵要新增一個控制器時,
卻發現按右鍵後,選單上卻沒有出現 "控制器" 的選項。請問一下是發生了甚麼問題???
我用的是VS2012。
Google一下,說是用
{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}

可是也沒用也,求解!!!
Unknown寫道…
老師您好 :
感謝您所提供的Linebotsdk , 發現己無ImagemapMessage.

想請教一下新版是否移除?
isDavid寫道…
@飛馬,

VS2012我這邊已經沒有這刻環境可以測試了,建議您可以先升級到VS2017試試看。
一般來說,新增項目裡面沒有 Controller 是因為專案範本不符,或是沒有引入相關的Package,開發工具就不會認為你要新增Controller。
isDavid寫道…
@Ruby,

有唷,都還在啊...
你可以參可底下連結圖片:
http://arock.blob.core.windows.net/blogdata201812/09-124134-f70d1533-5312-4afe-81ec-d90739038f6d.png
Unknown寫道…
老師您好

我在使用QuickReply時,在回覆應該可以這樣用吧,但是怎麼測都無法測出來,請問是不是我哪裡弄錯了?

//建立一個TextMessage物件
isRock.LineBot.TextMessage m = new isRock.LineBot.TextMessage("請在底下選擇一個選項");

//在TextMessage物件的quickReply屬性中加入items
m.quickReply.items.Add(new isRock.LineBot.QuickReplyMessageAction( $"一般標籤", "點選後顯示的text文字"));

Utility.ReplyMessageWithJSON(replyToken, m.ToJSON(), ChannelAccessToken);
isDavid寫道…
不需要用ReplyMessageWithJSON(...)方法,直接用
bot 物件的 PushMessage(m)
就好...
Unknown寫道…
測試OK了,感謝老師的幫忙!!!
Shang寫道…
老師,您好

我想問一下如何得到QuickReplyDatetimePickerAction的postback資料呢??

是否與您所製作的第13章(使用C#開發LineBot(13) – 使用Date Time Picker讓用戶輸入日期資訊)大同小異呢?
isDavid寫道…
@Shang,

是的,範例在底下這邊,
https://github.com/isdaviddong/Linebot-Demo-SendMultiMsgAtOnce
記得follow和star,這樣以後有新的範例你才會收到唷。
匿名表示…
老師,請問如何在richmenu中叫出位置資訊、聯絡資訊或開啟相機?謝謝

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

使用 Airtable 在小型需求上取代傳統資料庫

專業的價值...

周末讀書會 - 一如既往