使用C#開發Linebot(20) - 不寫一行code完成Linebot的LUIS串接

前陣子,介紹過如何No Code完成Line bot的開發,如果你錯過了,可以看這裡

No Code當然不是一行程式碼都沒有,只是,程式碼骨架我幫你寫好了。你只需要輕鬆地填入相關的Channel Access Token等資訊即可。

而很多同學不滿足,在我們介紹了LUIS(Language Understanding Intelligent Services)之後,當然會想,能不能一行程式碼都不寫,就將Linebot的Web Hook串接到LUIS,完成一個能夠更用戶進行自然語言對談的Chat bot?

可以嗎? 沒問題,有人開口就做給你。

請打開VS2015/VS2017,然後建立一個空的Web專案:

這個畫面似曾相識? 當然,前面我們做過啊。請務必依舊選擇.net framework 4.5.2以上。然後,在下一個畫面中,直接選擇Empty(空)的範本類型,然後請務必(一定一定要)勾選WebAPI:

就這樣,VS2015會幫你建立好一個空專案,,接著,重點來了,請安裝一個nuget套件:

前面做過了,我知道,再一次加深印象,在Nuget套件安裝畫面上,選擇Studyhost.Example.Linebot套件:

按下安裝鈕,安裝完成後,你會看到這個套件已經幫你把程式碼都寫好了。只不過,跟上次不同,這次請把焦點放在TestLUISController:

你會發現,TestLUISController這支WebAPI Controller,就是一隻寫好了的支援LUIS的Line WebHook,你只需要把上面的幾個參數填進去就行,分別是:

  1. channelAccessToken: Linebot的Channel Access Token
  2. AdminUserId: 你建立Linebot的那個帳號(Admin)的UserId
  3. LuisAppId: LUIS App的App ID
  4. LuisAppKey: LUIS App的Key
  5. Luisdomain: LUIS App的domain

上面關於LUIS的幾個參數怎麼來呢?  如果你還對我們介紹過的LUIS有印象,應該會知道LUIS有一個Publish之後的會出現的Enpoint:

其中就有你需要的所有資訊了。

把相關的資訊填入程式碼之後,不用做任何事情,只需要發佈到Azure Web App站台上,並且到Line bot的後台設定一下WebHook,記得位置是 https://你的網站/api/TestLUIS 喔,類似底下這樣:

完成後,你可以試試看,你的Linebot已經可以用你訓練好的LUIS服務做基本的對談了:

由於,我們在連結的LUIS App中,設計了『客戶點餐』和『客訴』兩個intent,因此當用戶跟Line bot點餐的時候,Linebot認得用戶點餐的語句,並且可以分辨出漢堡但(即便『蛋』寫成『但』),且該bot也可以分辨出『你們服務態度很差唷』這句話是『客訴』這個Intent,而非點餐。

輕鬆愉快,透過我們的Nuget套件中的範本,你不用寫任何一行程式碼,只需要設計好LUIS App,並且把該LUIS App的ID, Key, Domain等資訊填入程式碼中,就可以完成支援LUIS的WebHook囉,至於裡面的程式碼究竟寫了什麼呢? 怎麼完成LUIS整合的功能?

請看,完整程式碼如下:

其實非常簡單,我猜不太需要解釋了,如果有甚麼地方需要說明,請留言告訴我囉。

------------------
相關課程:http://www.studyhost.tw/NewCourses/LineBot
電子書:http://studyhost.blogspot.tw/2017/12/line-bot.html
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

留言

匿名表示…
老師~想請問一下,LUIS可否結合寫入google試算表做紀錄呢??
可以出個範例嗎?? 感謝^^
isDavid寫道…
可以,但範例要等有空唷 :)
匿名表示…
謝謝老師~我會持續關注的
william表示…
您好,感謝老師貢獻了那麼多的知識,讓我受惠良多。有個問題請教, 我按照網頁上的步驟,完成API建置, Webhook URL 驗証也成功了, 但我測試LINE時, 卻都已讀不回, 請問有什麼方式可以查出問題?或可能的問題有那一些?
API 網址: https://mis.ericsoft.com.tw/api/TestLUIS
william表示…
同上一個問題, 在debug時, 按Push Text Message 出現了下列的錯誤

'/' 應用程式中發生伺服器錯誤。
遠端伺服器傳回一個錯誤: (403) 禁止。
描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

例外狀況詳細資訊: System.Net.WebException: 遠端伺服器傳回一個錯誤: (403) 禁止。

原始程式錯誤:


行 22: {
行 23: var bot = new Bot(channelAccessToken);
行 24: bot.PushMessage(AdminUserId, $"皜祈岫 {DateTime.Now.ToString()} ! ");
行 25: }
行 26:

原始程式檔: D:\Develop\TestLUIS\TestLUIS\default.aspx.cs 行: 24

.........
william表示…
同上一個問題的錯誤訊息

堆疊追蹤:
[Exception: PushMessage API ERROR: {"message":"Access to this API is not available for your account"}]
顯示是權限的問題, 我是使用Line developers Channel settings 的 Your user ID 作為程式中的AdminUserId, 請問有可能是那裡沒設對?
william表示…
原來是Plan 要改申請為 For Developer , PushMessage權限的問題就解決了, 現在只剩下 ReceivedMessage 訊息已讀不回的問題
匿名表示…
請問如何把這個程式發佈到Azure Web App站台上?
匿名表示…
是指把程式放到 App Service Editor上嗎?
Unknown寫道…
想請問一下,為何LINE MESSAGE API需要有replyToken跟userid(groupid)
舉例來說以下我收到line api message的json訊息
"{
destination=U4226ff857ea55a3f32f83c7be97c70e5, events=[{replyToken=8ed3de3949694751bc8d9eaf7ce53944, source={groupId=C666cd8aa2e52ccbf1bf1f26a5083a381, type=group,
userId=Ude277baed9191d33705cb6e436ad06bd}, type=message,
message={id=9255674571742, text=你好, type=text}, timestamp=1.548609042276E12}]
}"
我知道replyToken有時間性,好像需要在收到訊息後短時間內做回覆才有用(否則就失效),但是既然已經有userid(groupid),那回覆訊息就用userid(groupid)就好?為何還需要replyToken,還是還有其他特別的限制?
麻煩您回答了,謝謝。
阿豪寫道…
to Unknown
因為使用的API是不一樣的
使用replyToken的reply只能使用一次,而且必需要在幾秒內回覆,userid是使用push,可以在任何時間點主動發送訊息出去。
這兩者最主要的差別就是在收費。
isDavid寫道…
@阿豪,

謝謝,回答的很完整唷...

這個網誌中的熱門文章

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

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

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

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

專業的價值...