第12 屆iT邦幫忙鐵人賽系列文章 (Day3)

先來看看文件

在 Line 的文件裡有定義 Webhook Event Objects 傳過來的 JSON 的結構

可以看到它會傳一個 events 過來,裡面包含幾個 properties

replyToken : 用來回覆該使用者的Token type:使用者傳送訊息的類型 (message/video/sticker…) mode: Channel是否有效 source:使用者/群組的資訊 … 以上都可以從上方的文件去查看 properties 的用途

將 Line Event Request 轉成 C# Class

在上一篇我們 Web Api 是用 dynamic 來接收 Request,在VS有個功能是很快的把 JSON 結構轉成 C# 的 Class,這個技巧在串接異質 Api 蠻常用的,或者是可以用 json2csharp.com 這種服務來處理。

複製官方的JSON Sample,在 VS 點選編輯 => 選擇性貼上 => 貼上 JSON

結果會長這樣,通常我不會在一個 .cs 放多個類別,但為了文章好呈現故直接貼上來,拆一拆檔案的工也還好

做點加工,把 Event 的 Type 一些文件改成 C# 的 Enum,讓開發更順暢,新增一個 WebhookEventType.cs

public enum WebhookEventType
{
    Message,
    Follow,
    Unfollow,
}

Event class 就會改為如下

public class Event
{
    public WebhookEventType type { get; set; }
    public string replyToken { get; set; }
    public WebhookEventSource source { get; set; }
    public long timestamp { get; set; }
    public string mode { get; set; }
    public LineMessage message { get; set; }
}

再做一次,我們將訊息的類型也定義 LineMessageType.cs

public enum LineMessageType
{
    text,
    sticker,
    image,
    video,
    audio,
    template,
    flex,
    location
}

Message Class 就會改為如下

public class Message
{
    public string id { get; set; }
    public string type { get; set; }
    public LineMessageType text { get; set; }
}

試著從Line Develop Console後台,將 Chatbot 加入好友後,發送第一個訊息,並將 Controller 的 Api 的參數改成剛剛建立的 WebhookEvent Class,可以開始用強型別開發了

針對不同事件,做不同流程

讓 Controller 不要那麼複雜,我們新增一個 LineBotApp.cs,定義一個 RunAsync來處理各種事件

有型別的好處就是在switch(e.type)按下 VS 就會自動展開所有 Enums

針對不同事件,加入實作的 function,我們用 virtual 保留未來繼承這個 LineBotApp.cs 可以 override 的彈性

OnMessageAsync 可以再針對使用者所傳的類型處理

其他 Events

上面實作了 Message/Follow/UnFollow的Event,還有其他事件,為求簡單,故等我們有必要用到的時候再來實做它吧

Unsend event:當使用者收回訊息的時候 Join event:當 Bot加入群組的時候 Leave event:當 Bot離開群組的時候 Member join event:當有新成員加入群組的時候 Member leave event:當有新成員離開群組的時候 Postback event:當使用者有點選Bot設計的流程按鈕的事件 (這應該會蠻常用) Video viewing complete event:影片看完時候的 Beacon event:觸發Beacon的時候 Account link event:當使用者Line帳號跟Bot連接時 (通常用於異質系統與Line Bot連結) Device link event:裝置連結 ( IoT相關,Line Things API) Device unlink event:裝置取消連結 ( IoT相關,Line Things API)

懶人包,本次學到了什麼?