iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
生成式 AI

打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!系列 第 28

【Day 27】主題選單功能(五)— 打造不重複新聞推播系統

  • 分享至 

  • xImage
  •  

因為我們需要用到前面節點的資料,但 RSS Read 節點的輸出是它自己抓到新聞的內容而已,所以我們用一個 Merge 節點把前面三個 If 節點和 RSS Read 節點都 Input。
https://ithelp.ithome.com.tw/upload/images/20250930/201780670QgiJOdj8U.png
https://ithelp.ithome.com.tw/upload/images/20250930/20178067nd4oqzeQHh.png

傳送新聞程式碼

再來要進入到最核心的節點,根據使用者點及主題選單的次數來回傳新聞:

  • 當使用者第一次點選某主題,回傳第一到三則該主題新聞
  • 當使用者第二次點選同一主題,回傳第四到六則該主題新聞
  • 當使用者第三次點選同一主題,回傳第七到九則該主題新聞

這樣一來,可以讓使用者每次看到的新聞都是不重複的。
在剛剛的 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;

程式碼說明:

  1. Merge 節點會輸出 RSS Read 節點輸出的 20 則新聞,再加上一個符合的 If 節點輸出,所以總共會有 21 個 items ,假如 items 的數量少於 21,就直接回傳一個空陣列 [],表示沒有足夠的資料可以進行後續處理。
  2. 設定使用者選擇的資料永遠是 items 陣列中的最後一個元素。(最後一次點擊的資料)
  3. 主題選單點擊次數的欄位名稱是英文,要把 If 節點傳來的主題從中文換成英文,方便去找欄位中的點擊次數。
  4. 計算新聞索引,第一則新聞的索引值是 0,以此類推,將起始索引設為(主題欄位的點擊次數 - 1) * 3結束索引設為(起始索引 + 3),每次都從新聞列表中選取連續的三則新聞
  5. 使用 slice() 根據之前計算出的 startIndexendIndex,從 newsItems 陣列中截取出三則新聞,並將這個結果回傳。

舉例說明:

  • userData.lastTopicCN = "科技"
  • lastTopicEN = "technology"
  • userData.technology = 2 (這是從 userData 取得的數值,代表「第 2 組」新聞)
  • startIndex = (topicValue - 1) * 3
  • 替換數字:startIndex = (2 - 1) * 3
  • 計算結果:startIndex = 1 * 3 = 3
  • 起始索引為 3,從陣列的第 4 個元素開始選取(因為陣列索引從 0 開始)
  • endIndex = startIndex + 3
  • 替換數字:endIndex = 3 + 3
  • 計算結果:endIndex = 6
  • 結束索引為 6
  • 程式碼會將前 20 則新聞(索引 0 到 19)放入一個陣列中
  • 然後使用 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 摘要的內容一樣,複製過來就好。
只需要稍作更改,把一些節點做合併(需要用到前面節點的輸出資料)。
https://ithelp.ithome.com.tw/upload/images/20250930/20178067Tvh25MS3Ml.png

之前我們是用 Gemini 1.5 Flash 來做摘要,但我發現他現在不能用了,所以我改成用 2.5 Flash。
HTTP Request (to Gemini) 節點的 URL 改成:
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent

完整工作流

恭喜你!我們已經做完主題選單的功能了,再來就是把全部功能連結起來,完整工作流會長這樣:
https://ithelp.ithome.com.tw/upload/images/20251001/20178067iyrqNvVcLu.png

下篇預告

明天(Day 28)我們將會作最後收尾,並展示系統實際使用結果。


上一篇
【Day 26】主題選單功能(四)— 判斷是否傳新聞
下一篇
【Day 28】n8n 自動化 LINE Bot:每日新聞小編的完整工作流與功能整合
系列文
打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言