在 LINE 群組討論聚餐時,最耗時的往往是收集餐廳資訊並整理成清單。即使有了關鍵字,手動切換 Google Maps 複製地址、評分與連結依然繁瑣。透過 n8n 串接 Apify 爬蟲工具與 Gemini AI ,我們能讓 LINE OA 化身專業美食編輯:只要輸入關鍵字,系統便會自動抓取地圖數據,並由 AI 撰寫成具備雜誌質感的推薦報告,甚至直接寄送到您的 Gmail 信箱存檔,徹底自動化您的探店工作流。
什麼是 Apify ?
Apify 是一個集網頁爬蟲、自動化與雲端運行於一體的生態平台,透過豐富的現成工具(Actors)與強大的抗封鎖技術,讓使用者能高效採集網頁數據,並輕鬆串接至 AI 或各種自動化工作流中。
我們將延續「 如何用 n8n 自動備份 LINE 圖片與檔案至 Google 雲端硬碟」、「如何用 n8n 自動轉譯 LINE 群組語音訊息」的節點流程,進一步擴充 LINE OA 的功能。
如何配置 Apify 雲端爬蟲環境
步驟 1:進入 「 Apify 」 官方網站,點選右上角的 「 Get started 」 註冊帳戶。
步驟 2:登入後在 「 Apify Store 」 搜尋並選取 「 Google Maps Scraper 」 工具。
補充:介面左下角 Usage 為已使用額度及每月贈 5 美金的免費使用額度。
步驟 3:進入工具介紹頁面,確認該工具支援抓取商家名稱、評分、評論及圖片等細節。
補充:如需使用其他工具時也可以此方式,確認功能是否符合需求。
步驟 4:在 「 Form 」 模式下嘗試設定搜尋參數,包含地點需求 「 restaurant 」 、地點 「 Taipei, Taiwan 」 並將語言設為 「 繁體中文 」。
補充:此工具的搜尋字詞包含:「搜尋需求及地點」。
步驟 5:切換至 「 JSON 」 頁面預覽參數結構(為稍後 n8n 撈取資料時參考寫法),並點選右上方 「 Save & Start 」 試執行。
補充:初次使用工具時,建議都可以在 apify 先執行一次,以確認撈取的資料符合需求。
步驟 6:執行完成後,在 「 Output 」 頁面確認爬蟲已成功抓取多間商家的詳細數據資料。如選擇「Export」則可以將資料直接匯出。
補充:此時可以觀察左下角的使用量,以確保接下來的使用額度。
步驟 7:點選左側選單最下方的 「 Settings 」 按鈕。
步驟 8:進入 「 API & Integrations 」 分頁,點選圖示複製您的 「 Personal API tokens 」 供 n8n 串接使用。
如何在 n8n 設定關鍵字觸發邏輯
步驟 1:進入 n8n 工作流列表,點選 「 My workflow 」 進入先前已建立的處理流程。
步驟 2:在畫布中點選 「 Webhook 」 節點進入設定介面。
步驟 3:複製 「 Test URL 」 網址,並前往 LINE Developers 後台將 「 Webhook URL 」 欄位內容更換為此測試網址後點選 「 Update 」。
補充:由於後續需進行資料傳輸確認,故先將 LINE 後台的正式連結切換為測試連結。
步驟 4:在畫布選取 「 Filter 」 節點,點選右鍵選單中的 「 Duplicate 」 進行複製。
步驟 5:將新複製的 「 Filter3 」 節點分支連接至 「 Webhook 」 的輸出端點,建立探店處理路徑。
步驟 6:開啟 「 Filter3 」 ,設定篩選條件為訊息內容 「 text 」 必須 「 contains 」(包含) 關鍵字 「 好評推薦: 」。例如:輸入「好評推薦:台北不限時咖啡廳」才會進入此工作流。
步驟 7:點選「Execute step」接著在LINE OA 輸入任一包含「好評推薦:」字詞(如:「好評推薦:台北拉麵店」)確認此節點設置成功。
步驟 8:複製語音流程的 「 Code in JavaScript 」 節點並連線至 「 Filter3 」 輸出端點。
步驟 9: 此節點用來設定允許特定群組 ID 執行功能,若為新增節點可輸入以下程式碼。(群組 ID 我們將在後續步驟設定)
程式碼:
// ⚠️ Configuration: Add Allowed Group IDs here
const allowedGroups = [
'C_GROUP_ID_1_HERE', // Support Group 1
'C_GROUP_ID_2_HERE', // Support Group 2
];
const event = items[0].json.body.events[0];
const sourceId = event.source.groupId || event.source.userId;
const sourceType = event.source.type;
// 1. Allow Direct Messages (LINE OA itself / 1-on-1)
if (sourceType === 'user') {
return items;
}
// 2. Allow Specific Groups
if (allowedGroups.includes(sourceId)) {
return items;
}
// 3. Block everything else
return [];
如何串接 Apify 節點執行地圖搜尋
步驟 1:在畫布點選 「 + 」 圖示搜尋並選取 「 Apify 」 節點,首次使用需點選右上角 「 Install node 」安裝。
步驟 2:在動作清單中選擇 「 Run an Actor 」 準備執行特定的爬蟲任務。
步驟 3:開啟 「 Credential to connect with 」 下拉選單,點選 「 + Create new credential 」。
步驟 4:將連線方式改為 「 API Key 」 ,貼上剛才在 Apify 複製的金鑰並點選 「 Save 」。
補充:如選擇「OAuth2」會跳出 Apify 登入的視窗,完成登入即驗證完成,不需輸入 API Key。但如果是透過其他平台如 Zeabur 則建議 API Key 驗證方式。
步驟 5:在 「 Actor Source 」 選擇 「 Apify Store Actors 」 ,並在 「 Actor 」 清單搜尋並選取 「 Google Maps Scraper 」 。
步驟 6:在 「 Input JSON 」輸入以下搜尋條件,並將左側稍早在 LINE 原始文字拖曳至 JSON 內。
補充:JSON 的寫法可以在 Apify 介面選好搜尋條件後複製,以下搜尋條件為搜尋:「LINE傳入的字詞」、台灣地區、近一1個月、評分4.2顆星以上、最新的前 10 則評論。
JSON:
{
"searchStringsArray": [
"{{ $json.body.events[0].message.text }}"
],
"locationName": "Taiwan",
"maxCrawledPlacesPerSearch": 50,
"language": "zh-TW",
"minRating": 4.2,
"maxReviews": 10,
"reviewsSort": "newest",
"includeReviews": true,
"reviewsStartDate": "1 month"
}
步驟 7:在搜尋字詞後方加入以下程式碼,以清理字串「好評推薦:」避免影響搜尋。接著選擇「Execute step」執行搜尋。
程式碼:
.replace('好評推薦:', '').trim()
如何彙整與處理爬蟲數據
步驟 1:在 「 Run an Actor 」 節點後方點選 「 + 」 圖示,選取 Apify 的 「 Get dataset items 」 動作。
步驟 2:左側搜尋「id」將前一節點產出的 「 defaultDatasetId 」 拖曳至「Dataset ID 」欄位中,並執行 「 Execute step 」 抓取完整列表。
步驟 3:在畫布搜尋並新增 「 Aggregate 」 節點,準備將多筆分散的商家資料合併。
步驟 4:合併方式選擇「 All Item Data (Into a Single List) 」 ,並在 「 Include 」 欄位選擇 「 Specified Fields 」。
步驟 5:在 「 Fields To Include 」 填入欲獲取的欄位,如 「 title, totalScore, reviewsCount, reviews, address, url 」 等。接著點選「Execute step」執行資料合併。

如何利用 Gemini 編輯美食報告
步驟 1:在畫布搜尋並新增 「 Basic LLM Chain 」 節點,作為 AI 邏輯處理中心。
步驟 2:將 「 Aggregate 」 節點彙整後的資料「data」拖曳至「 Prompt (User Message) 」 區塊。
步驟 3:點選 「 Add prompt 」 。
步驟 4:在「Message」輸入 AI 角色設定指令。開啟右側 Webhook 節點將 「 text 」 拖曳至指令中,並依照下方指示詞設定格式。
補充:此指示詞包含 AI 最終彙整資料的呈現格式及內容。
指示詞:
你是一位專業的美食雜誌編輯。以下是本月「{{ $('Webhook').item.json.body.events[0].message.text }}」的最新數據資料庫:
請為我撰寫一份「{{ $('Webhook').item.json.body.events[0].message.text }}」。請分析數據,挑選出「近期評論最熱絡」且「位於該地區」的前 10 名。
【嚴格過濾條件】
排除任何明顯非目標地區的地址。
必須推薦滿 10 間,不足則有多少列多少。
【輸出格式要求】 請直接輸出一份完整的 HTML Email 代碼 (不要包含 ```html 標記):
整體佈局:
背景使用淺灰色 (#f5f5f5),主容器寬度上限 600px,置中對齊。
標題下方每一間店佔用一個白色背景 (#ffffff) 的橫向卡片。
卡片排版 (橫向並排):
使用 <table> 標籤實現「左圖右文」。
左側欄 (圖片):寬度佔 40%。使用 imageUrl,設定 border-radius: 8px;,確保圖片充滿容器且不變形 (object-fit: cover)。
右側欄 (資訊):寬度佔 60%,左邊距 15px。
🏠 店名:字體加粗,顏色 #333333。
⭐ 評分優化:使用 HTML 實體符號 ★ 代替 Emoji。樣式:color: #ffcc00; font-size: 16px; font-weight: bold; line-height: 1;(確保星星邊緣銳利不糊掉)。
📍 地址:顯示 address,字級略小。
📝 推薦理由:綜合 reviews 分析,用 25 字內繁體中文精簡描述亮點。
🔗 按鈕:在右下角顯示一個藍色背景的「查看地圖」小按鈕。
樣式約束:
卡片之間設定 15px 的間距。
卡片需有圓角 10px 與細微陰影。
步驟 5:接著開啟右側 Aggregate 節點將「data」合併的資料拖曳至指示詞。
指示詞:
你是一位專業的美食雜誌編輯。以下是本月「{{ $('Webhook').item.json.body.events[0].message.text }}」的最新數據資料庫:{{ JSON.stringify($json.data) }}
請為我撰寫一份「{{ $('Webhook').item.json.body.events[0].message.text }}」。請分析數據,挑選出「近期評論最熱絡」且「位於該地區」的前 10 名。
步驟 6:點選 「 Basic LLM Chain 」 下方的 「 + 」 圖示,新增 「 Google Gemini Chat Model 」 節點。
步驟 7:將模型設定為 「 gemini-2.5-flash 」 ,確保生成內容具備高效且精準的繁體中文表達。
補充:由於上一篇已建立 Google API Key 憑證,故不需再次建立。
如何自動寄送推薦郵件至 Gmail
步驟 1:在 AI 節點後方新增 Gmail 的 「 Send a message 」 節點。
步驟 2:點選 「 Credential to connect with 」 下的 「 + Create new credential 」 建立憑證。
步驟 3:選擇 「 OAuth2 」 連線方式,點選下方 「 Sign in with Google 」 進行帳號連動。
步驟 4:選取您的 Google 帳號並核對權限要求後,點選下方 「 繼續 」 完成授權。
步驟 5:在 「 To 」 欄位填入您的收件信箱,並在 「 Subject 」 欄位利用語法設定動態主旨為今天的年/月。
補充:如希望多位收件人以半形逗點分隔即可。
輸入:
{{ $today.format('yyyy年MM月') }}
步驟 6:開啟「Webhook」節點>text 拖曳至主旨後一空格, 將主旨 與 LINE 傳入的關鍵字結合。如輸入:好評推薦:台北拉麵店,則信件主旨則為「好評推薦:台北拉麵店 2026年02月」。
步驟 7:「 Email Type 」 設定為 「 HTML 」。將 AI 產出的 「 text 」 內容拖曳至 「 Message 」 欄位引用,點選 「 Execute step 」 執行寄送測試。
補充:地圖搜尋執行需 2-3 分鐘的時間。
步驟 8:登入 Gmail 確認已成功收到一封包含商家圖片、評分與 AI 評論的美食清單郵件。
如何同步回傳 LINE 通知寄件成功
步驟 1:複製原本用於回覆的 「 HTTP Request 」 節點,連線至 Gmail 節點後方。
步驟 2:在 「 JSON 」 內容的 「 text 」 欄位中,設定一條確認訊息告知使用者報告已寄出。
指示詞:
「✅ 您的美食研究報告已寄出!\n📧 請查看您的 Gmail 信箱。」


