你已經成功建立了一個可以根據訂閱主題,定時推播新聞的 LINE Bot。今天,我們要讓它變得更聰明!
我們將為你的 Bot 賦予全新的關鍵字搜尋功能。這個功能將讓使用者可以直接輸入感興趣的關鍵字,Bot 便會立刻從新聞資料庫中篩選出相關的報導,讓新聞服務從被動推播轉為主動搜尋。
今天是我們做新功能的第一天!凡事起頭難,今天要好好跟著做喔~先說一下大概的流程:
解析關鍵字 → 獲取訂閱主題 → 讀取 RSS 來源 →獲取新聞內文 → 遍歷新聞 → 格式化訊息 → 傳送回覆
在 Code
節點後面新增一個 If
節點,並輸入以下條件:
多加一個 If
節點是為了讓使用者輸入含有「訂閱」的訊息時就跑上面的節點,輸入其他的字詞時就跑下面的節點,不同功能走不同的路就很直觀,在之後測試的時候也比較好找錯誤。
在 true 分支連接試算表,和後面的訂閱邏輯;在 false 分支新增另一個 If 節點(關鍵字),條件如下圖所示:
若是使用者僅輸入「搜索」兩個字,不知道他要搜索的關鍵字詞是什麼,所以我們要在條件中加上:「訊息字數大於等於三」。
在此 If
節點的 false 分支連結之前接在訂閱邏輯中,最下面的 Http Request
節點,並將內容改為:
{
"replyToken": "[Execute previous nodes for preview]",
"messages": [
{
"type": "text",
"text": "我聽不懂您的指令,請輸入「訂閱XX」或「取消訂閱」,若想要搜索關鍵字請輸入「搜索XX」。"
}
]
}
原本 → 非取消訂閱且非訂閱;現在→ 非取消訂閱且非訂閱,而且非搜索。
在 If
節點(關鍵字)的 true 分支新增 Code
節點(Keyword),輸入以下程式碼:
const userMessage = $input.first().json.lineMessageBody[0].message.text;
const userId = $input.first().json.lineMessageBody[0].source.userId;
const replyToken = $input.first().json.lineMessageBody[0].replyToken;
const keyword = userMessage.replace("搜索", "").trim();
return {
json: {
userId,
keyword,
replyToken
}
};
這段程式碼的用意是把使用者訊息中的關鍵字提取出來。
再來就是要讀取試算表紀錄的訂閱主題,讓 Line Bot 根據你的訂閱主題來尋找新聞內文是否含有關鍵字。
在 Code
(Keyword)後面新增 Google Sheet
節點(Get Rows In Sheet),內容和之前設定固定時間傳訊息的一樣。
在 Google Sheet
節點後面新增一個 Code
節點(RSS URL),輸入以下程式碼:
const topic = $json.topic;
let rssUrl;
switch (topic) {
case "國際":
rssUrl = "https://feeds.feedburner.com/rsscna/intworld";
break;
case "科技":
rssUrl = "https://feeds.feedburner.com/rsscna/technology";
break;
case "娛樂":
rssUrl = "https://feeds.feedburner.com/rsscna/stars";
break;
case "取消":
rssUrl = "https://feeds.feedburner.com/rsscna/technology";
}
return {
json: { rssUrl, userId: $json.userId, keyword: $json.keyword }
};
這個節點會根據上個節點的輸出,得到使用者的訂閱主題,根據主題來搜索內文。
如果使用者訂閱科技新聞,那就會搜索所有屬於科技新聞的新聞內文。
使用者輸入:「取消訂閱」→ 主題:「取消」→ 恢復預設:「科技」主題
好啦~今天就先做到這邊吧!這幾個節點是「關鍵字搜索」功能的 1/3 而已,所以這裡也會花多一點篇幅來說明,希望今天的你實作也很順利!
明天(Day 19)我們要繼續作搜索功能的節點,前面會做關於 RSS 的內容,後面會做關於提取內文的內容。