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();
}
);
