Puppeteer实现自动登录

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

 

  

posted @ 2019-08-12 21:56  F君君  阅读(3585)  评论(2编辑  收藏  举报