因為我們需要用到前面節點的資料,但 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)我們將會作最後收尾,並展示系統實際使用結果。