[n8n][Gemini] 打造 AI 自動摘要的 RSS 訂閱系統,每日定時推送 LINE 通知

前情提要 身為一個資訊焦慮的工程師,我每天都會追蹤多個技術部落格和 Hacker News。但手動瀏覽實在太花時間,於是我決定用 n8n 打造一個自動化系統:RSS 更新時自動抓取網頁內容、用 Gemini AI 產生摘要、存入 Google Sheets,然後每天早上 6 點推送精選文章到 LINE。 這個專案整合了多個服務: 📡 RSS Feed:訂閱多個資訊來源 🕷️ Firecrawl:抓取網頁完整內容 🤖 Gemini 2.5 Flash:AI 自動摘要 📊 Google Sheets:儲存文章資料 📱 LINE Messaging API:Flex Message 推送通知 聽起來很美好,但實作過程中踩了不少坑,這篇文章記錄我遇到的問題和解決方案。 系統架構 整個系統分成兩個獨立的 n8n Workflow: Workflow 1:RSS 即時處理 RSS 觸發 → 格式化資料 → Firecrawl 抓取網頁 → 內容預處理 → Gemini 摘要 → 寫入 Google Sheets Workflow 2:每日定時發送 每日 6:00 觸發 → 讀取 Google Sheets → 篩選未發送 → 取 10 筆 → 組合 Flex Message → LINE 推送 → 更新狀態 開發過程中遇到的問題 問題 1:n8n Code Node 語法錯誤 我一開始在 Code Node 使用 ES Module 語法: // ❌ 錯誤的做法 export default async function () { const items = this.getInputData(); // ... } 結果 n8n 一直報錯,執行失敗。 解決方案: 改用 n8n 標準的寫法,直接使用 $input.all(): // ✅ 正確的做法 const items = $input.all(); const newItems = items.map(item => { // 處理邏輯 return { json: { ...item.json, // 新增欄位 } }; }); return newItems; 問題 2:Gemini API...
繼續閱讀

[Gemini][Google Maps] 使用 Google Maps Grounding API 打造位置感知的 AI 應用

前情提要 在開發 LINE Bot 時,我想加入一個功能:讓使用者分享位置後,AI 可以智慧推薦附近的餐廳、加油站或停車場。傳統做法需要串接 Google Places API,處理複雜的搜尋邏輯和結果排序。但 Google 在 2024 年推出了 Grounding with Google Maps 功能,可以讓 Gemini 模型直接存取 Google Maps 的 2.5 億個地點資訊,讓 AI 回應自動帶有地理位置脈絡! 這項功能透過 Vertex AI 提供,可以讓 Gemini 模型「接地氣」(grounded)地回答位置相關問題,不再只是憑空想像。 開發過程中遇到的問題 在實作 maps_grounding.py 時,我最初使用 Gemini Developer API 搭配 API Key 的方式: # ❌ 錯誤的做法 client = genai.Client( api_key=api_key, http_options=HttpOptions(api_version="v1") ) response = client.models.generate_content( model="gemini-2.0-flash-lite", # 不支援 Maps Grounding contents=query, config=GenerateContentConfig( tools=[Tool(google_maps=GoogleMaps())], tool_config=ToolConfig(...) ), ) 結果出現了這個錯誤: google.genai.errors.ClientError: 400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Invalid JSON payload received. Unknown name "tools": Cannot find field. Invalid JSON payload received. Unknown name "toolConfig": Cannot find field.'}} 經過查閱文件後才發現,Google Maps Grounding 只支援 Vertex AI,無法使用 Gemini Developer API! 正確的解決方案 1. 理解 API 差異 Google 提供兩種不同的 Gemini API 存取方式: 特性 Gemini Developer API Vertex AI API 認證方式 API Key ADC / Service Account Maps Grounding ❌ 不支援 ✅ 支援 企業級功能 有限 完整 適用場景 快速原型開發 生產環境 2. 修正程式碼 以下是正確的實作方式: from google import genai from google.genai import...
繼續閱讀

[VS Code][Colab] Google 正式釋出 Colab VS Code Plugin

前情提要 Google Colab 是一個我很喜歡的服務,你可以在線上透過 JupyterNotebook 的介面,快速使用到 GPU (甚至是 TPU)。有許多需要大量運算資源的東西,都可以很快速的在遠端的機器上面執行。 我自己很常在上面去嘗試一些模型,雖然常常排隊排不到機器。 使用 Colab 可能有的痛點 雖然使用Google Colab 機器非常的方便,但是由於在線上編輯有一些比較麻煩的地方: 無法使用 Copilot 這類型的 Code Assist Tool 來幫我 Auto-Complete 一些程式碼 無法跑 Gemini CLI Code Assist 來幫我寫出一些更多的測試或是幫忙想應用。 Colab for VS Code Plugin 但是現在 Colab VS Code Extension 終於可以在 VS Code Plugin 上面使用了。你可以透過 “Colab” 直接找到官方釋出的 Plugin 。 安裝過程相當的簡單又快速。 連線到 Colab 如果要連線,在選擇 Kernel 的時候,就可以選擇 Colab 來遠端連線。 這裡還可以快速連線,或是找你上次連線過的伺服器。 這裡就是讓人興奮的地方,可以找找 TPU (不保證排得到隊伍)來用用看。 這樣就可以了。 實際應用: 這樣比較對味啦!! Vibe Coding 出現之後,我們越來越習慣 Vibe Coding 了。但是如果需要 Step by Step 的去偵錯,或是想要跑一些大型機器才能運行的運算。真的還是需要透過 Colab 來幫忙,但是如果又希望可以有 Gemini CLI 的輔助的話,或許 Colab VS Code Extension 就是你不可或缺的好夥伴。 目前一些需要注意的地方 由於 Colab VS Code Plugin 還在持續開發中,有一些原本在 Colab Web UI 上可以使用的 google.colab 功能目前還無法在 VS Code 中使用。以下是一些主要的限制: auth.authenticate_user(): 認證 URL 會出現在選單中,無法直接點擊。建議改用 Python Cloud Client Library。 drive.mount(): 目前無法掛載 Google Drive,可以改用 Drive Python API 來存取檔案。 files.download() / files.upload(): 原生的檔案上傳下載功能無法使用,但可以透過 IPyWidget 來達成相同效果。 userdata.get(): 目前會回傳錯誤,暫時需要從 Colab Web UI 複製 secret 值到 notebook 中。 雖然有這些限制,但整體來說 Colab VS Code Plugin 還是大幅提升了開發體驗,特別是對於習慣使用 VS Code 和各種 AI Coding Assistant 的開發者來說,絕對是值得一試的好工具! 參考資料 Colab VS Code...
繼續閱讀

[Python] LINE Bot 名片管家進化:一鍵生成 vCard QR Code,讓名片直接加入手機通訊錄

前情提要 在先前的 LINE Bot 智慧名片管家 專案中,我們已經實作了使用 Gemini Pro Vision API 自動辨識名片的功能。使用者只要拍照上傳名片,AI 就能自動解析姓名、職稱、公司、電話、Email 等資訊,並儲存到 Firebase Realtime Database 中。 但在實際使用時,我發現了一個痛點: 📱 我已經有數位化的名片資料了,但要加入手機通訊錄還是得手動一個一個欄位輸入… 想像這些情境: 📇 參加研討會:收集了 20 張名片,辨識完成後還要手動加入通訊錄 💼 業務拜訪:拿到客戶名片,想快速加入手機聯絡人 🤝 社交場合:認識新朋友,希望立即儲存聯絡方式 於是我想:既然資料已經數位化了,為什麼不能一鍵加入通訊錄呢? 最理想的方式就是:生成 vCard QR Code,讓使用者掃描後直接加入通訊錄! 專案程式碼 https://github.com/kkdai/linebot-namecard-python (透過這個程式碼,可以快速部署到 GCP Cloud Run,享受無伺服器的便利) 📚 關於 vCard 與 QR Code vCard 格式介紹 vCard(Virtual Contact File)是一種電子名片的標準格式,副檔名為 .vcf。幾乎所有智慧型手機和郵件客戶端都原生支援 vCard,包括: 📱 iPhone:自動識別並提示「加入聯絡人」 🤖 Android:透過聯絡人 App 匯入 💻 電腦:Outlook、Apple Mail、Gmail 等都支援 vCard 3.0 格式範例 BEGIN:VCARD VERSION:3.0 FN:Kevin Dai N:Dai;Kevin;;; ORG:LINE Taiwan TITLE:Software Engineer TEL;TYPE=WORK,VOICE:+886-123-456-789 EMAIL;TYPE=WORK:[email protected] ADR;TYPE=WORK:;;Taipei, Taiwan;;;; NOTE:Met at DevFest 2025 END:VCARD QR Code + vCard 的優勢 將 vCard 編碼成 QR Code 有幾個好處: ✅ 一掃即加:相機 App 掃描後自動識別 ✅ 跨平台:iPhone/Android 都支援 ✅ 無需下載:不用儲存檔案再匯入 ✅ 資料完整:包含所有聯絡資訊和備註 ✨ 專案功能介紹 核心功能流程 使用者上傳名片圖片 ↓ Gemini Vision API 辨識 ↓ 儲存到 Firebase Realtime Database ↓ 顯示名片 Flex Message ↓ 【新功能】點擊「📥 加入通訊錄」按鈕 ↓ 生成 vCard QR Code ↓ 上傳到 Firebase Storage ↓ 回傳 QR Code 圖片給使用者 ↓ 使用者掃描 → 加入通訊錄 ✅ 新增功能亮點 📥 一鍵生成 QR...
繼續閱讀

LINE Messaging API 新功能介紹: Mark as Read API 讓你的聊天機器人標記訊息已讀

在 2025 年 11 月 5 日,LINE Messaging API 推出了新的功能,讓聊天機器人可以將用戶發送的訊息標記為已讀。這項功能的推出,讓開發者能夠為用戶提供更好的互動體驗,用戶可以清楚知道機器人是否已經「看過」他們的訊息。 前言 以往在回應設定中,如果開啟了聊天,希望可以用真人來回覆客戶的話。這個時候,由於系統是允許「真人聊天」跟「聊天機器人」是共存的。但是如果這個聊天選項打開的話,直到真人打開聊天視窗之前,即便客戶的訊息已經被聊天機器人處理了,他也不會標示成「已讀」。 這一篇文章就要跟大家分享,這一個新功能開放後。該如何應用這個新的 API 。 新 API 功能介紹 已讀標記功能 當用戶發送訊息給 LINE 官方帳號時,機器人現在可以主動將訊息標記為已讀狀態。這讓用戶在聊天介面上可以看到「已讀」的指示,就像一般的 1 對 1 聊天一樣。這項功能特別適合用於: 客服機器人:讓用戶知道他們的問題已經被機器人接收並處理 訂單通知機器人:確認用戶的訂單查詢已被讀取 互動式問答機器人:提供更自然的對話體驗 SDK 版本需求 line-bot-sdk-go/v8: v8.18.0 或更新版本 Go: 1.24 或更新版本 新增 API 規格 LINE Messaging API 新增了兩個標記已讀的 API: MarkMessagesAsRead 使用 userId 來標記特定用戶的所有未讀訊息為已讀。 端點: POST https://api.line.me/v2/bot/message/markAsRead 請求參數: { "chat": { "userId": "U1234567890abcdef1234567890abcdef" } } MarkMessagesAsReadByToken (本文重點) 使用訊息專屬的 markAsReadToken 來標記特定訊息為已讀,更精確也更安全。 端點: POST https://api.line.me/v2/bot/message/markAsRead/token 請求參數: { "markAsReadToken": "abc123def456..." } 新 API 欄位介紹 markAsReadToken 欄位 LINE Messaging API v8.18.0 在各種訊息內容中新增了 markAsReadToken 欄位: TextMessageContent.markAsReadToken: 文字訊息的已讀標記 token StickerMessageContent.markAsReadToken: 貼圖訊息的已讀標記 token ImageMessageContent.markAsReadToken: 圖片訊息的已讀標記 token VideoMessageContent.markAsReadToken: 影片訊息的已讀標記 token AudioMessageContent.markAsReadToken: 音訊訊息的已讀標記 token FileMessageContent.markAsReadToken: 檔案訊息的已讀標記 token LocationMessageContent.markAsReadToken: 位置訊息的已讀標記 token 每個訊息都會有一個唯一的 markAsReadToken,機器人可以使用這個 token 來標記該訊息為已讀。 如何使用 Golang 來開發相關部分 以下是使用 Golang 實作 Mark as Read 功能的完整範例程式碼: (請注意 github.com/line/line-bot-sdk-go/v8 需要更新到 8.18.0 之後) 範例程式碼在:https://github.com/kkdai/linebot-mark-as-read 實作方式:使用 Quick Reply + Postback 本範例採用使用者友善的互動方式:在每則回覆訊息上加上「Mark as Read」快速回覆按鈕,讓使用者可以主動選擇要將哪些訊息標記為已讀。 步驟 1: 接收訊息並提取 markAsReadToken case webhook.TextMessageContent: // 從訊息內容中取得 markAsReadToken markAsReadToken := message.MarkAsReadToken log.Printf("Received text message with...
繼續閱讀

[Python] 用 Python + Gemini File Search 打造智能文件助手 LINE Bot:讓 AI 幫你讀文件

前情提要 在工作和生活中,我們經常需要處理大量的文件:會議記錄、技術文件、合約、研究報告等等。每次要找特定資訊時,都得翻開文件一頁一頁找,既費時又容易遺漏重點。 最近 Google 推出了 Gemini File Search API,讓 AI 可以直接分析上傳的文件並回答問題。我想到,如果能結合 LINE Bot,讓大家透過最常用的通訊軟體就能「問」文件問題,那不是很方便嗎? 想像一下這些場景: 📄 會議記錄:「這次會議的主要決議是什麼?」 📊 技術文件:「這個 API 的參數有哪些?」 🖼️ 圖片內容:「這張圖片裡有什麼?」 📑 研究報告:「這份報告的結論是什麼?」 於是我決定動手打造這個「智能文件助手 LINE Bot」,讓 AI 成為你的私人文件分析師! 專案程式碼 https://github.com/kkdai/linebot-gemini-file-search (透過這個程式碼,可以快速部署到 GCP Cloud Run,享受無伺服器的便利) 📚 關於 Gemini File Search 基本介紹 Gemini File Search 是 Google DeepMind 於 2025 年 11 月 6 日推出的全新工具,直接內建在 Gemini API 之中。這個工具是一套全託管的 RAG(檢索增強生成,Retrieval-Augmented Generation)系統,目標是讓開發者能更簡單、有效率地將自己的資料與 Gemini 模型結合,產生更精確、相關且可驗證的 AI 回應。 主要特色 簡化開發流程 File Search 免去自行搭建 RAG 管線的麻煩,開發者只需專注於應用程式本身。檔案儲存、分段(chunking)、嵌入(embedding)及檢索等繁瑣細節都自動處理。 強大的向量搜尋 採用最新的 Gemini Embedding 模型,可理解使用者查詢的語意與上下文,找出最相關的資訊,即使關鍵字不同也能命中答案。 自動引用來源 AI 回應會自動附上出處,明確標示答案引用自哪一份文件、哪一段內容,方便核對與驗證。 廣泛格式支援 支援 PDF、DOCX、TXT、JSON 及多種程式語言檔案等主流格式,方便建立多元知識庫。 輕鬆整合 可直接在 generateContent API 中使用,且有完善的 Python SDK,開發者能快速上手。 📚 專案功能介紹 核心功能 📤 多格式檔案上傳 支援文件檔案:PDF、Word (DOCX)、純文字 (TXT) 等 支援圖片檔案:JPG、PNG 等(利用 Gemini Image Understanding 圖片內容) 自動處理中文檔名,避免編碼問題 即時回饋上傳狀態 🤖 AI 智能問答 基於 Google Gemini 2.5 Flash 模型 從上傳的文件中搜尋相關內容並回答 支援繁體中文、英文等多語言 理解上下文,提供精準回答 👥 多對話隔離 1對1聊天:每個人有獨立的文件庫(完全隔離) 群組聊天:群組成員共享文件庫(協作查詢) 自動識別對話類型,無需手動設定 File Search Store 自動建立和管理 📁 檔案管理功能 Quick Reply 快速操作:上傳成功後提供快捷按鈕 明確檔案指定:Quick Reply 自動帶入檔案名稱 🔄 智能錯誤處理 檔案上傳失敗自動重試 沒有文件時引導使用者上傳 詳細的錯誤日誌記錄 💻 核心功能實作 1. File Search Store 的自動管理 這是整個系統的核心,負責管理每個使用者或群組的文件庫。 Store 命名策略...
繼續閱讀