Line Bot 在群組中監控成員的加入與退出

系列文章

前言

Line Bot 加入群組後,可以跟使用者進行互動外,還可以協助我們來監控成員的加入以及退出。這樣的動作對於群組成員的管理至關重要,在商業應用上,也可以將不同群組的使用者建立在同一個資料庫中一併進行管理,我們可以從資料庫中了解我們所有的使用者以及其所屬的群組,未來在進行訊息的推播、資料的收集以及相關應用。

因此,筆者希望藉由本文帶領讀者了解如何利用 Line Bot 來監控成員的加入/退出,以及後續的延伸應用。

事件 Event

從系列文章 MoBot : LINE Bot 開發紀錄 ( LINE / Heroku ) 我們曾經介紹過,曾經介紹過,Line Bot 的回應觸發是以事件 (Event) 為主,先前文章中提到的訊息回覆,則是利用 isinstance(event, MessageEvent) 判斷是否為訊息事件 (MessageEvent),若是,則根據訊息內容來進行動作判斷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def callback(request):
if request.method == 'POST':
signature = request.META['HTTP_X_LINE_SIGNATURE']
body = request.body.decode('utf-8')

try:
events = parser.parse(body, signature)
except InvalidSignatureError:
return HttpResponseForbidden()
except LineBotApiError:
return HttpResponseBadRequest()
for event in events:
if isinstance(event, MessageEvent):
user_id = event.source.user_id
mtext = event.message.text

"""
將收到的文字 mtext 進行後續的回應判斷
"""

return HttpResponse()
else:
return HttpResponseBadRequest()

MemberJoinedEvent / MemberLeftEvent

正如同訊息事件一樣, Line Bot 針對成員的加入或退出,也是利用事件 ( MemberJoinedEvent / MemberLeftEvent ) 來進行動作的觸發,我們可以由 Line Messageing API 來查看 MemberJoinedEvent 事件的範例格式 ( json ) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"destination": "xxxxxxxxxx",
"events": [
{
"replyToken": "0f3779fba3b349968c5d07db31eabf65",
"type": "memberJoined",
"mode": "active",
"timestamp": 1462629479859,
"source": {
"type": "group",
"groupId": "C4af4980629..."
},
"joined": {
"members": [
{
"type": "user",
"userId": "U4af4980629..."
},
{
"type": "user",
"userId": "U91eeaf62d9..."
}
]
}
}
]
}

從上述範例中,我們可以了解事件為 MemberJoinEvent,那麼 event.joined.member 會輸出加入群組使用者的陣列,其中包含了使用者 ID,除此之外,我們也可以同時知道群組的 ID。

當使用者加入時,我們可以利用 Line Bot 來進行歡迎語句的回覆

1
2
if isinstance(event, MemberJoinedEvent):
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=f'Hi ! 歡迎加入 ~'))

當然成員離開時也可以有類似的動作

1
2
if isinstance(event, MemberLeftEvent):
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=f'掰掰 ~'))

成員加入/離開與資料庫處理

前面有提到,我們可以知道加入者們以及群組的 ID,利用 API 我們亦可以藉由 ID 把使用者暱稱找出來,知道了這些訊息後,我們便可以將這些資訊寫入資料庫中。

首先,我們在 models.py 中定義使用者的資料庫及新增/刪除使用者的方法 ( createByUserId / deleteByUserId ),加入使用者的時候同時加入使用者 ID 及暱稱

models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MemberTbl(models.Model):
UserID = models.CharField(max_length=35)
UserName = models.CharField(max_length=20)
BPJID = models.CharField(max_length=3)
GWID = models.CharField(max_length=15)
def createByUserId(userId, userName, bpjid, gwid):
MemberTbl.objects.filter(UserID=userId).delete()
memberTbl = MemberTbl(
UserID = userId,
UserName = userName,
)
memberTbl.save()
def deleteByUserId(userId):
MemberTbl.objects.filter(UserID=userId).delete()

並且在 admin.py 中建立資料庫

admin.py

1
2
3
4
class MemberTbl_Admin(admin.ModelAdmin):
list_display = ('UserID','UserName')

admin.site.register(MemberTbl,MemberTbl_Admin)

資料庫準備好後,我們便可以在成員加入群組的事件中,同時將使用者加入資料庫

1
2
3
4
5
6
7
8
9
10
11
12
if isinstance(event, MemberJoinedEvent):
for member in event.joined.members:
# 針對每一位使用者取得群組ID及使用者ID
user_id = member.user_id
group_id = event.source.group_id
# 利用 API 取得使用者暱稱
profile = line_bot_api.get_profile(user_id)
user_name = profile.display_name
# 新增使用者至資料庫中
MemberTbl.createByUserId(user_id, user_name, bpjid, GWID)
# 加入歡迎語句
line_bot_api.reply_message(event.reply_token, TextSendMessage(text=f'Hi ! 歡迎加入 ~'))

當使用者退出群組時,我們亦可以將使用者自資料庫中刪除

1
2
3
4
5
6
if isinstance(event, MemberLeftEvent):
for member in event.joined.members:
for member in event.left.members:
# 針對每一位使用者自資料庫中進行刪除
user_id = member.user_id
MemberTbl.deleteByUserId(user_id)