Puppeteer是用JS對Chrome Dev Tools的實現,可以用來操作Chrome瀏覽器,適用於爬蟲、自動化等領域。
以下是自己實現自動化登錄的代碼(基於ES6)
const puppeteer = require('puppeteer'); const axios = require('axios'); const config = require('./config'); const loginurl = config.loginurl; const user = config.user; const headless = false; const rize = require('rize'); var token; console.log(config); const browser = puppeteer.launch( { headless, executablePath: config.chromePath, args: ['--start-maximized', '--disable-infobars'] } ); async function login() { // 預先定義,在下面接受內層返回的brower對象 // 待內部變量傳出后,再給其賦值 var _token; await browser.then( async browser => { const loginPage = await browser.newPage(); var vfcode; // 閉包,內部可訪問外部的變量,之后將其傳出 var __token; await loginPage.setViewport({width:0, height:0}) await loginPage.on('requestfinished', request => { if (request.url().endsWith('Get_VerifyCode')){ request.response().json().then( (result) => { vfcode = JSON.parse(result).data.verifyCode; })}}); await loginPage.goto(loginurl); await loginPage.type('input[name="username"]', user[0]); await loginPage.type('input[name="password"]', user[1]); await loginPage.type('input[name="verificationCode"]', vfcode); await loginPage.click('span.mcenter.submitinner'); await loginPage.on('requestfinished', request => { if(request.url().endsWith('Post_Authenticate')){ request.response().json().then((result) => { __token = 'BasicAuth ' + JSON.parse(result).data.tokenID; }); } // 在這里卡了很久,因為異步,內部賦值總是要晚於外面的代碼,不得不加上等待,等待一會兒再返回token }).waitFor(500); // browser在其內部定義,須返回給上層 // console.log('____, ' ,_token); return __token; } ).then( (t) => {_token = t;}); return _token } login().then( result => { token = result; registerProj(); } );