聊天通訊軟體流行已久, 網路資訊更是盛行三十載!
一直以來我們都想要整合這些資訊, 讓生活更便利。
從過去研究網路爬蟲就是抱持這想法初心, 一直到這篇文章才達到小成!
暨上篇文章不少好友說實用, 所以特別在這裡記錄更進一步的做法。
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(),{ decodeEntities: false});
writeToSheetDataForHeader();//要執行的外部function名稱
var releaseList = $("div > table > tbody > tr");//可以用copy selector來截取
for (let i =0; i<releaseList.length; i++){
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.date, param.cashbuy, param.cashsell]);
}
function doPost() {
UrlFetchApp.fetch('https://notify-api.line.me/api/notify', {
'headers': {
'Authorization': 'Bearer ' + line_notify_token,
},
'method': 'post',
'payload': {
'message':'美金匯率圖' + url
}
});
}