跳至主要內容

里程碑

看到好東西就丟給它:用 n8n + LINE 打造會自己整理的收藏小精靈「收收A」📥

蘿蔔 @lobo261011發布於 已編輯

一、專案簡介

收收A 是一隻住在 LINE 上的 AI 收藏小精靈(官方帳號叫「素材收集庫」)。在手機上滑到不錯的工具、文章、教學或靈感,直接貼給它就好:它會在幾秒內讀懂內容、取標題、寫摘要、分類、加標籤,存進資料庫,再自動備份到 Google 試算表。

之後想找的時候,打「找 AI 工具」用問的,或打「book」把收藏攤成卡片慢慢翻。一次丟一整串連結也沒問題,它會一筆一筆整理好。

整個系統用自架在 Oracle Cloud 的 n8n 串接 LINE 與 Gemini,全程零開銷、沒有綁任何信用卡。

(想直接看效果的話,請滑到最下面的「示範」XD)

二、動機

我平常在 Threads、IG、YouTube、GitHub 上看到很多「之後一定用得到」的東西。其實我有在用 kip! 存影片,也乖乖分了資料夾:「酷工具」「專題可能用到」「學習區 新技能」「AI 剪輯」……

集中管理的好處很明顯,但有個前提:我必須先把資料夾建好。問題是,人的分類標準是會浮動的。就算是同一個人,時間一久,同一個東西對自己的意義也會不一樣。當初放進「酷工具」的,三個月後可能更像「專題可能用到」;資料夾越建越多,最後反而不知道該往哪裡找。

所以我想反過來做:

讓一個統一的規範(AI)負責管理所有「輸入」,我只需要負責「篩選要拿什麼」。

存的時候什麼都不用想,丟進來就好;要用的時候,用平常說話的方式問它。對我來說,這才比較接近資訊的本質:重點從來不是「放在哪個資料夾」,而是「我現在需要什麼」。

所以我給收收A 定了五個目標:好用、直覺、真的能幫到我、真的有存、真的找得到。

三、收收A 能做什麼

功能怎麼用它會做什麼
收進來直接傳文字或連結讀懂內容(連結會先抓網頁標題與內文;YouTube 用官方 oEmbed 拿影片標題與頻道)→ 取標題、寫 2~3 句摘要、選分類、加 3~5 個標籤 → 存檔,回覆「📥 已收進〔分類〕」
一次收很多一則訊息貼多個連結(最多 15 個)拆開來一筆一筆整理,最後只回一則總結:「📦 新增 6 筆、跳過 2 筆(已收過)」
不重複收同一個連結再傳一次回覆「🔁 已經收過了」並附上當時的摘要;網址後面多了追蹤參數(?utm_source=...)也認得出來
找出來開頭打「找」,例如「找 設計」讀取所有收藏,交給 AI 挑出相關的項目,列出標題、分類與網址
書籤傳「book」或「book 設計靈感」把收藏排成可以左右滑的卡片(分類顏色、標題、摘要、標籤、開啟連結按鈕),輸入框上方有分類快捷按鈕
說明傳「說明」,或打招呼直接回覆使用說明
自動備份不用操作存完幾秒內同步到 Google 試算表,每天凌晨再對帳一次;手機打開試算表就能看到全部收藏
錯誤通知不用操作任何流程出錯,自動推播給我:哪個節點、什麼錯誤、執行紀錄連結

四、系統架構

整個系統拆成三個各做一件事的 workflow,互不干擾:

程式碼
📱 LINE ──→ ① 主流程(37 個節點)──→ n8n 內建表格(主力,查詢快)
                │                          │
                │ 存完叫醒(不等待)         │ 每天 03:00 對帳
                ▼                          ▼
           ② 同步備份 ─────────────→ Google 試算表(備份+手機上看)

任何流程出錯 ──→ ③ 錯誤通知 ──→ 📱 LINE 推播給我

① 主流程

程式碼
Webhook 接收 → 解析事件(白名單、指令判斷)→ 分流
  ├─ 固定回覆:說明/打招呼/非本人/圖片 ──────────────────────────────┐
  ├─ 書籤:讀取收藏 → 排成 Flex 卡片 ───────────────────────────────────┤
  ├─ 收進來:查重 → 抓連結內容 → AI Agent 整理 → 存檔 → 組回覆 ──────────┤
  ├─ 一次收很多:查重 → 拆開 → 每筆抓內容、AI 整理、存檔 → 組總結 ─────────┤→ HTTP Request 呼叫 LINE API 回覆
  └─ 找出來:讀取收藏 → AI Agent 查詢 → 組回覆 ─────────────────────────┘

② 同步備份:兩個觸發(主流程呼叫、每天 03:00)共用同一套邏輯:讀兩邊的 id,表格有、試算表沒有的就補上。跑幾次都不會重複寫,某次失敗了,下次也會自動補回來。

資料欄位:

欄位用途
title、summary、category、tagsAI 整理出的「我的版本」
url、raw_text原始連結與我傳的原文(AI 理解錯時可以回頭對照)
source_type、user_id素材種類(text/link)、誰傳的
synced_at(只在試算表)什麼時候備份過去的

五、使用到的技術

類別技術用在哪裡
自動化平台n8n 2.19(自架於 Oracle Cloud 免費主機)三個 workflow:主流程、同步備份、錯誤通知
聊天介面LINE Messaging APIWebhook 接收、Reply 回覆、Push 推播、載入動畫、Flex Message 書籤卡片、Quick Reply 分類按鈕
AIGemini(gemini-flash-lite-latest,備援 gemini-3.1-flash-lite)AI Agent:整理素材成 JSON、根據收藏回答查詢
資料儲存n8n Data Table + Google 試算表主力資料庫 + 備份與手機檢視
Google 串接Google Cloud 服務帳號只被共用一份試算表的機器人帳號
程式n8n Code 節點(JavaScript)分流規則、查重、抓網頁、寬鬆解析 AI 輸出、組卡片、對帳比對
版本管理n8n API + git每一版 workflow 匯出成 JSON 進 git(n8n 免費版的版本紀錄只保留 1 天)

六、實作時的決定與取捨

1. 規則優先,AI 墊後
打招呼、說明、書籤、非本人的訊息,都用規則直接處理,不經過 AI。原本連「你好」都會被送去 AI,等了 80 秒還被存成一筆素材 😅 加上規則後,這類訊息一秒就回,也不浪費免費額度。

2. 做模型測速,不憑感覺選模型
同一段素材讓 5 個模型各跑一次:

模型耗時
gemini-flash-lite-latest1.5 秒
gemini-3.5-flash-lite1.5 秒
gemini-3.1-flash-lite1.4 秒
gemini-flash-latest83.0 秒
gemini-3.8-flash85.6 秒

分類、標題、標籤的品質幾乎一樣,Lite 卻快了將近 60 倍。整則訊息從收到到回覆,從最慢的 164 秒降到約 1.3 秒。主力用 Lite,另一個 Lite 當備援,主力忙線時自動接手。

3. 職責分離:備份交給獨立的流程
一開始想讓主流程「存檔時順便寫 Google 試算表」,但這樣每次收藏都要多等 Google,Google 出問題時主流程也要跟著處理。最後改成獨立的同步流程:主流程存完只負責「叫醒它」,不等它做完。

4. 即時同步 + 每日對帳,雙重保險
即時同步可能剛好碰到 Google 掛掉、網路斷線;每天凌晨的對帳會把漏掉的全部補回來。兩個觸發用同一套比對邏輯,只要維護一份程式。通知也只在「對帳時真的補了資料」或「出錯」時才發,平常安靜不打擾。

5. 誰是正本要講清楚
正本是 n8n 表格,試算表是備份。在試算表上改的東西不會同步回去,因為雙向同步要處理「兩邊同時改了怎麼辦」,複雜很多,先不做。

6. AI 掛了也不能掉資料
Gemini 沒回應時,原文照樣存檔,回覆「先保存原文」。使用者不會被晾著,素材也不會遺失。

7. 設定集中在一個地方
白名單、分類(連同卡片顏色)、指令關鍵字,都放在「解析事件」節點最上方的 CONFIG。想新增分類只要改一行。

8. 只給自己用,但還是要有白名單
官方帳號的 ID 是公開的,別人有可能加到。所以收收A 只回應我自己的 LINE userId,其他人只會收到「這是私人帳號」。

9. 金鑰管理(這次最大的收穫之一)

  • 金鑰只放 n8n Credentials 與本機 .env,不寫進流程、不進 git、不貼到對話或截圖
  • 一個用途一把鑰匙、取清楚的名字
  • 最小權限:給 AI 用的 n8n API 金鑰只開需要的權限、設 30 天到期;Google 用「服務帳號」,它只被共用了一份試算表,碰不到我其他的檔案
  • 截圖不小心露出 token 片段 → 立刻重發,舊的作廢
  • 另外做了一份「金鑰登記簿」:只記「哪把鑰匙、給誰用、存在哪、怎麼重發」,不記值

七、碰壁的地方 qwq

問題原因解法
Webhook 網址顯示 localhost:5678,LINE 不接受n8n 沒設定對外網址手動換成對外網域(之後在 Docker 設定 WEBHOOK_URL)
Verify 成功,但手機訊息都沒反應只開了 Developers Console 的 Use webhook,官方帳號「回應設定」的 Webhook 沒開;唯一那筆紅色紀錄其實是 Verify 送來的空訊息打開回應設定的 Webhook
JSON Body is not valid JSON欄位在 Fixed 模式,{{ }} 被當成普通文字切成 Expression,用 JSON.stringify() 組 JSON;改完要重新 Publish
AI 一直回「暫時沒有回應」,流程卻沒報錯gemini-2.5-flash 還在清單上,卻不開放給新帳號;錯誤被防呆接住,表面看不出來讀執行紀錄找到 404,換模型
回覆要等 1~3 分鐘flash 系列在免費額度下回應很慢模型測速後改用 flash-lite+備援
傳「你好」也跑很久,還被存成素材規則只分說明/查詢/其他加上打招呼與最短長度規則
「找Ai」回的卻是使用說明規則的順序錯了:只有 3 個字,先被「太短當打招呼」攔下來,還沒輪到「開頭是找」把「找」的判斷移到前面:規則一多,順序本身就是邏輯
設了 Error Workflow 卻沒有通知n8n 2.x 是發布制,錯誤通知 workflow 沒發布錯誤通知 workflow 也要 Publish
Google Cloud 找不到之前建的專案Cloud Console 登入的是另一個 Google 帳號切換成建立 Gemini 金鑰的那個帳號
YouTube 連結都只被整理成「YouTube 影片」YouTube 會擋程式直接抓網頁改用 YouTube 官方免費的 oEmbed 接口,不用金鑰就拿得到影片標題和頻道
清空表格後,新資料的 id 又從 1 開始n8n 表格清空會重新編號,同步是用 id 比對規則:清空表格時,試算表也一起清空

八、未來可改進與擴充的項目

  • 驗證 LINE 簽章:目前知道 webhook 網址就能偽造訊息,要用 Channel secret 驗證 x-line-signature
  • 看得懂影片和圖片:我在 kip! 存的大多是短影片,收收A 目前只讀得到網址(YouTube 已經能讀標題);之後想讓它讀字幕、看截圖,順便吸收我另一個暫停中的「AI 截圖整理器」
  • 更多入口:電腦端丟資料夾、iOS 捷徑一鍵分享
  • 更完整的視覺化:加圖文選單(Rich Menu),或用 LIFF 做一個在 LINE 裡打開的網頁,用表格、時間軸瀏覽全部收藏
  • 開放給大家用的版本:現在是只給自己用的私人版。資料表已經有 user_id 欄位,未來可以讓每個人只看到自己的收藏;要思考的是註冊流程、隱私,以及 AI 額度怎麼分配
  • 分類放進資料表:在表格裡就能新增分類、改顏色,甚至讓 AI 提議新分類
  • 刪除與修改:在 LINE 裡就能刪掉收錯的、改分類
  • 匯出成 Markdown:每則素材存成一份筆記,接上 Obsidian,變成真正的知識庫

九、心得

很久以前跟著 nuva 做過一次 LINE 機器人,那時候的 AI 連欄位名稱都會抓錯,常常要自己一個一個除錯。這次靠 AI 一起搭出整套工作流,我最大的感受是:分工變了。串接金鑰、資安這類需要「人來負責」的事情交給我自己,剩下的,我只需要好好想清楚「我到底需要什麼」。

最開心的是備份那一段。「把備份拆成獨立的流程」「即時同步再加每日對帳」這些概念都是我自己想的,之前從來沒機會驗證,只是腦中的理論。這次真的做出來、真的跑起來,證明那套想法是對的,那種感覺真的很棒!

示範

▲ 圖一:打招呼 → 收收A 自我介紹與使用說明(不經過 AI,一秒回覆)

▲ 圖二:傳一個 GitHub 連結 → 自動整理成〔AI工具〕;同一個連結再傳一次 → 「🔁 這個連結已經收過了」

▲ 圖三:一次貼 8 個連結(Threads、Instagram、YouTube 混在一起)→ 「📦 批次收藏完成:新增 8 筆」,每一筆都有自己的分類

▲ 圖四:「找 AI」→ 用說話的方式找收藏,直接附上連結

▲ 圖五:「book」→ 書籤卡片,可以左右滑,下方有分類快捷按鈕(全部 9 筆、AI工具 2 筆……)

▲ 圖六:出錯時的推播通知:哪個節點、什麼錯誤,一眼就知道

▲ 圖七:n8n 主流程全景(五條車道:固定回覆、收進來、找出來、書籤、一次收很多)

▲ 圖八:同步備份流程:「主流程呼叫」和「每天 03:00 對帳」兩個觸發,匯進同一套比對邏輯

▲ 圖九:n8n 內建表格裡的收藏(主力資料庫)

▲ 圖十:自動備份到 Google 試算表(user_id 已模糊處理),synced_at 記錄每一筆的備份時間

0 個愛心0 則留言

登入並驗證手機後就能留言。登入