Telegram Bot (2) 上班看盤不用怕老闆

透過 Node.js、Puppeteer 與簡易 Telegram API 讓機器人協助你取得台股即時資訊

YY
7 min readOct 6, 2020
Photo by Gilly on Unsplash

如果你是一個生性內向,對於在擁擠的人潮中打開一片綠的自選股感到不自在的人;還是上班時間總要假借裝水上廁所才有一刻能打開看盤軟體看看今天晚上有沒有便當錢吃飯還是要先準備紙箱;或是跟朋友用 Telegram 聊到某隻股票時都要先準備好相關圖表連結或 App 截圖,那你可以試試自己開發一個 Telegram 機器人或試試這個

若你還不知道 Telegram bot 能做哪些應用以及要開發一個 bot 該如何下手,可以參考前篇介紹,此篇將延續講解如何透過先前提及的 API 做出個簡單的股市機器人以及其功能概覽

技術使用

誠如首段所述,在功能面上希望能透過 bot 來拿到個股、大盤的即時走勢圖、報價、五檔、K 線圖等等,可以在擁擠的捷運上或老闆坐在後面的辦公室快速的瞄一眼即時行情,同時也能直接在 Telegram 內使用 bot 拿到的圖表、資料跟朋友做交流

技術上則選擇了以 Node.js 為基底搭配 node-telegram-bot-api 來操作 Telegram bot,再輔以 Puppeteer、cheerio 來抓取各資料源的圖表、相關資料提供給使用者,最後再使用 docker-puppeteer 處理 Puppeteer 執行 chrome/chromium 的環境問題

功能概覽

Loading toast

由於要截圖、傳圖會花比較多時間與效能,為了減輕使用者等待的不安感與不耐煩,加上個很土炮的 loading 訊息

也就是當 bot.onText 接受到的 command 是要花比較多時間處理的,就先送出一則 loading 訊息,等資料/圖片處理好再刪除 loading 並把使用者要求的資料送出

bot.onText('/foo', async (msg) => {
const chatId = msg.chat.id
const { message_id } = await bot.sendMessage(chatId, 'loading')
// wait for fetching data or taking a screenshot via puppeteer
bot.deleteMessage(chatId, message_id)
// send data/photo to user
})

走勢圖

使用者傳送 /chart ${stockId} /chart_tse /chart_otc 時,使用 Puppeteer screenshot 擷取對應股號/大盤的盤中走勢圖,再把圖片丟回給使用者

就是簡單的一問一答,利用 bot.onText 接訊息再把拉到的圖表以 bot.sendPhoto 回傳給使用者,送禮自用兩相宜

文字報價及五檔

一樣是單純的接收 (bot.onText) 特定指令 (/text ${stockId} /text_tse /text_otc) 再回傳 (bot.sendMessage) 對應的個股、大盤資訊,並使用 HTML 來 parse 做簡易排版。沒有折線圖,沒有高對比的黑紅綠,讓你可以更低調的監控當天晚上的便當錢賺到了沒

K 線圖

跟走勢圖做法一樣,使用 Puppeteer 去不同的地方截到 K 線圖回傳給使用者,也是提供了 /k ${stockId} /k_tse /k_otc 三種類型的查詢方式

個股相關新聞

/news ${stockId},透過 fetch、cheerio 去 parse 出個股新聞列表,再以 parse_mode: 'HTML', disable_web_page_preview: true 將簡易排版過的清單送出給使用者

盤後資料

個股:

使用 /after_hours ${stockId} 來取得指定個股的盤後資料,作法與上方走勢圖、K 線圖一樣

整體:

當不輸入股號直接下 /after_hours 則會在 sendMessage 帶上 reply_markupinline_keyboard 給予使用者多個選擇,再使用 bot.on('callback_query') 來監聽使用者選了哪個選項進而去擷取對應的圖表回來,而後以 sendPhoto 回傳

另外可以注意到的是當使用者按下 inline keyboard 的按鈕後,上方會有原生的 loading toast,這時需要使用 bot.answerCallbackQuery 來結束他的 loading 狀態

Inline Mode

在任 channel 中輸入 @+bot username 會發出 inline_query 事件,而在 bot 中可透過 bot.on('inline_query') 接到事件再以 answerInlineQuery 來回船要顯示項目清單以及使用者選擇後要送出的內容

目前支援了不輸入內容則查詢大盤報價,輸入股號則查詢個股報價以及相關新聞

要注意的是,若要使用 inline mode,請先去找 BotFather 啟用此功能,操作方法可參考前篇文章

以上就是關於這個小玩具的一些介紹,以及如何透過簡單的 bot API 來讓你的人生更懶一點

感謝你的閱讀,如果你喜歡這篇文章的話可以拍 11 下手,不喜歡的話可以拍 1 下再分享給 5 個人,若你還沒看過前篇文章且對 Telegram bot 入門有興趣也歡迎速速前往閱讀

--

--

YY
YY

Written by YY

為五斗米折腰的前端打雜仔

No responses yet