使用C#開發LineBot(15) – 當Linebot與我們同在一起, 談群組(聊天室)處理
2017年下旬,Line更新了相關的API,終於讓Linebot可以抓取到群組中的用戶的資訊,這一點看似不起眼,但其實沒有這個功能的話,相當程度的限制了Linebot在群組中的可能性。
也因此,隨著Line開發相關API,我們的LineBotSDK當然也跟著支援了,請將專案中的LineBotSDK更新到v0.6.1-beta即可享有此功能:
更新後你會發現有幾個跟群組聊天有關係的API,分別是
- LeaveRoom
- LeaveGroup
- GetRoomMemberProfile
- GetGroupMemberProfile
- …
在開始之前,你需要知道一些基本概念:
- Line裡面的群組聊天有兩種,分別是room與group
- 你隨意地邀請幾個人加入聊天,那一種叫做room
- 你透過選單所建立的群組,叫做group
- 一個群組裡面只能加入一隻bot
- 你的bot無法知道是誰把自己加進來的
- 但你的bot可以知道群組中當前說話的人是誰(意味著,可以取得他的個人資料,包含頭像、顯示名稱…等),即便你的bot沒有跟發話者成為好友。
- 你的bot只能被某人加入群組,無法主動加入群組,但可以主動離開群組。
好了,有了這些基本概念之後,我們可以開始來玩玩看,請先大致瀏覽一下底下這段code,這是WebHook的片段程式碼(完整程式碼位於github https://github.com/isdaviddong/LinebotInTheGroup) :
接著我們看運行的結果,當我們在兩人對話的狀況下,可以透過邀請好友的方式,把一隻bot加入對談:
注意上面testlinebot2018這支bot,請觀察他回復的訊息,你會發現,他是知道自己是被加入room還是group中的(這資訊很重要,可以透過source.type取得)。
同時,當你對照上面的code也可以知道,當bot被加入群組(room/group)時,WebHook會收到一個join的event(位於第12行)。
接著,你可以試試看在群組中說話:
你會發現,當bot收到你的訊息時,WebHook會收到一個message event(第18行),其中可以取得說話者的userId(36行),透過UserId你可以取得該人的個人資訊(35行, GetRoomMemberProfile),最後回應給群組中所有人(一樣透過Reply即可, 45行)。
如果要讓bot離開群組,只需要針對呼叫LeaveRoom/LeaveGroup即可(25,27行),例如:
當你對bot說bye,你會發現bot在說完bye-bye之後,就離開聊天室了,對應到上面的程式碼就是第19-27行,呼叫LeaveRoom或是LeaveGroup API即可,請留意,一但bot主動離開,bot是無法自己重新加回群組或聊天室的,必須『被加入』才行。
其實用起來並不難,但有這幾個功能之後,你的bot可以做的事情就非常多了,改天我們再來談談一些具體的應用實例。
------------------
相關課程:http://www.studyhost.tw/NewCourses/LineBot
電子書:http://studyhost.blogspot.tw/2017/12/line-bot.html
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。
留言
如果是要連已讀都知道的話大概要怎麼寫?
我有請其他人在群組測試,只要其他人沒有加機器人好友,機器人就無法去查詢他的資料,
line server會回傳404 not found,
要有加機器人好友後才能正確查到發話者資訊。
我是自己用HttpWebRequest的方式去建立webhook。
想請問是否真的不加機器人好友也可以查到發話者資訊?
謝謝。
謝謝。
導入老師的範例程式碼後做test
要讓BOT離開當前群組
BOT也確實回應了bye-bye 但卻沒有出現離開的訊息
不知道問題出在哪
使用的SDK是0.6.9的版本
我用的是老師在github上的程式碼
https://github.com/isdaviddong/LinebotInTheGroup/blob/master/WebApplication/Controllers/LineBotGroupController.cs
https://i.imgur.com/7pBwxlD.jpg
這個是我自己的測試圖
謝謝老師幫我解答><
可以唷,要不要更新到最新的SDK試試看?
Line:27
isRock.LineBot.Utility.LeaveGroup(item.source.roomId, ChannelAccessToken);
item.source.roomId → item.source.groupId