因為我們需要用到前面節點的資料,但 RSS Read 節點的輸出是它自己抓到新聞的內容而已,所以我們用一個 Merge 節點把前面三個 If 節點和 RSS Read 節點都 Input。

再來要進入到最核心的節點,根據使用者點及主題選單的次數來回傳新聞:
這樣一來,可以讓使用者每次看到的新聞都是不重複的。
在剛剛的 Merge 節點輸出接一個 Code 節點,輸入以下程式碼:
const items = $input.all();
if (items.length < 21) {
return [];
}
const userData = items[items.length - 1].json;
// 主題中換英
const lastTopicCN = userData.lastTopicCN;
let lastTopicEN;
switch (lastTopicCN) {
case "國際":
lastTopicEN = "intworld";
break;
case "科技":
lastTopicEN = "technology";
break;
case "娛樂":
lastTopicEN = "stars";
break;
}
const topicValue = userData[lastTopicEN];
// 根據數值計算新聞的起始和結束索引
const startIndex = (topicValue - 1) * 3;
const endIndex = startIndex + 3;
// 提取前20則新聞,存取新聞資料
const newsItems = items.slice(0, 20).map(item => item.json);
// 根據計算出的索引,從新聞陣列中截取所需的新聞
const selectedNews = newsItems.slice(startIndex, endIndex);
return selectedNews;
Merge 節點會輸出 RSS Read 節點輸出的 20 則新聞,再加上一個符合的 If 節點輸出,所以總共會有 21 個 items ,假如 items 的數量少於 21,就直接回傳一個空陣列 [],表示沒有足夠的資料可以進行後續處理。items 陣列中的最後一個元素。(最後一次點擊的資料)If 節點傳來的主題從中文換成英文,方便去找欄位中的點擊次數。slice() 根據之前計算出的 startIndex 和 endIndex,從 newsItems 陣列中截取出三則新聞,並將這個結果回傳。舉例說明:
userData.lastTopicCN = "科技"
lastTopicEN = "technology"
userData.technology = 2 (這是從 userData 取得的數值,代表「第 2 組」新聞)startIndex = (topicValue - 1) * 3
startIndex = (2 - 1) * 3
startIndex = 1 * 3 = 3
endIndex = startIndex + 3
endIndex = 3 + 3
endIndex = 6
newsItems.slice(startIndex, endIndex) 進行截取,也就是 newsItems.slice(3, 6)
slice(3, 6) 會從陣列中選取索引為 3、4、5 的元素這段程式碼的步驟就是上面這樣。
後面的 HTTP Request (get link) 節點、Code (html) 節點、HTTP Request (to Gemini) 節點、Code (no /n) 節點、回傳給使用者訊息的 HTTP Request 節點,都和之前做最小可行的系統時,拿去給 AI 摘要的內容一樣,複製過來就好。
只需要稍作更改,把一些節點做合併(需要用到前面節點的輸出資料)。
之前我們是用 Gemini 1.5 Flash 來做摘要,但我發現他現在不能用了,所以我改成用 2.5 Flash。
將 HTTP Request (to Gemini) 節點的 URL 改成:https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent
恭喜你!我們已經做完主題選單的功能了,再來就是把全部功能連結起來,完整工作流會長這樣:
明天(Day 28)我們將會作最後收尾,並展示系統實際使用結果。