2022年5月2日 星期一

每日要看的台銀美元網頁資訊(爬蟲)以line notify傳送

聊天通訊軟體流行已久, 網路資訊更是盛行三十載!

一直以來我們都想要整合這些資訊, 讓生活更便利。

從過去研究網路爬蟲就是抱持這想法初心, 一直到這篇文章才達到小成!

暨上篇文章不少好友說實用, 所以特別在這裡記錄更進一步的做法。

Google的試算表與其後端的app script編碼對我們來說能達到甚麼新的應用?

我們一直在前線, 更能敏銳的感覺到所帶來的創新!

舉例來說......

我們每日都會打開電腦, 打開某些網頁, 看某些資料訊息.....

我們每日都會打開電腦, 打開某些程式截取某些訊息與達成某些工作.....

而今, 如果在google apps script能達到的程度, 

我們將可以:

不用開電腦!不用開網頁!不用開程式!

不用花電費!不用花錢費力電腦維修!

它就會在完成我們指定的任務後, 將訊息傳到通訊軟體告知我們!

例如今天的範例........


首先我們要取得Line notify的token(權杖), 這可以參考上一篇文章, 或是網路上資源也很多。


我們先到Line建立個群組並把Line notify拉進聊天室

再來就是取得token

取得權杖後就可以來進行試算表後的GAS(google apps scrip)程式碼編寫,

如同前一篇, 到google雲端硬碟開啟新的試算表, 在上方的擴充功能中選取Apps Scrip

這裡為了快速讓大家上手, 我們將程式碼貼在本文的最後, 記得將其中標註的資訊改掉填上自己的。


記得要將cheerio函式庫裝到資料庫中, 如下面圖示

其Script ID為: 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0

程式碼在執行中會有安全性認證的過程, 再請參考前一篇的參考資料。




其中比較特別提出來說明的是程式碼中的:'輸入你的試算表發佈網址'

這邊先不用填寫, 在執行程式碼後, 回到試算表會看到表單已填入數字,

按照下列圖示操作即可取得自己的試算表發佈網址.....







另一點要說明的是程式碼這句:
 var releaseList = $("div > table > tbody > tr");//可以用copy selector來截取

小括弧中的"div > table > tbody > tr"是怎麼取得的?

這邊知道對各位之後要改寫到其他網頁也都有幫助,

操作方式如下列圖與圖說:






複製後的文字為:
#ie11andabove > div > table > tbody > tr:nth-child(1)
我們要填入括弧中的文字即為【div > table > tbody > tr】

tr之後的資訊nth-child(1)代表這是第一欄目
因為我們目的是為了抓取整個表格之後的所有資訊, 所以後方的資訊全部省略。
這段程式碼是要告訴我們的爬蟲現在要截取的資訊的【位置】
有點像找人的地址一般,這邊算是指定到【路】的階段。

更下面程式碼中的迴圈就是找到後續對應的每一門牌【號】
並將每個地址後面的資訊爬取出來,
各位可以參考,應該可對簡單爬蟲的知識能有更進一步了解!


到此就大致完成了,記得到左方的觸發條件去設定每天自動發line的時間喔
設定可以參考下圖:

然後執行程式就可以看到剛設定的line群組中提醒與點擊網址後看到的互動圖表:




祝順利!勞動節快樂!


以下為程式碼:

const line_notify_token = "輸入你的line notify token";

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("輸入你的工作表單名稱");
const url = '輸入你的試算表發佈網址'//試算表的圖表發佈網址

sheet.clear()//清空儲存格 非刪除不影響表單分享

function demoExecute(){
  var response = UrlFetchApp.fetch("https://rate.bot.com.tw/xrt/quote/l6m/USD");//目標網址
  var $ =Cheerio.load(response.getContentText(),{ decodeEntitiesfalse});

  writeToSheetDataForHeader();//要執行的外部function名稱

  var releaseList = $("div > table > tbody > tr");//可以用copy selector來截取
    for (let i =0i<releaseList.lengthi++){
      var usd = releaseList.eq(i);//截取單一資訊
      var date =usd.find('.text-center').find('a').text().trim();//日期
      var cashbuy = usd.find('td').eq(2).text().trim();//因為同樣字符位置有許多, 需用eq(n)指定 n從0開始
      var cashsell = usd.find('td').eq(3).text().trim();

      writeToSheetData(Object.assign({ date , cashbuy , cashsell})); //將資料寫入google sheets的外部function 

    }    
   
   doPost()//送LINEnotify的外部funtion
}

function writeToSheetDataForHeader() {
  sheet.appendRow(['日期''現金買入''現金賣出']);
}

function writeToSheetData(param) {
  sheet.appendRow([param.dateparam.cashbuyparam.cashsell]);
}

function doPost() {
    UrlFetchApp.fetch('https://notify-api.line.me/api/notify', {
        'headers': {
           'Authorization''Bearer ' + line_notify_token,
        },
        'method''post',
        'payload': {
            'message':'美金匯率圖' + url 
        }
    });
}