前言
如同上一篇 Line Bot + 爬蟲學習心得所言,Line Bot 的500則/月訊息限制,實在讓人有點壓力,怕一個不小心就要付費了,看到許多人推薦 Line Notify 作為替代方案,且可以自動推播訊息,對使用者而言更加輕便。此篇仍著重於為什麼做這個選擇,以及學習到的新知等等。
為什麼選擇爬蟲?
在實作 Line Bot 時,為了處理第三方資料費盡苦心,又想到以前當網路編輯時,常聽到爬蟲,不如就趁現在實際操作一下爬蟲到底怎麼爬的,也可解決找不到資料的困擾。考慮 Line Notify 即時推播訊息的功能,所以爬蟲的資料應具有變動性才有使用需求。幾經考慮後決定爬蟲PTT soft-job 版,不只有徵才資訊,也有來自業界的討論。
套件選擇
request V.S. axios
查詢爬蟲文章,千篇一律都是 request + cheerio ,但 request 在今年 2 月已宣佈停止更新,找了替代方案後決定使用耳聞過的 axios。除了下載量大,可直接採用 Promise 的編寫方式也挺方便(不像 request 還要下載套件才能使用 Promise 方式撰寫)。
cheerio V.S. puppeteer
puppeteer 可模擬真人操作網頁的流程,如果想要擷取的資料,是需要經過一堆選擇及輸入後才能取得,那麼用 puppeteer 就很合適了。不過 PTT 排版簡潔俐落,不需經過額外的操作就可取得,所以用 cheerio 就行了,且 cheerio 的用法類似 jQuery ,沒用過 jQuery 的我很想趁機瞭解一下。
學習新知
在剛開始查詢 LINE Notify 資料時,一度陷入混亂,因為有些是連結 IFTTT 傳送資料,有些則是申請 LINE 發行的權杖傳送資料。我兩個方式都走了一趟,大致理解可整理如下。
LINE Notify 運作方式
使用者在拜訪開放者架設的網站(或 APP)後,會被導向至 LINE Notify 的授權頁面,透過 OAuth 授權成功後,就等同於使用者同意讓開發者架設的網站,存取使用其在 LINE 儲存的資料。此時 LINE Notify 也取得使用者的身分認證,它會回傳一個 code 給開發者的網站(或 APP),開發者再憑藉這組 code 向 LINE 取得 token ,拿到 token 後就等同得到許可證,可以向使用者發送通知了。(想瞭解 OAuth 運作方式可參考 .NET Walker 的文章)
在獲得認證後,還是需要透過 Messaging API 作為開發者與LINE Notify 之間的訊息傳遞,這時就需要 IFTTT 或申請 LINE Notify 的權杖協助。
IFTTT
IFTTT 全名為 if this then that,超白話的翻譯就是「如果觸發了什麼,那就執行什麼」, IFTTT 最方便的是,它串接了各大平台,凡舉 LINE、Facebook、YouTube、Google 等等,而且上面有各種小型應用程式,凡舉天氣預報、大雨通知,同步 Facebook 及 twitter 內容等等,幾乎一行程式碼都不用寫,就可完成通知服務。(稍微可惜的是,2020年9月開始僅可免費啟用3個 applet )
若要使用自己編寫的程式碼,則登入 IFTTT 後,先與 LINE 進行連動,在 if this then that 的 this 連結 webhooks 的服務,that 則連結 LINE NOTIFY,編寫程式碼設定觸發條件,並填入 webhooks 的金鑰即可發送訊息。
Line Notify 權杖(access token)
申請 LINE Notify 的權杖,其作用與上述 IFTTT 的連動相似,而接下來憑藉著 token (通行證)就可使用 Line Notify 的發送訊息服務。所以在撰寫程式碼時,務必挾帶 token ,不然 Line Notify 的 API 是不會幫忙傳送的。
碰到困難 — — axios 無法成功回傳資料
此專案使用 axios 爬蟲,篩選好資料後,再利用 axios 傳送至 Line Notify,我將爬蟲到的資料打包成 crawlerPtt() 函式,傳送至 Line Notify 的資料打包成 lineNotify() 函式,但奇怪的是,兩個函式單獨跑都沒問題,但若要將爬蟲到的內容交給 lineNotify() 送出,就一直顯示 undefined 。
經過各種查詢及詢問,才發現是 Promise 的 return 寫錯位置了,導致 lineNotify() 無法成功呼叫。
未來可改善的地方
現在的通知訊息是以時間為準,希望之後可改為爬蟲到的資料,觸發某條件後(譬如推文數大於10),再自動通知,私心希望有機會可以爬更多複雜的東西,譬如租屋網的房屋釋出訊息等等。另外,還是要再搞清楚 Promise 寫法,以及 async/await 的用法,不然常常卡在這邊實在不是辦法。
參考文獻
一次搞懂 OAuth 與 SSO 在幹什麼?
http://studyhost.blogspot.com/2017/01/oauthsso.html
自建 LINE Notify 訊息通知
https://www.oxxostudio.tw/articles/201806/line-notify.html
Returning data from Axios API
https://stackoverflow.com/questions/48980380/returning-data-from-axios-api