PuppenteerHelper 终端模拟

61 min read
/*
 * @Descripttion: 创建生成图片
 * @version: 1.0.0
 * @Author: falost
 * @Date: 2019-08-27 11:43:41
 * @LastEditors: falost
 * @LastEditTime: 2020-04-01 17:25:49
 */
import { launch } from 'puppeteer';
import { mkdirsSync } from '../../utils/utils';
import * as devices from 'puppeteer/DeviceDescriptors';
const iPhone = devices['iPhone 7'];

export default class PuppenteerHelper {
  async createImg(params) {
    const browser = await launch({
      headless: false, // 默认为 true 打开浏览器,设置 false 不打开
      args: [ '--no-sandbox', '--disable-setuid-sandbox' ],
      ignoreDefaultArgs: [
            '--enable-automation',
        ],
      // args: [
      //   '–disable-gpu',
      //   '–disable-dev-shm-usage',
      //   '–disable-setuid-sandbox',
      //   '–no-first-run',
      //   '–no-sandbox',
      //   '–no-zygote',
      //   '–single-process'
      // ]
    });
    mkdirsSync(params.path);
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36');
    await page.setDefaultNavigationTimeout(0);
    await page.emulate(iPhone);
    await page.setViewport({
      width: params.width,
      height: params.height,
      deviceScaleFactor: params.ratio,
    });
    if (params.url) {
        await page.goto(params.url, {
            waitUntil: 'load',
        });
    } else {
        await page.setContent(params.html);
        await this.waitForNetworkIdle(page, 50);
    }
    let filePath;
    if (params.fileType === 'path') {
      filePath = `${params.path}/${params.htmlRedisKey}.${params.imageType}`;
      await page.screenshot({
        path: filePath,
        fullPage: false,
        omitBackground: true,
      });
    } else {
      filePath = await page.screenshot({
        fullPage: false,
        omitBackground: true,
        encoding: 'base64',
      });
    }
    browser.close();
    return filePath;
  }
  waitForNetworkIdle(page, timeout, maxInflightRequests = 0) {
    page.on('request', onRequestStarted);
    page.on('requestfinished', onRequestFinished);
    page.on('requestfailed', onRequestFinished);

    let inflight = 0;
    let fulfill;
    const promise = new Promise(x => fulfill = x);
    let timeoutId = setTimeout(onTimeoutDone, timeout);
    return promise;

    function onTimeoutDone() {
      page.removeListener('request', onRequestStarted);
      page.removeListener('requestfinished', onRequestFinished);
      page.removeListener('requestfailed', onRequestFinished);
      fulfill();
    }

    function onRequestStarted() {
      ++inflight;
      if (inflight > maxInflightRequests) {
        clearTimeout(timeoutId);
      }
    }

    function onRequestFinished() {
      if (inflight === 0) {
        return;
      }
      --inflight;
      if (inflight === maxInflightRequests) {
        timeoutId = setTimeout(onTimeoutDone, timeout);
      }
    }
  }
}