使用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,你只需要把上面的幾個參數填進去就行,分別是:
- channelAccessToken: Linebot的Channel Access Token
- AdminUserId: 你建立Linebot的那個帳號(Admin)的UserId
- LuisAppId: LUIS App的App ID
- LuisAppKey: LUIS App的Key
- 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專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。
留言
可以出個範例嗎?? 感謝^^
API 網址: https://mis.ericsoft.com.tw/api/TestLUIS
'/' 應用程式中發生伺服器錯誤。
遠端伺服器傳回一個錯誤: (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
.........
堆疊追蹤:
[Exception: PushMessage API ERROR: {"message":"Access to this API is not available for your account"}]
顯示是權限的問題, 我是使用Line developers Channel settings 的 Your user ID 作為程式中的AdminUserId, 請問有可能是那裡沒設對?
舉例來說以下我收到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,還是還有其他特別的限制?
麻煩您回答了,謝謝。
因為使用的API是不一樣的
使用replyToken的reply只能使用一次,而且必需要在幾秒內回覆,userid是使用push,可以在任何時間點主動發送訊息出去。
這兩者最主要的差別就是在收費。
謝謝,回答的很完整唷...