[Day 6] 讓 C# 也可以很 Social — .NET 6 C# 與 Line Services API 開發 — Webhook events 介紹(二)

APPX
appxtech

--

Hihi 各位好,上一篇我們建立了 6 種的 webhook event,這一篇將會再介紹 常用的 4 種 events,其實總共有 15 種 events ,剩下的 5 種事件不容易展示,一般人碰到的機會應該也不會太多,所以本系列就先略過,有興趣的人 再留言讓我知道囉。

<<回顧上一篇<<

  • 今天會介紹到的 Webhook event 有 4 種
  1. Member Join & Member Leave
  2. Postback
  3. Video viewing complete

一、Member join event & Member leave event

  • 官方文件內容
  1. Member Join Event
2

2. Member Leave Event

  • 觀察可發現,這兩個 event 內的結構皆相同,只差在上層變數名稱一個叫 joined,另一個叫 left,所以只需要宣告一種 class ,然後在 WebhookEventObjectDto 宣告兩個變數名稱即可。
  • 在 WebhookEventsDto 中宣告 MemberEventDto
public class MemberEventDto
{
public List<SourceDto> Members { get; set; }
}
  • WebhookEventDto 宣告 Joined & Left 變數
public class WebhookEventDto
{
// -------- 以下 common property --------
.
.
.
// -------- 以下 event properties--------
public string? ReplyToken { get; set; } // 回覆此事件所使用的 token
public MessageEventDto? Message { get; set; } // 收到訊息的事件,可收到 text、sticker、image、file、video、audio、location 訊息
public UnsendEventDto? Unsend { get; set; } //使用者“收回”訊息事件

public MemberEventDto? Joined { get; set; } // Memmber Joined Event
public MemberEventDto? Left { get; set; } // Member Leave Event
}

二、Postback event

  • Postback 會是一個很常用到的事件,在設計 Line Bot 互動內容時,會有一個 action 叫做 Postback action,可以在 postback.data 的屬性中帶任意字串,點擊觸發後 Line 就會產生此 Postback 事件並傳給我們的伺服器。
  • 官方文件內容
  • 在 WebhookEventsDto.cs 中宣告以下兩個 Class
public class PostbackEventDto
{
public string? Data { get; set; }
public PostbackEventParamDto? Params { get; set; }
}

public class PostbackEventParamDto
{
public string? Date { get; set; }
public string? Time { get; set; }
public string? Datetime { get; set; }
public string? NewRichMenuAliasId { get; set; }
public string? Status { get; set; }
}
  • WebhookEventDto 宣告 Postback 變數
public class WebhookEventDto
{
// -------- 以下 common property --------
.
.
.
// -------- 以下 event properties--------
public MessageEventDto? Message { get; set; } // 收到訊息的事件,可收到 text、sticker、image、file、video、audio、location 訊息
public UnsendEventDto? Unsend { get; set; } //使用者“收回”訊息事件
public string? ReplyToken { get; set; } // 回覆此事件所使用的 token

public MemberEventDto? Joined { get; set; } // Memmber Joined Event
public MemberEventDto? Left { get; set; } // Member Leave Event
public PostbackEventDto? Postback { get; set; } // Postback Event
}

三、Video viewing complete event

  • 後面會介紹傳送影片訊息的方式,而在傳送影片訊息時可以設定其 trackingId 的屬性,當好友看完這部設定過的影片時,就會產生此事件回傳給我們伺服器,這邊就先建好這個事件的 class 後面帶到影片訊息時再一起測試~。
  • 官方文件
  • 在 WebhookEventsDto.cs 中宣告以下 Class
public class VideoViewingCompleteEventObjectDto
{
public string TrackingId { get; set; }
}
  • WebhookEventDto 宣告 VideoPlayComplete 變數
public class WebhookEventDto
{
// -------- 以下 common property --------
.
.
.
// -------- 以下 event properties--------
public MessageEventDto? Message { get; set; } // 收到訊息的事件,可收到 text、sticker、image、file、video、audio、location 訊息
public UnsendEventDto? Unsend { get; set; } //使用者“收回”訊息事件
public string? ReplyToken { get; set; } // 回覆此事件所使用的 token

public MemberEventDto? Joined { get; set; } // Memmber Joined Event
public MemberEventDto? Left { get; set; } // Member Leave Event
public PostbackEventDto? Postback { get; set; } // Postback Event
public VideoViewingCompleteEventDto? VideoPlayComplete { get; set; } // Video viewing complete event

}

完整的 WebhookEventsDto.cs

namespace LineBotMessage.Dtos
{

public class WebhookEventDto
{
// -------- 以下 common property --------
public string Type { get; set; } // 事件類型
public string Mode { get; set; } // Channel state : active | standby
public long Timestamp { get; set; } // 事件發生時間 : event occurred time in milliseconds
public SourceDto Source { get; set; } // 事件來源 : user | group chat | multi-person chat
public string WebhookEventId { get; set; } // webhook event id - ULID format
public DeliverycontextDto DeliveryContext { get; set; } // 是否為重新傳送之事件 DeliveryContext.IsRedelivery : true | false
// -------- 以下 event properties--------
public MessageEventDto? Message { get; set; } // 收到訊息的事件,可收到 text、sticker、image、file、video、audio、location 訊息
public UnsendEventDto? Unsend { get; set; } //使用者“收回”訊息事件
public string? ReplyToken { get; set; } // 回覆此事件所使用的 token

public MemberEventDto? Joined { get; set; } // Memmber Joined Event
public MemberEventDto? Left { get; set; } // Member Leave Event
public PostbackEventDto? Postback { get; set; } // Postback Event
public VideoViewingCompleteEventDto? VideoPlayComplete { get; set; } // Video viewing complete event
}


// -------- 以下 common property --------

public class SourceDto
{
public string Type { get; set; }
public string? UserId { get; set; }
public string? GroupId { get; set; }
public string? RoomId { get; set; }
}

public class DeliverycontextDto
{
public bool IsRedelivery { get; set; }

}


// -------- 以下 message event --------

public class MessageEventDto
{
public string Id { get; set; }
public string Type { get; set; }

// Text Message Event
public string? Text { get; set; }
public List<TextMessageEventEmojiDto>? Emojis { get; set; }
public TextMessageEventMentionDto? Mention { get; set; }

// Image & Video & Audio Message Event
public ContentProviderDto? ContentProvider { get; set; }
public ImageMessageEventImageSetDto? ImageSet { get; set; }
public int? Duration { get; set; }

//File Message Event
public string? FileName { get; set; }
public int? FileSize { get; set; }

//Location Message Event
public string? Title { get; set; }
public string? Address { get; set; }
public double? Latitude { get; set; }
public double? Longitude { get; set; }

// Sticker Message Event
public string? PackageId { get; set; }
public string? StickerId { get; set; }
public string? StickerResourceType { get; set; }
public List<string>? Keywords { get; set; }
}
public class TextMessageEventEmojiDto
{
public int Index { get; set; }
public int Length { get; set; }
public string ProductId { get; set; }
public string EmojiId { get; set; }
}
public class TextMessageEventMentionDto
{
public List<TextMessageEventMentioneeDto> Mentionees { get; set; }
}
public class TextMessageEventMentioneeDto
{
public int Index { get; set; }
public int Length { get; set; }
public string UserId { get; set; }
}
public class ContentProviderDto
{
public string Type { get; set; }
public string? OriginalContentUrl { get; set; }
public string? PreviewImageUrl { get; set; }
}
public class ImageMessageEventImageSetDto
{
public string Id { get; set; }
public string Index { get; set; }
public string Total { get; set; }
}

// -------- 以下 unsend event --------
public class UnsendEventDto
{
public string messageId { get; set; }
}

// -------- 以下 member joined & left event --------
public class MemberEventDto
{
public List<SourceDto> Members { get; set; }
}

// -------- 以下 postback event --------
public class PostbackEventDto
{
public string? Data { get; set; }
public PostbackEventParamDto? Params { get; set; }
}

public class PostbackEventParamDto
{
public string? Date { get; set; }
public string? Time { get; set; }
public string? Datetime { get; set; }
public string? NewRichMenuAliasId { get; set; }
public string? Status { get; set; }
}

// -------- 以下 videoViewingCompleteEventDto event --------
public class VideoViewingCompleteEventDto
{
public string TrackingId { get; set; }
}
}

LineBotService.cs 添加內容

  • 在上篇 LinBotService 新增的接收事件 function 中加入對應的 case。
public void ReceiveWebhook(WebhookRequestBodyDto requestBody)
{
foreach(var eventObject in requestBody.Events)
{
switch (eventObject.Type)
{
.
.
.
case WebhookEventTypeEnum.Leave:
Console.WriteLine("我們被聊天室踢出了");
break;
// -------- 新增內容 --------
case WebhookEventTypeEnum.MemberJoined:
string joinedMemberIds = "";
foreach(var member in eventObject.Joined.Members)
{
joinedMemberIds += $"{member.UserId} ";
}
Console.WriteLine($"使用者{joinedMemberIds}加入了群組!");
break;
case WebhookEventTypeEnum.MemberLeft:
string leftMemberIds = "";
foreach (var member in eventObject.Left.Members)
{
leftMemberIds += $"{member.UserId} ";
}
Console.WriteLine($"使用者{leftMemberIds}離開了群組!");
break;
case WebhookEventTypeEnum.Postback:
Console.WriteLine($"使用者{eventObject.Source.UserId}觸發了postback事件");
break;
case WebhookEventTypeEnum.VideoPlayComplete:
Console.WriteLine($"使用者{eventObject.Source.UserId}");
break;
// -------- 新增內容 --------
}
}
}

--

--