使用C#開發LineBot(4) - 透過asp.net輕鬆建立Line機器人WebHook

如果你申請好了新版的Line Messaging API帳號。(申請位置位於https://business.line.me/zh-hant/services/bot),就可以建立一個Line對談機器人了,你要讓你的Line機器人能夠透過程式來回覆用戶的訊息,那關鍵當然是底下這個WebHook:

這個WebHook的設定位置可以從Line Messanging的管理介面進入:

一但你設定好WebHook,所有從用戶傳送給LineBot的訊息,就會傳送到這個WebHook,而你透過程式碼寫的這個WebHook,在接收到這個訊息之後,就可以依照用戶的訊息內容,來回應(回覆)不同的訊息給用戶。這就是一個Line對談機器人最基本的架構:

簡單的說就是,你只要寫一個WebHook(C#開發人員可以用WebAPI寫),放上網站,他就是一個網址,而你的機器人與用戶對談時,Line會把這個訊息封包傳送到你的WebHook這個網址,你可以在接受到訊息封包後進行剖析,取得用戶說的話(或是傳送來的圖片),透過後端的對談邏輯(可以用以前我們介紹過的LUIS來進行文字的斷字和語意分析)判斷,然後把該回覆的訊息組出來回覆給用戶,大致上是這樣。

所以你不難理解,那個WebHook顯然是我們第一個要實做的東西。其實開發起來很簡單。首先,請先用Visual Studio 2015建立一個Web專案:

在下一個畫面,專案範本請選擇Empty,但記得勾選底下的WebAPI:

完成後的專案框架大概是底下這樣,請在Controllers資料夾底下新增一個Controller:

我們先叫他LineChatController好了:

完成後大概是底下這樣:

接著我們就可以開始寫程式了,但別忘了,在寫程式之前,請先引用LineBotSDK這個Nuget Package:
SNAGHTML334df3fe

完成後,請直接將底下這段程式碼填入你的WebAPI Controller,請留意你要自行替換掉Channel Access Token:

所謂的Channel Access Token基本上就代表著你的Line Messanging,你在程式碼中想要透過你的Bot回覆或發送訊息,都需要這個Channel Access Token,他可以在你的Line Messanging WebHook管理站台上找到(第一次進來是空的,請按下Issue鈕就會出現) :

把程式碼調整好(Channel Access Token換好)之後,請將此程式(其實就是一個網站),建置(Build)後發佈(Publish)到某個站台,由於該網站必須支援https,因此用windows azure web app是一個不錯的選擇。

上傳完成之後,可以將你網站的URL,填入Line管理後台的WebHook URL: (這裡請注意,由於我們剛才的Controller取名為LineChat,因此你輸入的位置必須是 https://你的網站domain/api/LineChat ,例如底下這樣):

輸入完畢儲存後,你就可以測試你的LineBot了,還記得嗎? 剛才我們的程式碼當中,在第11行的地方取得用戶訊息的封包,將其剖析後,取得ReceivedMessage物件(第13行),接著找到用戶說的訊息,組出一段Echo的文字(16行),最後透過18行的程式碼回覆,程式碼就只有這樣。

我們試試看,當您加入這個bot做為好友(QR Code在管理站台上),對他說test,結果如下:

其實非常的簡單,對吧。

當然,上面程式碼還有很多不完善的地方,目前也都偵測不到傳送照片、加入或取消好友…等行為,不過沒關係,要達成其實也不難,我們後面再找時間跟大家介紹。

相關課程: http://www.studyhost.tw/NewCourses
--------------------
btw, 有時候blog的留言我會很晚才看到,如果有問題或需要討論,請用底下網址上FB囉…
https://www.facebook.com/DotNetWalker/posts/1308046072568296

留言

MK表示…
感謝您的教學與範例~
Unknown寫道…
請問網站是否可以使用Microsoft Azure app 以外的方式? 因為沒有信用卡 無法註冊Azure
isDavid寫道…
@Liang,
只要是網站就行...
steven 張寫道…
作者已經移除這則留言。
Unknown寫道…
作者已經移除這則留言。
Unknown寫道…
不好意思 想詢問一下 為何我的microsoft azure 找不到 APP service 下拉選項
isDavid寫道…
@郭俊佑,

除非你的azure沒有active的訂閱,否則應該會有。

可以參考:
https://channel9.msdn.com/Shows/NET-Walker-5/SSLAzure-WebApp
Unknown寫道…
HI isDavid 那將網頁丟到0000webhost 也可以使用網頁嗎?
isDavid寫道…
沒試過0000webhost,但照說任何網站都可以。
Unknown寫道…
作者已經移除這則留言。
Unknown寫道…
WEBOOK 那個網站 建議用哪一種 城市要如何放至網站上(不好意思問了這樣簡單的問題
匿名表示…
請問當我使用Linebotsdk 後api 出現

Line 1: <%@ Application Codebehind="Global.asax.cs" Inherits="LineBot.WebApiApplication" Language="C#" %>

這是什麼問題呢 ?
M.H寫道…
請問要如何deploy到heroku上,謝謝。
turtle寫道…
我用azure 但設定webhook出現The webhook returned a abnormal HTTP status code
怎問azure要怎麼設定?
isDavid寫道…
@turtle,

或許可以參考底下這個影片:
https://channel9.msdn.com/Shows/NET-Walker-5/Azure-Web-AppLineBot-Webhook
rogerroan寫道…
Line 1: <%@ Application Codebehind="Global.asax.cs" Inherits="LineBot.WebApiApplication" Language="C#" %>
的問題請確認iis資料夾global.asax是否少了對應的global.asax.cs,建議把所有release的檔案手動蓋過去,不知道為什麼套了這個sdk之後發行變得怪怪的
isDavid寫道…
我猜測可能是引用到相依的.dll是你專案裡面沒有加入的,使用該套件時,請務必加入WebAPI並且最低使用.net 4.5.2。

如果還是有問題,建議你開一個空專案測試看看。
阿雄寫道…
Line 1: <%@ Application Codebehind="Global.asax.cs" Inherits="LineBot.WebApiApplication" Language="C#" %>
我也是出現這個問題
發行到Azure後就會這樣
在本機端執行不會有這個問題
想請問這樣有解嗎?

這個網誌中的熱門文章

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

精彩(且驚人)的Semantic Kernel入門範例

使用Semantic Kernel 建立自然語言請假系統

在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統

專業的價值...