今天要介紹的是 Line Bot 的邀請處理,LINE 提供了一些 Webhook 事件,讓我們可以在機器人被加好友、被封鎖、或被加入群組時,做一些相應的處理。
前兩項雖然和邀請無關,不過很常用到就一起介紹。
Webhook event:
Message event 訊息事件
Postback event 回呼事件
active
通道處於活動狀態,Line Bot 可以正常發送訊息。standby (開發中)
通道處於等待狀態,Line Bot 不應回覆訊息。# 事件來源
user
、group
、room
。User 使用者
user
。Group 群組
group
。Room 聊天室
room
。來源官方文件: #common-properties
message
。來源官方文件: #message-event
程式碼:
protected override async Task OnMessageAsync(MessageEvent ev)
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"OnMessage 訊息事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}");
}
結果:
postback
。來源官方文件: #postback-event
程式碼:
protected override async Task OnPostbackAsync(PostbackEvent ev)
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"OnPostback 回呼事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}\n" +
$"資料: {ev.Postback.Data}");
}
結果:
使用者加 Line Bot 好友時觸發,可以用來發送問候語。
follow
。來源官方文件: #follow-event
程式碼:
protected override async Task OnFollowAsync(FollowEvent ev)
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"OnFollow 追蹤事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}");
}
結果:
unfollow
。來源官方文件: #unfollow-event
程式碼:
protected override Task OnUnfollowAsync(UnfollowEvent ev)
{
throw new Exception(
$"OnUnfollow 封鎖事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}");
}
結果:
封鎖和離開事件沒有 replyToken,不能回覆訊息。
{
"ClassName": "System.Exception",
"Message":
"OnUnfollow 封鎖事件
類型: Unfollow
時間: 1579238219795
來源類型: User
頻道 ID: Ua2e462c39f1ca8490***************
用戶 ID: Ua2e462c39f1ca8490***************"
}
Line Bot 加入群組或聊天室時觸發,可以用來發送問候語。
觸發時機分別是:
如果聊天室本來已經存在,這時加入 Line Bot 也會馬上觸發加入事件。
join
。來源官方文件: #leave-event
程式碼:
protected override async Task OnJoinAsync(JoinEvent ev)
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"OnJoin 加入事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}");
}
結果:
Line Bot 離開群組或聊天室時觸發。
leave
。來源官方文件: #leave-event
程式碼:
protected override Task OnLeaveAsync(LeaveEvent ev)
{
throw new Exception(
$"OnLeave 離開事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}");
}
結果:
{
"ClassName": "System.Exception",
"Message":
"OnLeave 離開事件
類型: Leave
時間: 1579239093329
來源類型: Group
頻道 ID: C98a80cf5620b0b199***************
用戶 ID: "
}
{
"ClassName": "System.Exception",
"Message":
"OnLeave 離開事件
類型: Leave
時間: 1579247615402
來源類型: Room
頻道 ID: Rf1fe692e16a6bab6cf**************
用戶 ID: "
}
用戶加入群組或聊天室時觸發。
memberJoined
。# 事件來源 User
陣列。來源官方文件: #member-joined-event
程式碼:
protected override async Task OnMemberJoinAsync(MemberJoinEvent ev)
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"OnMemberJoin 成員加入事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}\n" +
$"加入用戶ID: {string.Join(",\n", ev.Joined.Members.Select(it => it.UserId))}");
}
結果:
用戶離開群組或聊天室時觸發。
memberLeft
。# 事件來源 User
陣列。來源官方文件: #member-left-event
程式碼:
protected override Task OnMemberLeaveAsync(MemberLeaveEvent ev)
{
throw new Exception(
$"OnMemberLeave 成員離開事件\n" +
$"類型: {ev.Type.ToString()}\n" +
$"時間: {ev.Timestamp}\n" +
$"來源類型: {ev.Source.Type.ToString()}\n" +
$"頻道 ID: {ev.Source.Id}\n" +
$"用戶 ID: {ev.Source.UserId}\n" +
$"離開用戶ID: {string.Join(",\n", ev.Left.Members.Select(it => it.UserId))}");
}
結果:
{
"ClassName": "System.Exception",
"Message":
"OnMemberLeave 成員離開事件
類型: MemberLeft
時間: 1579316642116
來源類型: Group
頻道 ID: C98a80cf5620b0b199***************
用戶 ID:
離開用戶ID: Ua2e462c39f1ca8490***************"
}
{
"ClassName": "System.Exception",
"Message":
"OnMemberLeave 成員離開事件
類型: MemberLeft
時間: 1579317849823
來源類型: Room
頻道 ID: Rf1fe692e16a6bab6cf**************
用戶 ID:
離開用戶ID: Ua2e462c39f1ca8490***************"
}
因為聊天室不能把機器人退出,所以通常會實作這個功能。
var regex = new Regex(@"^離開$", RegexOptions.IgnoreCase);
if (regex.IsMatch(textMessage.Text))
{
await _messagingClient.ReplyMessageAsync(ev.ReplyToken, "掰掰~");
if (ev.Source.Type == EventSourceType.Group)
//離開群組
await _messagingClient.LeaveFromGroupAsync(ev.Source.Id);
if (ev.Source.Type == EventSourceType.Room)
//離開聊天室
await _messagingClient.LeaveFromRoomAsync(ev.Source.Id);
}
結果:
可以取得 Line Bot 好友的個人資訊。
來源官方文件: #get-profile
//參數 userId
//回傳 UserProfile
Task<UserProfile> GetUserProfileAsync(string userId);
if (ev.Source.Type == EventSourceType.User)
{
var userProfile = await _messagingClient
.GetUserProfileAsync(ev.Source.UserId);
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"DisplayName: {userProfile.DisplayName}\n" +
$"StatusMessage: {userProfile.StatusMessage}\n" +
$"PictureUrl: {userProfile.PictureUrl}");
}
結果:
可以取得群組內用戶的個人資訊,被封鎖或未加好友的用戶資訊也可以取得,
get-profile 只能取得好友的。
來源官方文件: #get-group-member-profile
//參數 groupId
//參數 userId
//回傳 UserProfile
Task<UserProfile> GetGroupMemberProfileAsync(string groupId, string userId);
if (ev.Source.Type == EventSourceType.Group)
{
var userProfile = await _messagingClient
.GetGroupMemberProfileAsync(ev.Source.Id, ev.Source.UserId);
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"DisplayName: {userProfile.DisplayName}\n" +
$"StatusMessage: {userProfile.StatusMessage}\n" +
$"PictureUrl: {userProfile.PictureUrl}");
}
可以取得聊天室內用戶的個人資訊,被封鎖或未加好友的用戶資訊也可以取得,
get-profile 只能取得好友的。
來源官方文件: #get-room-member-profile
//參數 roomId
//參數 userId
//回傳 UserProfile
Task<UserProfile> GetRoomMemberProfileAsync(string roomId, string userId);
if (ev.Source.Type == EventSourceType.Room)
{
var userProfile = await _messagingClient
.GetRoomMemberProfileAsync(ev.Source.Id, ev.Source.UserId);
await _messagingClient.ReplyMessageAsync(ev.ReplyToken,
$"DisplayName: {userProfile.DisplayName}\n" +
$"StatusMessage: {userProfile.StatusMessage}\n" +
$"PictureUrl: {userProfile.PictureUrl}");
}
此功能需要 Premium 帳號才能使用
可以取得群組或聊天室內所有用戶的 ID。
來源官方文件: #get-group-member-user-ids
//參數 groupId
//參數 continuationToken <- 代入上方的 next 參數
//回傳 GroupMemberIds
Task<GroupMemberIds> GetGroupMemberIdsAsync(string groupId, string continuationToken);
//取得群組內所有用戶的 ID
if (ev.Source.Type == EventSourceType.Group)
{
var userIds = new List<string>();
var continuationToken = null as string;
do
{
var groupMemberIds = await _messagingClient
.GetGroupMemberIdsAsync(ev.Source.Id, continuationToken);
continuationToken = groupMemberIds.Next;
userIds.AddRange(groupMemberIds.MemberIds);
} while (continuationToken != null);
}
//參數 roomId
//參數 continuationToken <- 代入上方的 next 參數
//回傳 GroupMemberIds
Task<GroupMemberIds> GetRoomMemberIdsAsync(string roomId, string continuationToken);
//取得群組內所有用戶的 ID
if (ev.Source.Type == EventSourceType.Room)
{
var userIds = new List<string>();
var continuationToken = null as string;
do
{
var groupMemberIds = await _messagingClient
.GetRoomMemberIdsAsync(ev.Source.Id, continuationToken);
continuationToken = groupMemberIds.Next;
userIds.AddRange(groupMemberIds.MemberIds);
} while (continuationToken != null);
}
作者也有寫好可以直接取得所有用戶資訊的方法
//取得群組內所有用戶的個人資訊
var userProfiles = await _messagingClient
.GetGroupMemberProfilesAsync(ev.Source.Id);
//取得聊天室內所有用戶的個人資訊
var userProfiles = await _messagingClient
.GetRoomMemberProfilesAsync(ev.Source.Id);
Line Bot 的基本功能介紹在這裡告一段落,接下來會玩一些比較複雜的 API,例如 Notify、Login、LIFF、等等...
下一篇要製作語音機器人,今天就到這裡,感謝大家觀看。 (´・ω・`)