盡信書不如無書
在跟著官方步驟完成後,這些也是我們要注意的事情
你應該會收到 github 給你的警告通知
,今天會說明如何閱讀這個通知並解決他學會改寫,拒絕只當 copycat
2.1 分析官方範例程式
2.2 取得自己的 spreadsheetId 並加入程式
2.3 撰寫函式 listMySheet
來讀取自己的 sheet
相依套件版本過低造成的警告
根源就是昨天安裝的 googleapis
這個套件官方是指定我們安裝 39
這個版本的最新的套件已經來到了 59
這個版本整整差了 20 個大版
,雖然每次更新版本都會有 release note,但我相信會認真看的沒有幾個,所以這20個大版本改了多少功能也是我們所不清楚的,固定的版本可以給你穩定的功能,但是潛在的漏洞你無法知曉,所以如果在確認最新版本功能穩定的狀態下我會更新套件
yarn add googleapis@59
每次更新版本後記得執行程式確認有無異常
node tools/google_sheets/index.js
nvm install 12.19
nvm use 12.19
以下說明建議你打開昨日的範例程式方便相互印證
首先要理解 Google 提供範例程式,理解程式最快的方式的就是從輸出結果的位置開始回推
,所以我反推的順序會是:
程式的根源
:要先要取得憑證才能 authorize(授權) → fs.readFile('tools/google_sheets/credentials.json'...)
根據上面的架構分析,我們先觀察輸出console.log()的函式: listMajors
,裡面有兩個參數我們要特別注意:
知道要處理的參數後我們就能開始改寫了,步驟:
listMySheet
讀取自己的sheetlistMajors
這隻函式的註解
/**
* Prints the names and majors of students in a sample spreadsheet:
* @see https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
* @param {google.auth.OAuth2} auth The authenticated Google OAuth client.
*/
spreadsheetId
的參數
spreadsheetId: '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms'
就會發現 spreadsheetId
這個參數在範例網址中間:1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
/edit把 spreadsheetId 替換成自己的
(實際網頁位置如下圖紅框處)spreadsheetId: process.env.SPREADSHEET_ID
spreadsheetId 複製起來放到 .env 裡面設定為環境變數
,以下是目前環境檔需要做的設定
#填寫自己登入IG的真實資訊(建議開小帳號來實驗,因為帳號使用太頻繁會被官方鎖住)
IG_USERNAME='ig username'
IG_PASSWORD='ig password'
#填寫自己登入FB的真實資訊(建議開小帳號來實驗,因為帳號使用太頻繁會被官方鎖住)
FB_USERNAME='fb username'
FB_PASSWORD='fb password'
#FB跑經典版還是新版(classic/new)
FB_VERSION='new'
#填寫你目標放入的spreadsheetId
SPREADSHEET_ID='your spreadsheetId'
listMySheet
來讀取自己的 sheetconsole.log('Name, Major:');
// Print columns A and E, which correspond to indices 0 and 4.
rows.map((row) => {
console.log(`${row[0]}, ${row[4]}`);
});
改寫成非同步函式listMySheet()
async function listMySheet (auth) {
const sheets = google.sheets({ version: 'v4', auth });
const title = '我的sheet'//請你更改成自己設定的sheet(工作表)名稱
const request = {
spreadsheetId: process.env.SPREADSHEET_ID,
range: [
//這是指抓取的範圍,你也可以改寫成A1:A300(抓第1欄的第1列到第300列)
`'${title}'!A:ZZ`
],
valueRenderOption: "FORMULA"//FORMATTED_VALUE|UNFORMATTED_VALUE|FORMULA
}
try {
//這裡改寫為await,之後會有順序執行的需求
let values = (await sheets.spreadsheets.values.get(request)).data.values;
console.log(values)
} catch (err) {
console.error(err);
}
}
valueRenderOption 這個參數是把資料抓出來時的類型,感興趣可參考Google官方文件
node tools/google_sheets/index.js
我在 Medium 平台 也分享了許多技術文章
❝ 主題涵蓋「MIS & DEVOPS、資料庫、前端、後端、MICROSFT 365、GOOGLE 雲端應用、個人研究」希望可以幫助遇到相同問題、想自我成長的人。❞
在許多人的幫助下,本系列文章已出版成書,並添加了新的篇章與細節補充:
- 加入更多實務經驗,用完整的開發流程讓讀者了解專案每個階段要注意的事項
- 將爬蟲的步驟與技巧做更詳細的說明,讓讀者可以輕鬆入門
- 調整專案架構
- 優化爬蟲程式,以更廣的視角來擷取網頁資訊
- 增加資料驗證、錯誤通知等功能,讓爬蟲執行遇到問題時可以第一時間通知使用者
- 排程部分改用 node-schedule & pm2 的組合,讓讀者可以輕鬆管理專案程序並獲得更精確的 log 資訊
有興趣的朋友可以到天瓏書局選購,感謝大家的支持。
購書連結:https://www.tenlong.com.tw/products/9789864348008