2017年12月23日 星期六

使用C#開發LineBot(16) – 讓 WebHook 開發更輕鬆

從我們釋出第一版的LineBotSDK開始,套件的建立最主要的精神就只有一個,讓我們家的.NET開發人員,能夠用更簡單、輕鬆、便利的方式來開發Linebot。

在這個最主要的目標之下,我們再盡可能地兼顧開發自由度、以及開發的架構、可維護性、與持續更新和相容性…等議題。

也因此,在最近撰寫了數不清的line bot和蒐集了一些用戶實際的反饋之外,我覺得可以將整個LineBot WebHook的開發繼續簡化,讓有興趣進入這個領域的初階開發人員,能夠更輕鬆沒有負擔的踏入開發。

因此,我們從0.6.4-beta1這個版本開始,加入了LineWebHookControllerBase這個類別,讓開發人員可以在幾行的程式碼內完成一個Line bot WebHook的設計。

像是底下這樣:

你會發現,我們把原本的APIController換成了LineWebHookControllerBase(第10行),這會讓開發人員可以少寫很多程式碼,例如抓取http post data後Parins並轉換JSON成strong type物件的工作(白話:取得用戶傳給Line bot的message),就由我們的LineWebHookControllerBase這個類別代勞了,你只需要透過20行的this.ReceivedMessage即可抓取到需要的物件。

同樣的,如果要push或reply,也可以透過像是this.PushMessage或this.ReplyMessage這樣的Method來完成(像是第22行)。

你大概也已經發現,ChannelAccessToken的部分我們可以在第18行透過this.ChannelAccessToken這個屬性設定一次即可。甚至你所幸乾脆不撰寫在程式碼裡面也行,LineWebHookControllerBase會自動抓取Web.COnfig / AppSettings 中 ChannelAccessToken這個Key的Value(如果有的話),如此一來,開發人員就更無須特別撰寫相關的code了。

整體來說,應該降低了不少開發難度。

如果你從來沒有寫過任何Line Bot WebHook,可以從底下介紹開始。

首先,請先開啟VS2017/2015,接著建立一個空的aps.net web專案:

.net版本建議 4.5.2以上,底下畫面記得務必選擇Empty與WebAPI:

建立好專案之後,請先在專案上加入Nuget,請務必選用LineBotSDK 0.6.4 beta 1以上版本:

完成後,你就可以在Controller資料夾中,按下滑鼠右鍵,新增一個WebAPI Controller:

在底下畫面中請選擇Web API 2 Controller – Empty:

命名時請務必保留Controller字尾:

完成後,請把VS自動幫我們產生的ApiController換掉,改成 isRock.LineBot.LineWebHookControllerBase:

並且在其中加上底下這樣的程式碼,他包含了抓取用戶傳來的訊息以及做基本的Echo惠應,一個能回應用戶的最基本的Line bot WebHook就完成囉:


完成後,你只需將該WebAPI 網站發布到網際網路上可連結的位置,並取得其URL(endpoint,例如本例應該是 https://你的domain/api/SimpleWebHook )後設定在bot的後台,即可讓bot生效囉:

更完整的範例程式碼在:
https://github.com/isdaviddong/SimpleLineWebHook

------------------
相關課程:http://www.studyhost.tw/NewCourses/LineBot
電子書:http://studyhost.blogspot.tw/2017/12/line-bot.html
LineBotSDK:https://www.nuget.org/packages/LineBotSDK

如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

17 則留言:

Ken哥 提到...

Daivd 老師,

所以.NET Framework 4.0 沒辦法使用此nuGet LineBOTSDK?
有別的SDK可用嗎?

Ken哥 提到...

David 老師您好,

我已升級到Framework 4.7了,下載了您的範本,
publish到一個https網站測試,利用Line對webhook的verify功能,
出現An error occurred when sending the webhook.

對它傳訊息也沒回應,請問可能是哪裡出錯了?

洪憲明 提到...

我也有出現,求解答,乾恩

isDavid 提到...

請留意,一定要下
[Route("api/SimpleWebHook")]

isDavid 提到...

另外,由於Line的測試訊息的ReplyToken是有問題的,因此這個範例在Line verify的時候會有exception,但正常使用是OK的。建議你填入36行Admin Uid,就可以收到訊息了。

Ken哥 提到...


[Route("api/SimpleWebHook")]加了

AdminUserID 也加了

用Line呼叫,就是沒有回應,也沒有錯誤訊息,應該如何debug才好?

Ken哥 提到...


終於測通了,老師說得沒錯,感謝!

另個問題: 程式一直沒執行catch,不知道Admin Uid是指看得到或隱藏的那個id?例如"Uced789004dsff4fhs...."?

洪憲明 提到...

Admin Uid可以是UserID,可以到網頁上line機器人設定最下方的Other>Your user ID 查到所屬ID唷
另外,測試多天終於把問題找出來解決了,機器人正常使用中,感謝David 老師提供的資料 ^ ^

Ken哥 提到...

洪大大,

不知道你用這新版的SDK是否測過pushMessage?
我一直send不出去, 請指教, 感恩.

好像有些舊功能也還沒過來,例如:group,room,UserInfo...。

洪憲明 提到...

依照David老師教學設定,目前有提到的功能都正常,測試你說的SDK版本問題,由0.6.1更新至0.6.6,push,room,reply功能都正常唷,你send不出去原因有檢查一下channelaccesstoken或是userid正確嗎?

isDavid 提到...

@ken,

也要檢查一下你的line bot是否申請成Free而非developer trial,如果是free,是不支援push API的唷。

Richard 提到...

David 老師好,
我在使用 ImageMapMessage時候,怎樣都是顯示「無法讀取照片」,baseurl和圖檔檔名都都按照規定設定,目錄下的圖檔沒有副檔名,請問一下有Sample code可以參考嗎?? 謝謝

isDavid 提到...

@Richard,

請參考底下這段code:

imagemapMessage.baseUrl = new Uri($"https://arock.blob.core.windows.net/test3/");

source:
https://github.com/isdaviddong/LineImageMapMessage/blob/master/WebApplication1/default.aspx.cs

原因是,Azure Web Site不支援沒有副檔名的file,因此你會看到我code裡面是把檔案放到 azure blob上。

Richard 提到...

謝謝老師,您這麼一說才知道Azure web不支援沒有副檔名的問題,目前1040解析度的圖片運作一切正常

但是產生另外一個問題:如果我的圖片寸尺變為 700x700的時候,也有上傳700的圖檔,呈現的結果imageMap的點選座標正常,但是底圖還是被迫使用1040x1040的圖片,所以會有被裁切的問題,這個部份哪裡有錯誤呢?
要再請教老師一下了,謝謝

James 提到...

David 老師好,
想請教要如何將 Image Carousel Template加入機器人中

isDavid 提到...

下一版SDK更新時會加上,目前還沒支援。

Wen 提到...

David 老師好,
pushMessage 有提供ImageMapMessage功能
想請問老師如何將ImageMapMessage運用在Reply api或者是加入ReplyTemplateMessage
目前使用0.6.9-alpha版本,謝謝