Line Bot 在群組中監控成員的加入與退出
系列文章
- MoBot : LINE Bot 開發紀錄 ( LINE / Heroku )
- 芋香冬瓜「查」 : 專為自家需求的機器人查詢系統 App ( MoBot ver.2 )
- Line Bot 在群組中的喚醒/休眠機制 (Django Database 之應用)
- 利用 Line Notify 於 Line Bot ( Django + Heroku ) 進行群組推播提醒
前言
Line Bot 加入群組後,可以跟使用者進行互動外,還可以協助我們來監控成員的加入以及退出。這樣的動作對於群組成員的管理至關重要,在商業應用上,也可以將不同群組的使用者建立在同一個資料庫中一併進行管理,我們可以從資料庫中了解我們所有的使用者以及其所屬的群組,未來在進行訊息的推播、資料的收集以及相關應用。
因此,筆者希望藉由本文帶領讀者了解如何利用 Line Bot 來監控成員的加入/退出,以及後續的延伸應用。
事件 Event
從系列文章 MoBot : LINE Bot 開發紀錄 ( LINE / Heroku ) 我們曾經介紹過,曾經介紹過,Line Bot 的回應觸發是以事件 (Event) 為主,先前文章中提到的訊息回覆,則是利用 isinstance(event, MessageEvent)
判斷是否為訊息事件 (MessageEvent),若是,則根據訊息內容來進行動作判斷。
1 | def callback(request): |
MemberJoinedEvent / MemberLeftEvent
正如同訊息事件一樣, Line Bot 針對成員的加入或退出,也是利用事件 ( MemberJoinedEvent / MemberLeftEvent ) 來進行動作的觸發,我們可以由 Line Messageing API 來查看 MemberJoinedEvent
事件的範例格式 ( json ) :
1 | { |
從上述範例中,我們可以了解事件為 MemberJoinEvent,那麼 event.joined.member 會輸出加入群組使用者的陣列,其中包含了使用者 ID,除此之外,我們也可以同時知道群組的 ID。
當使用者加入時,我們可以利用 Line Bot 來進行歡迎語句的回覆
1 | if isinstance(event, MemberJoinedEvent): |
當然成員離開時也可以有類似的動作
1 | if isinstance(event, MemberLeftEvent): |
成員加入/離開與資料庫處理
前面有提到,我們可以知道加入者們以及群組的 ID,利用 API 我們亦可以藉由 ID 把使用者暱稱找出來,知道了這些訊息後,我們便可以將這些資訊寫入資料庫中。
首先,我們在 models.py
中定義使用者的資料庫及新增/刪除使用者的方法 ( createByUserId
/ deleteByUserId
),加入使用者的時候同時加入使用者 ID 及暱稱
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14class 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
4class MemberTbl_Admin(admin.ModelAdmin):
list_display = ('UserID','UserName')
admin.site.register(MemberTbl,MemberTbl_Admin)
資料庫準備好後,我們便可以在成員加入群組的事件中,同時將使用者加入資料庫
1 | if isinstance(event, MemberJoinedEvent): |
當使用者退出群組時,我們亦可以將使用者自資料庫中刪除
1 | if isinstance(event, MemberLeftEvent): |