使用C#開發LineBot(15) – 當Linebot與我們同在一起, 談群組(聊天室)處理

2017年下旬,Line更新了相關的API,終於讓Linebot可以抓取到群組中的用戶的資訊,這一點看似不起眼,但其實沒有這個功能的話,相當程度的限制了Linebot在群組中的可能性。

也因此,隨著Line開發相關API,我們的LineBotSDK當然也跟著支援了,請將專案中的LineBotSDK更新到v0.6.1-beta即可享有此功能:

更新後你會發現有幾個跟群組聊天有關係的API,分別是

  • LeaveRoom
  • LeaveGroup
  • GetRoomMemberProfile
  • GetGroupMemberProfile

在開始之前,你需要知道一些基本概念:

  1. Line裡面的群組聊天有兩種,分別是room與group
  2. 你隨意地邀請幾個人加入聊天,那一種叫做room
  3. 你透過選單所建立的群組,叫做group
  4. 一個群組裡面只能加入一隻bot
  5. 你的bot無法知道是誰把自己加進來的
  6. 但你的bot可以知道群組中當前說話的人是誰(意味著,可以取得他的個人資料,包含頭像、顯示名稱…等),即便你的bot沒有跟發話者成為好友。
  7. 你的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專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

留言

匿名表示…
請問有沒有辦法能夠連已讀的人有誰都知道
如果是要連已讀都知道的話大概要怎麼寫?
Rick表示…
您好, 最近在研究line機器人,看了您的資料非常有用,

我有請其他人在群組測試,只要其他人沒有加機器人好友,機器人就無法去查詢他的資料,
line server會回傳404 not found,
要有加機器人好友後才能正確查到發話者資訊。

我是自己用HttpWebRequest的方式去建立webhook。

想請問是否真的不加機器人好友也可以查到發話者資訊?

謝謝。
Rick表示…
不好意思,我找到問題了,原來在group跟room裡找user的方式不是用單純的Get Profile,
謝謝。
M.H寫道…
作者已經移除這則留言。
小煉表示…
請問老師
導入老師的範例程式碼後做test
要讓BOT離開當前群組
BOT也確實回應了bye-bye 但卻沒有出現離開的訊息
不知道問題出在哪
使用的SDK是0.6.9的版本
isDavid寫道…
要看到code比較知道你的問題可能發生在哪...
小煉表示…
謝謝老師回應
我用的是老師在github上的程式碼
https://github.com/isdaviddong/LinebotInTheGroup/blob/master/WebApplication/Controllers/LineBotGroupController.cs

https://i.imgur.com/7pBwxlD.jpg
這個是我自己的測試圖
謝謝老師幫我解答><
Harold's Blog寫道…
作者已經移除這則留言。
isDavid寫道…
to 吳蔡宏,

可以唷,要不要更新到最新的SDK試試看?
Harold's Blog寫道…
感謝回復,雖然忘記知其問了什麼,部過有看到一個小小錯誤稍微回復一下:)
Line:27
isRock.LineBot.Utility.LeaveGroup(item.source.roomId, ChannelAccessToken);
item.source.roomId → item.source.groupId
Henry Kuo寫道…
請問現在有辦法抓到群組記事本下方的留言嗎?

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

精彩(且驚人)的Semantic Kernel入門範例

使用Semantic Kernel 建立自然語言請假系統

在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統

專業的價值...