分帳龍寶寶 LineBot 開發隨便寫之一

C.Dragon
15 min readDec 18, 2020

--

不專業開發筆記,跟技術沒什麼關係,但偶爾可能有一點點關係,大概就是我們在意的、我們想到的、我們曾經思考過的以及我們一起創造的一些眉眉角角。有興趣使用請點:https://lin.ee/52gLqtX

警告:這篇文屬於隨手分享的流水帳,如果你想看比較有條理的有智慧偏設計行銷的分享,
請參考強者朋友 Ting-En Wei 的文章

筆記:龍寶寶於2022做了大更新,有興趣可以參考:

分帳龍寶寶

「分帳龍寶寶」是我與我的強者朋友 Ting-En Wei 開發的 LineBot 工具。他可以幫你算帳分帳,你可以開不同帳本,你也可以選擇要加入分帳的人,總之它的功能就是可以取代下面這一張 Excel 表:

故事的起源來自我們一群朋友去合歡山回來帳算了兩天,由於我們太懶惰再也不想算帳,所以決定自己開發一個分帳工具,畢竟我們都知道每一分鐘算帳就會有六十秒過去。

基本上我負責所有技術相關的不專業開發,強者朋友囊括視覺設計、流程設計和行銷;由於我們是超多年的好友,認真的說,龍寶寶就是在我們兩個的互相嘴砲下所生出的產物。

整體開發時間約 10 天(的下班時間扣除吃飯看后羿棄兵跳繩唸英文和耍廢),花了一天建立基本功能的初版,接下的來時間都用來優化所有版面、流程、增強使用者體驗以及在朋友圈先行測試。

註:我們非常了解與信任彼此,因此可以 100 % 分工,也可以 100% 滿足雙方任性刁鑽的需求,所以開發流程請斟酌參考就好不要太認真,因為真實世界其實很難發生(咦?)

一切的起源:為什麼是LineBot ?

「分帳」其實是一個非常簡單的的概念,任何人都可以自己完美解決這道數學計算題。我們也知道市場上也有許多類似的產品,但為什麼龍寶寶出現的時候還是造成了一些迴響呢?

如果說寫出這工具的本質不難,那比起單純「寫出來」,對我來說,更重要的是「用什麼方式做」;因為無論是 Coding 本身,抑或是工具的選擇,它們從來都沒有標準答案,只有當前最適合的答案。

我們都知道分帳是個小事,但當人一多,他就會變成大事。同理,下載App是個小事,可是當你跟一群甚至不同年齡層的人出遊,所有人安裝的過程絕對是一場比分帳麻煩的災難!

這時候 LineBot 似乎就是跨越高牆的最佳解答,特別是在 Line 莫名異常普及的台灣,好像沒有比這個更合適的選擇了!

但如果你問龍寶寶,他會說:當然基於帥氣程度的選擇啊 !

:我做了一個分帳工具
:App喔,為什麼不用 Splitwise?
:他是 LineBot
:喔喔喔真假好可愛我要加他!!

聊天機器人的本質

聊天機器人顧名思義他會被加入各種群組跟大家聊天,它的運作方式很簡單:分析訊息並且做出反應,這也是你所有功能一切的基礎。

我們把分帳龍寶寶定義為聊天機器人工具,因為比起聊天,我們更專注於他的功能性,最低限度的讓龍寶寶做出反應。

聊天機器人最可怕的地方是,每個人講的一句話都會送一個 request 到你的 server,光是第一天上線針對龍寶寶所下的有效指令就超過 27萬(井底之蛙的我覺得很多),你可以想像那些不是指令內的訊息可能是十倍二十倍甚至更多。

Line Console 後台統計

此外,群組內資料庫的寫入量更是驚人。

分帳說來簡單但要記錄的東西比你想像中的多很多:使用者、群組使用者、群組、帳本、分帳使用者、費用、編輯模式、教學模式…等等,整個 Schema 雖然單純,但上線不到一小時,20000 筆的免費額度就被寫光。

你想想一個好友把龍寶寶加入 30人群組開了 2 本帳本就是 1 群組 + 30 群組使用者 + 2 * 30 帳本使用者,然後你的群組好友加了龍寶寶好友又把他加入另外 10人的群組…..

如果你是用免費的 server 或是有限制筆數的 Database ,那麼恭喜你可能就要跟我們一樣半夜看到各種 Alert 然後拿出你的信用卡解決問題 :)

這邊特別感謝踴躍贊助龍寶寶的大家,我們在第一天就收到了 $16 的贊助金額喔,希望大家繼續踴躍贊助讓龍寶寶不要餓死:)

龍寶寶資料庫結構

要思考的比我們想的還要多很多

不同於一些聊天機器人,他們只需要針對訊息做回應。我們要做的分帳功能除了基本的訊息分析,還有更多的邏輯操作以及資料庫寫入。

在這個前提下,你所設計的任何流程都要必須要非常謹慎小心。

例一:新增帳款時,一個人按了確認,另一個人按了取消怎麼辦?
例二:編輯帳本名稱時,另一個人說了不相干的話會發生什麼事?
例三:如果大家不照教學模式的流程走,應該要做出什麼反應?
例四:龍寶寶被加入 100 人群組,還沒來得及建立那麼多使用者就記帳了?
例五:值不值得為了教學模式而犧牲整體龍寶寶的回覆時間?

對於一個很隨性下班邊吃晚餐邊寫 Code 花了三小時就快孵化的龍寶寶本人來說,重新檢視所有流程並且優化就顯得重要。

過程其實非常有趣,你會發現你要想的比你想像中還要多很多,畢竟科技始終來自於人性(菸)

其中很大的一部分必須要特別感謝我的強者朋友,本身是設計相關科系,又有強大的行銷廣告背景(當她發現 line 樣板間距會隨著手機不同而有所差異時後瞬間崩潰),我們花了非常多時間反覆的修正,不論是介面上,按鈕大小,回覆大小,或是流程上,盡我們所能讓體驗不只是合理更順暢。

看看下面的初代龍寶寶你就知道我在說什麼了

龍寶寶學齡前 三小時

至於一個小小分帳龍寶寶要處理多少不同種類的事件呢?大概就是下面一點點而已(謎:你不是只是要分帳而已嗎…)

訊息事件 (Message Event) 列表
按鈕事件(Postback Event) 列表

龍寶寶很慢

擁有一個不同專業領域的嘴砲共同開發者,你可能要回答很多有點無法回答就算可以回答也不知道該怎麼解釋的問題(註:炎龍就是我本人):

炎龍,為什麼龍寶寶很慢
炎龍,為什麼龍寶寶很 Lag
炎龍,龍寶寶死了!(當你把 Localhost 關掉)

首先,你要知道你是一隻 LineBot,生於 Line 死於 Line ,成也 Line 敗 Line。

發布的期間就有某一天晚上我們發現LineBot回覆都異常緩慢,回覆時間需要五秒以上,不只是龍寶寶,其他聊天機器人也有一樣的情形,這時候你就只能放下雙手仰望星空。

而如果你對 LineBot 很熟悉,你會知道 LineBot 有兩種回覆方式:

1. 直接回覆 (Auto Response):這是一個在 LineBot 後台就可以做的設定,你可以設定只要任何人說出:「寶寶最喜歡誰」,就自動回覆 「當然是蔡依林」(不要懷疑,龍寶寶就是在炎龍看完高雄演唱會接近完成的)。這種方式的回覆速度非常快,但只能是文字訊息!

2. 由你的 Server 回覆:當操作複雜到需要到你的 Server 去執行時,在這個情況下要回覆使用者,你就是得向 Line Server 送出 Request, 而這個一來一回就是 200 ms — 700 ms 甚至有的慢到要 5秒(!?)。

由於使用者對於聊天軟體的反應感受其實是非常敏感的, 0.5 秒聽起來很短但在真正使用上會造成很大的體驗差異。

即使你把各種優化都做了,LineBot 的回覆速度終究還是有一個上限的!所以如果龍寶寶慢半拍,請不要打他謝謝!

不洗版龍寶寶 — 當龍寶寶太受歡迎

龍寶寶有個自我保護機制,如果你曾經有想把龍寶寶玩爆的念頭,你會發現同個按鈕你就算點三次,他只會回應你一次,他並沒有壞掉只是比較倔強和世界不一樣。

路人都知道檢查 Webhook (Line 送來的事件)重複性是非常基本的。而事實上 Line 的確會傳給你三個事件但可能只發生一次,這些都可以透過簡單的檢查過濾掉本來就不存在的事件。

但當 LineBot 丟在多人群組中,你會遇到更多重複事件的問題,例如:五個人同時點確認按鈕,五個人同時叫「龍寶寶」,他們來自不同使用者,這時候如果你沒有做任何處理,龍寶寶大概會變成世紀洗版王。

因此龍寶寶有做了一系列守衛設計,針對不同的事件(按鈕事件、訊息事件等等)以及事件種類(群組共同事件,個人事件)來做去重優化:

例一:呼叫「看帳」屬於「文字群組事件」,如果在兩秒內有任何一個人重複呼叫,龍寶寶會忽略。

文字群組事件兩秒內只做一次有效回應

例二:「加入分帳」屬於「按鈕私人事件」,如果在兩秒內有任何一個人重複點擊,龍寶寶都會一一回覆。

例三:「編輯明細」屬於「按鈕群組事件」,如果在兩秒內有任何一個人重複點擊,龍寶寶會忽略。

Line Event 事件處理

遲遲才做的編輯功能

「編輯」這個動作在 LineBot 來說是非常麻煩的,也是我們從一開始一直思考要如何執行,但最後才做出來的功能。可行的方式有以下幾種:

  1. 「文字指令」可想而知對於使用者指令會得非常複雜又冗長。

例一:「我的帳本 改名 二號帳本」

謎:那如果你有兩本「我的帳本」要改名哪本呢?

例二:「1 更名 二號帳本」列出帳本編號來下指令

使用者:你在跟我開玩笑嗎?…

2. 「跳出網頁」最直覺的解法,不能做就不要在 Line 裡面做!

做一顆按鈕,點按時會跳出我們做的的網頁表單,填完送出後再回來 Line。

這方式可行且安全,但最終還是沒有這樣實行。原因是我們希望能讓所有的體驗都在內建的 Line 裡面完成,堅持不想破壞整個體驗流程(謎: 明明就是因為你堅持不想寫很多前端!)

3. 「互動式編輯」最後一種也就是龍寶寶現在的編輯模式:

它的運作方式是當A使用者按下 「更名」按紐時,A使用者會進入隱形的編輯模式,此時A 不能跟龍寶寶有其他指令的互動,必須要完成一系列的編輯流程才能退出。

在同個群組中,任何其他使用者還是可以正常地與龍寶寶互動,完全不會受到A編輯模式的影響。至於這個方法是怎麼想出來的,我只能說人真的很會在逆境中求生存(再菸)

編輯紀錄資料表

分帳算式?合併私人帳款?無限分帳?

分帳的算法取決於群組帳目的複雜度,甚至有論文討論複雜分帳的最佳算法,目的是要計算最小的 transaction 也就是所有人掏出錢的最小次數。

如果群組結算後:A 應收 $10,C 應付 $10,B 應收 $10,D 應付 $10
而龍寶寶叫 C 給 B 跟 A 各 $5, D 也給 B 跟 A 各 $5 ,龍寶寶大概就可以滾到銀河之外。

龍寶寶採用最安全(同義詞:不是很快)的算式,先計算群組的平均帳目,接著加入私人帳款,總結出所有人的應收應付排序後再做最終分帳。

如果說總結為 [A: -100, B: -80, C: 0, D: 40, E: 140],我們會從最大值跟最小值也就是 A 跟 E 開始分帳,A 給 E $100, B 給 E $40,B 給 D $40 。

一個未解的題目是,由於龍寶寶總是會幫你做最佳的分帳,因此當群組中有任何一人還款時,最佳的分帳建議是會動態變動的!也就會遇到我們自稱「無限分帳」的問題。

老實說這其實不是一個問題,因為龍寶寶的工作就是給你最佳建議。但如果群組已經在結算階段,還款與變動的分帳的確很容易會讓大家還錯金額。

無解的還款後無限分帳

開發上的限制

我認為 LineBot 本質就不適合開發太過於複雜的功能,我們基於某些限制無法把產品做得盡善盡美,大部分都跟抓取使用者名字相關:

  1. 判別使用者的名字。例如:@小龍🥺🥺 車費 200

由於 Line 允許使用者使用連他們自己的都不支援的 Emoji ,讓名字判讀遇到相當大的問題,例如上方的訊息使用者 `小龍🥺🥺`,從 Line 回傳的官方名字可能是 `小龍??`,因此我們找不到相對應的使用者,這也是龍寶寶一上線我們最常收到的問題回報也一直無法完美解決的問題(目前解法為忽略所有符號但仍有少數例外)。

O — 正常名字
O — 正常名字 + line 支援 emoji
O — 正常名字 + line 不支援的 emoij
O — 名字僅有 line 支援的 emoji
X — 名字僅有 line 不支援的 emoij (請你改名否則龍寶寶與你無緣)

一輩子理解不了的的使用者 — 名字僅有一個 Emoji

2. 讀取所有群組使用者

由於龍寶寶不是官方付費帳號,沒有權限讀取群組內使用者清單。因此龍寶寶加入群組時,我們其實不知道群組內有多少人更不知道這些使用者的資訊。

唯有使用者在群組說話時,才能偵測到新的使用者,這也是為什麼在主選單就一直強調「講過話的人才能分帳」(所以不要再問為什麼要說話了!除非你贊助龍寶寶付費帳號….)

3. 使用者改名

人類有時候會做出連人類都不能理解的事情,例如:時常更改自己的 Line 名字。

由於我們無法得知使用者更改姓名,當他們非常有創意的改名,龍寶寶其實會認不得他的,因為我們只能從名字來判斷他是否有被 @。

原本的解法是每天跑一次名字更新,但這僅限於我們只有少量的使用者。

炎龍:超過500人就不能這麼做了喔…
強者朋友:可以啦會不會 200 都不知道勒!

結果世事難料畢竟地球是圓的,沒想到上線第一天就沒機會這麼做了(菸)

現在的做法是每個人只要講話就會送一個小 worker 去抓名字,但如果 6 小時內已經抓過了那就不會在做任何更新。所以如果你是喜歡改名的使用者,你只要多用龍寶寶,龍寶寶還是會幫你改名的不要擔心!

4. 我沒有名字!

基於網路上的不負責任說法,據說如果你的 line 沒有更新又沒有加龍寶寶好友的話,龍寶寶是一輩子認不得你的,技術來說就是我們永遠無法從 Line 那邊拿到你的 Line 名字。

所以請大家確保自己永遠走在時尚的尖端,好好更新你的 Line 版本….

終究是要正視的隱私問題

無論是哪種聊天軟體,隱私一直都是一個難以正面回答的問題。

不可諱言的是 LineBot 會傳送所有訊息到你的伺服器,因為這就是 LineBot 的運作模式:你講話,我分析,然後回覆!

拜託動點腦子想想,如果 LineBot 不知道你說什麼,那他怎麼有辦法針對你的問題回覆你?

那問題來了,所以世界上所有 LineBot 或聊天軟體都看得到我所有的對話??

答案是肯定的,但也取決於開發團隊的良心。

對於龍寶寶來說,我們會把所有訊息濾掉,也就是在伺服器的歷史 Log 中是完全沒辦法知道這訊息說了什麼話。

只有在某個 request 噴錯的時候(也就是莫名壞掉的時候)我們收到錯誤報告才會知道使用者的訊息,這樣我們才有機會知道我們的 LineBot 有什麼 Bug。

雖然如此,還是要呼籲大家盡量不要在各種聊天軟體留下任何機密資訊,因為很難保證你不會遇到不良廠商或是開發者!

龍寶寶的小總結與成效

你要說龍寶寶很多人用也沒有,好友數僅有少少 18000,使用者數加總約28000人。

從統計圖表和數據來看,確實有一部分的人持續在使用龍寶寶,每日平均的訊息會覆量約 25000 上下,而這中間其實我們只做一次的個人臉書分享以及一則 UX/UI 社團分享貼文,就連我們自己都感到意外跟驚訝,畢竟我們原本估計應該只有 200 個使用者然後第一天就被迫起床刷卡(淚)

LineBot 的入門製作其實非常簡單容易,短短不到幾小時就可以申請帳號架個小server 就會獲得一隻會動的 lineBot。其中最珍貴的其實真的不是產品本身或是統計結果,而是所有為了讓他更好的思考過程。

如果你喜歡龍寶寶歡迎贊助我們喝一杯咖啡,也歡迎寫下你的建議及任何願望,在我們餓死之前都會樂意盡量實現。

https://www.buymeacoffee.com/longbaobao

最後我必須特別感謝我的強者開發朋友還有合歡登山團認真測試與推廣,沒有你們亂七八糟的帳目就不會有今天的龍寶寶。

如果你能看到這裡,我只能說你真是太偉大了,分享給你龍寶寶最新(不相干)的功能,祝你有個美好的聖誕節:)

由合歡登山團(又)許願的新功能 聖誕節交換禮物抽籤

想知道更多關於龍寶寶開發的幕後,歡迎參考強者朋友的文章

--

--