-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPup.js
executable file
·95 lines (87 loc) · 2.83 KB
/
Pup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const Puppeteer = require('puppeteer');
const FS = require('fs');
const Log = require('debug')('pup');
const BROWSER_PATH = '/usr/bin/chromium-browser';
class Pup {
async newPage() {
if (!this._browser) {
const options = {
headless: true,
ignoreHTTPSErrors: true,
args: [
'--no-sandbox',
//'--disable-setuid-sandbox',
//'--deterministic-fetch',
'--disable-extensions',
'--start-maximixed',
'--no-zygote',
'--no-proxy-server',
'--disable-gpu',
'--in-process-gpu',
'--disable-dev-shm-usage',
//'--proxy-server="direct://"',
//'--proxy-bypass-list=*',
'--user-data-dir=/tmp/pup'
],
dumpio: true
};
if (FS.existsSync(BROWSER_PATH)) {
options.executablePath = BROWSER_PATH;
}
this._browser = await Puppeteer.launch(options);
}
return await (await this._browser.createIncognitoBrowserContext()).newPage();
}
async connect(config) {
const page = await this.newPage();
config = Object.assign({
abortTypes: { image: true, stylesheet: true, font: true }
}, config);
await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37');
await page.setViewport({ width: 1920, height: 1080 });
await page.setExtraHTTPHeaders({ 'Accept-Language': 'en-us' });
if (config.abortTypes) {
await page.setRequestInterception(true);
page.on('request', req => {
const type = req.resourceType();
if (config.abortTypes[type]) {
Log('request aborted:', req.url(), type);
req.abort();
}
else {
req.continue();
}
});
}
if (Log.enabled) {
page.on('pageerror', err => Log('page error:', err.toString()));
page.on('error', err => Log('error:', err.toString()));
page.on('console', msg => Log('console:', msg.text()));
page.on('requestfinished', req => Log('requestfinished:', req.url()));
page.on('requestfailed', req => Log('requestfailed:', req.url()));
page.on('domcontentloaded', () => Log('domcontentloaded'));
page.on('load', () => Log('load'));
page.on('Xresponse', async res => {
try {
const data = await res.buffer();
Log('response:', res.url());
Log(` body: ${data.toString()}`);
}
catch (_) {
// Ignore errors caused by aborted requests
}
});
}
// Dismiss dialogs to they dont block the browser.
page.on('dialog', async dialog => {
dialog.dismiss();
});
return page;
}
disconnect(page) {
page.close();
page.removeAllListeners();
page.browserContext().close();
}
};
module.exports = new Pup();