parent
879cb32d30
commit
2cb284594f
@ -0,0 +1,20 @@
|
|||||||
|
class Browser {
|
||||||
|
constructor(options) {
|
||||||
|
this.options = options;
|
||||||
|
|
||||||
|
this.window = null;
|
||||||
|
this.document = null;
|
||||||
|
this.statusCode = null;
|
||||||
|
this.contentType = null;
|
||||||
|
this.headers = null;
|
||||||
|
this.statusCode = null;
|
||||||
|
this.contentType = null;
|
||||||
|
this.html = null;
|
||||||
|
this.js = null;
|
||||||
|
this.links = null;
|
||||||
|
this.scripts = null;
|
||||||
|
this.cookies = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Browser;
|
@ -0,0 +1,114 @@
|
|||||||
|
const Zombie = require('zombie');
|
||||||
|
|
||||||
|
class Browser {
|
||||||
|
constructor(options) {
|
||||||
|
this.options = options;
|
||||||
|
|
||||||
|
this.browser = new Zombie({
|
||||||
|
proxy: options.proxy,
|
||||||
|
silent: true,
|
||||||
|
strictSSL: false,
|
||||||
|
userAgent: options.userAgent,
|
||||||
|
waitDuration: options.maxWait,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.statusCode = null;
|
||||||
|
this.contentType = null;
|
||||||
|
this.headers = null;
|
||||||
|
this.statusCode = null;
|
||||||
|
this.contentType = null;
|
||||||
|
this.html = null;
|
||||||
|
this.scripts = null;
|
||||||
|
this.cookies = null;
|
||||||
|
|
||||||
|
this.window = this.browser.window;
|
||||||
|
this.document = this.browser.document;
|
||||||
|
|
||||||
|
this.browser.on('authenticate', (auth) => {
|
||||||
|
auth.username = this.options.username;
|
||||||
|
auth.password = this.options.password;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
visit(url) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
this.browser.visit(url, () => {
|
||||||
|
const resource = this.browser.resources.length
|
||||||
|
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||||
|
|
||||||
|
this.headers = this.getHeaders();
|
||||||
|
this.statusCode = resource ? resource.response.status : 0;
|
||||||
|
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;
|
||||||
|
this.html = this.getHtml();
|
||||||
|
this.scripts = this.getScripts();
|
||||||
|
this.cookies = this.getCookies();
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaders() {
|
||||||
|
const headers = {};
|
||||||
|
|
||||||
|
const resource = this.browser.resources.length
|
||||||
|
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||||
|
|
||||||
|
if (resource) {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
resource.response.headers._headers.forEach((header) => {
|
||||||
|
if (!headers[header[0]]) {
|
||||||
|
headers[header[0]] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
headers[header[0]].push(header[1]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHtml() {
|
||||||
|
let html = '';
|
||||||
|
|
||||||
|
if (this.browser.document && this.browser.document.documentElement) {
|
||||||
|
try {
|
||||||
|
html = this.browser.html();
|
||||||
|
} catch (error) {
|
||||||
|
this.log(error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
getScripts() {
|
||||||
|
if (!this.browser.document || !this.browser.document.scripts) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const scripts = Array.prototype.slice
|
||||||
|
.apply(this.browser.document.scripts)
|
||||||
|
.filter(script => script.src)
|
||||||
|
.map(script => script.src);
|
||||||
|
|
||||||
|
return scripts;
|
||||||
|
}
|
||||||
|
|
||||||
|
getCookies() {
|
||||||
|
const cookies = [];
|
||||||
|
|
||||||
|
if (this.browser.cookies) {
|
||||||
|
this.browser.cookies.forEach(cookie => cookies.push({
|
||||||
|
name: cookie.key,
|
||||||
|
value: cookie.value,
|
||||||
|
domain: cookie.domain,
|
||||||
|
path: cookie.path,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cookies;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Browser;
|
@ -0,0 +1,119 @@
|
|||||||
|
const Zombie = require('zombie');
|
||||||
|
const Browser = require('../browser');
|
||||||
|
|
||||||
|
class ZombieBrowser extends Browser {
|
||||||
|
constructor(options) {
|
||||||
|
super(options);
|
||||||
|
|
||||||
|
this.browser = new Zombie({
|
||||||
|
proxy: options.proxy,
|
||||||
|
silent: true,
|
||||||
|
strictSSL: false,
|
||||||
|
userAgent: options.userAgent,
|
||||||
|
waitDuration: options.maxWait,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.browser.on('authenticate', (auth) => {
|
||||||
|
auth.username = this.options.username;
|
||||||
|
auth.password = this.options.password;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
visit(url) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
this.browser.visit(url, () => {
|
||||||
|
const resource = this.browser.resources.length
|
||||||
|
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||||
|
|
||||||
|
this.headers = this.getHeaders();
|
||||||
|
this.statusCode = resource ? resource.response.status : 0;
|
||||||
|
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;
|
||||||
|
this.html = this.getHtml();
|
||||||
|
this.js = this.getJs();
|
||||||
|
this.links = this.getLinks();
|
||||||
|
this.scripts = this.getScripts();
|
||||||
|
this.cookies = this.getCookies();
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaders() {
|
||||||
|
const headers = {};
|
||||||
|
|
||||||
|
const resource = this.browser.resources.length
|
||||||
|
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
|
||||||
|
|
||||||
|
if (resource) {
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
resource.response.headers._headers.forEach((header) => {
|
||||||
|
if (!headers[header[0]]) {
|
||||||
|
headers[header[0]] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
headers[header[0]].push(header[1]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHtml() {
|
||||||
|
let html = '';
|
||||||
|
|
||||||
|
if (this.browser.document && this.browser.document.documentElement) {
|
||||||
|
try {
|
||||||
|
html = this.browser.html();
|
||||||
|
} catch (error) {
|
||||||
|
this.log(error.message, 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
getScripts() {
|
||||||
|
let scripts = [];
|
||||||
|
|
||||||
|
if (this.browser.document && this.browser.document.scripts) {
|
||||||
|
scripts = Array.prototype.slice
|
||||||
|
.apply(this.browser.document.scripts)
|
||||||
|
.filter(script => script.src)
|
||||||
|
.map(script => script.src);
|
||||||
|
}
|
||||||
|
|
||||||
|
return scripts;
|
||||||
|
}
|
||||||
|
|
||||||
|
getJs() {
|
||||||
|
return this.browser.window;
|
||||||
|
}
|
||||||
|
|
||||||
|
getLinks() {
|
||||||
|
let links = [];
|
||||||
|
|
||||||
|
if (this.browser.document) {
|
||||||
|
links = Array.from(this.browser.document.getElementsByTagName('a'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return links;
|
||||||
|
}
|
||||||
|
|
||||||
|
getCookies() {
|
||||||
|
const cookies = [];
|
||||||
|
|
||||||
|
if (this.browser.cookies) {
|
||||||
|
this.browser.cookies.forEach(cookie => cookies.push({
|
||||||
|
name: cookie.key,
|
||||||
|
value: cookie.value,
|
||||||
|
domain: cookie.domain,
|
||||||
|
path: cookie.path,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
return cookies;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ZombieBrowser;
|
Loading…
Reference in new issue