350 lines
29 KiB
JavaScript
350 lines
29 KiB
JavaScript
import https from 'https';
|
|
import axios from "axios";
|
|
import * as cheerio from "cheerio";
|
|
import * as path from 'path';
|
|
import { URL } from 'url';
|
|
import puppeteerExtra from 'puppeteer-extra';
|
|
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
|
|
const puppeteerExtraAny = puppeteerExtra;
|
|
puppeteerExtraAny.use(StealthPlugin());
|
|
import { logger } from '../index.js';
|
|
export const STATS_SUFFIX = '_stats.json';
|
|
export const SESSION_EVENTS_SUFFIX = '_session.json';
|
|
export const TRACE_SUFFIX = '_trace.json';
|
|
export var scope;
|
|
const included_categories = ['devtools.timeline'];
|
|
const _url_short = (url) => new URL(url).hostname;
|
|
let instance;
|
|
const debugRequests = true;
|
|
const debugResponses = false;
|
|
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
export const extractEmail = (input) => {
|
|
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/;
|
|
const match = input.match(emailRegex);
|
|
return match ? match[0] : null;
|
|
};
|
|
export const meta = async (loc, options) => {
|
|
if (!loc.website) {
|
|
logger.warn(`No website to retrieve meta data : ${loc.title}`);
|
|
return;
|
|
}
|
|
if (loc.meta) {
|
|
return;
|
|
}
|
|
try {
|
|
const _meta = await parseHtml(loc.website, null, options) || {};
|
|
loc.meta = _meta;
|
|
if (_meta.social) {
|
|
loc.instagram = _meta.social.find(p => p.source === 'instagram')?.url;
|
|
loc.facebook = _meta.social.find(p => p.source === 'facebook')?.url;
|
|
loc.youtube = _meta.social.find(p => p.source === 'youtube')?.url;
|
|
loc.linkedin = _meta.social.find(p => p.source === 'linkedin')?.url;
|
|
loc.twitter = _meta.social.find(p => p.source === 'twitter')?.url;
|
|
}
|
|
return _meta;
|
|
}
|
|
catch (error) {
|
|
logger.error('Error retrieving meta data : ' + loc.website, error.message);
|
|
if (error.status)
|
|
loc.rejected = error.status === 404 || error.status === 403 || error.status === 999 || error.status === 503;
|
|
}
|
|
};
|
|
export const isValidUrl = (url) => {
|
|
try {
|
|
new URL(url);
|
|
return true;
|
|
}
|
|
catch (error) {
|
|
return false;
|
|
}
|
|
};
|
|
const readMetaTags = ($, name) => {
|
|
return $(`meta[name="${name}"]`).attr('content') || $(`meta[property="${name}"]`).attr('content') || null;
|
|
};
|
|
export const parseHtml = async (url, config, options) => {
|
|
if (!/(^http(s?):\/\/[^\s$.?#].[^\s]*)/i.test(url))
|
|
return {};
|
|
let content = '';
|
|
let currentUrl = url;
|
|
if (options && options.headless) {
|
|
try {
|
|
const browser = await puppeteerExtraAny.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] });
|
|
const page = await browser.newPage();
|
|
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
|
|
await page.goto(url, { waitUntil: 'networkidle2', timeout: options.timeout || 30000 });
|
|
content = await page.content();
|
|
currentUrl = page.url();
|
|
await browser.close();
|
|
}
|
|
catch (e) {
|
|
logger.error(`Puppeteer failed for ${url}: ${e.message}`);
|
|
}
|
|
}
|
|
if (!content) {
|
|
try {
|
|
const { data } = await axios(url, {
|
|
...config,
|
|
httpsAgent: new https.Agent({ rejectUnauthorized: false }),
|
|
headers: {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
|
},
|
|
timeout: 10000
|
|
});
|
|
content = data;
|
|
}
|
|
catch (e) {
|
|
logger.error(`Axios failed for ${url}: ${e.message}`);
|
|
return {};
|
|
}
|
|
}
|
|
const $ = cheerio.load(content);
|
|
const og = {};
|
|
const meta = {};
|
|
const images = [];
|
|
const links = [];
|
|
let allLinks = [];
|
|
const title = $('title').text();
|
|
if (title)
|
|
meta.title = title;
|
|
const canonical = $('link[rel=canonical]').attr('href');
|
|
if (canonical) {
|
|
meta.url = canonical;
|
|
}
|
|
['title', 'description', 'image'].forEach(s => {
|
|
const val = readMetaTags($, s);
|
|
if (val)
|
|
meta[s] = val;
|
|
});
|
|
['og:title', 'og:description', 'og:image', 'og:url', 'og:site_name', 'og:type'].forEach(s => {
|
|
const val = readMetaTags($, s);
|
|
if (val)
|
|
og[s.split(':')[1]] = val;
|
|
});
|
|
$('img').each((i, el) => {
|
|
let src = $(el).attr('src');
|
|
if (src) {
|
|
try {
|
|
src = new URL(src, url).href;
|
|
images.push({ src });
|
|
}
|
|
catch (e) {
|
|
// ignore invalid urls
|
|
}
|
|
}
|
|
});
|
|
const jsonLdArray = [];
|
|
$('script[type="application/ld+json"]').each((_, element) => {
|
|
const jsonLdContent = $(element).html();
|
|
if (jsonLdContent) {
|
|
try {
|
|
const jsonData = JSON.parse(jsonLdContent);
|
|
jsonLdArray.push(jsonData);
|
|
}
|
|
catch (e) {
|
|
logger.error(`Error parsing JSON-LD: ${e.message} @ ${url}`);
|
|
}
|
|
}
|
|
});
|
|
$('a').each((index, element) => {
|
|
let href = $(element).attr('href');
|
|
if (href) {
|
|
try {
|
|
href = new URL(href, url).href;
|
|
if (isValidUrl(href)) {
|
|
if (href.indexOf('contact') !== -1 && !links.includes(href)) {
|
|
links.push(href);
|
|
}
|
|
allLinks.push(href);
|
|
}
|
|
}
|
|
catch (e) {
|
|
// Ignore invalid URLs
|
|
}
|
|
}
|
|
});
|
|
allLinks = [...new Set(allLinks)];
|
|
const socialLinks = [];
|
|
const internalPages = [];
|
|
const externalLinks = [];
|
|
allLinks.forEach(link => {
|
|
if (link.includes('instagram.com'))
|
|
socialLinks.push({ url: link, source: 'instagram', status: 'PENDING' });
|
|
else if (link.includes('facebook.com'))
|
|
socialLinks.push({ url: link, source: 'facebook', status: 'PENDING' });
|
|
else if (link.includes('linkedin.com'))
|
|
socialLinks.push({ url: link, source: 'linkedin', status: 'PENDING' });
|
|
else if (link.includes('youtube.com'))
|
|
socialLinks.push({ url: link, source: 'youtube', status: 'PENDING' });
|
|
else if (link.includes('twitter.com'))
|
|
socialLinks.push({ url: link, source: 'twitter', status: 'PENDING' });
|
|
else if (link.includes('mailto:')) { /* ignore mailto */ }
|
|
else {
|
|
try {
|
|
const baseUrl = new URL(url).hostname;
|
|
const linkUrl = new URL(link).hostname;
|
|
if (linkUrl === baseUrl || linkUrl.endsWith('.' + baseUrl)) {
|
|
internalPages.push({ url: link, source: 'site', status: 'PENDING' });
|
|
}
|
|
else {
|
|
externalLinks.push({ url: link, source: 'external', status: 'PENDING' });
|
|
}
|
|
}
|
|
catch (e) {
|
|
externalLinks.push({ url: link, source: 'external', status: 'PENDING' });
|
|
}
|
|
}
|
|
});
|
|
const ret = {
|
|
title: meta.title || og.title,
|
|
description: meta.description || og.description,
|
|
image: meta.image || og.image,
|
|
url: meta.url || og.url || url,
|
|
social: socialLinks,
|
|
seo: {
|
|
keywords: ($('meta[property="og:keywords"]').attr("content") ||
|
|
$('meta[name="keywords"]').attr("content") || "").split(',').map(s => s.trim()).filter(s => s),
|
|
structured: jsonLdArray,
|
|
og,
|
|
metaTags: meta
|
|
},
|
|
pages: internalPages,
|
|
externalLinks: externalLinks,
|
|
images
|
|
};
|
|
return ret;
|
|
};
|
|
export const getScope = (cliArgs) => {
|
|
if (!instance) {
|
|
instance = new Scope();
|
|
instance.args = cliArgs;
|
|
}
|
|
return instance;
|
|
};
|
|
export async function capture_responses(scope, page) {
|
|
try {
|
|
// await page.setRequestInterception(true);
|
|
}
|
|
catch (e) {
|
|
logger.error('error intercepting responses', e);
|
|
}
|
|
scope.responses = [];
|
|
page.on('response', response => {
|
|
try {
|
|
const isJson = (response.headers()['content-type'] || '').startsWith('application/json;') === true;
|
|
const url = response.url();
|
|
if (response.status() === 200) {
|
|
if (isJson) {
|
|
// capture_response(scope.responses, response as any);
|
|
}
|
|
if (scope.onResponse) {
|
|
scope.onResponse(response, scope);
|
|
}
|
|
}
|
|
else {
|
|
debugResponses && logger.error(`Error loading ${url} : ${response.status()}`);
|
|
}
|
|
}
|
|
catch (e) {
|
|
debugResponses && logger.error('Error parsing response');
|
|
}
|
|
});
|
|
}
|
|
export class Scope {
|
|
browser;
|
|
context;
|
|
page;
|
|
args;
|
|
requests = [];
|
|
responses = [];
|
|
eventBeacons = [];
|
|
mutationBeacons = [];
|
|
sessionSuffix = '';
|
|
onResponse;
|
|
onRequest;
|
|
async init() {
|
|
this.sessionSuffix = ' - ' + new Date().getTime();
|
|
const args = [
|
|
'--no-sandbox',
|
|
'--disable-setuid-sandbox',
|
|
'--disable-infobars',
|
|
'--window-position=0,0',
|
|
'--ignore-certifcate-errors',
|
|
'--ignore-certifcate-errors-spki-list',
|
|
'--user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3312.0 Safari/537.36"',
|
|
`--user-data-dir=${path.resolve('../chrome')}`
|
|
];
|
|
this.browser = await puppeteerExtraAny.launch({
|
|
...this.args,
|
|
args: args
|
|
});
|
|
this.page = await this.browser.newPage();
|
|
this.page.on('console', msg => {
|
|
// error('Browser error:', msg);
|
|
});
|
|
this.page.on('error', msg => logger.error('Browser Error:', msg));
|
|
this.page.on('pageerror', msg => logger.error('Browser Page Error:', msg));
|
|
this.page.on('requestfailed', msg => logger.error('Browser Page Request Error:', msg));
|
|
const page2 = this.page;
|
|
}
|
|
}
|
|
export const body = async (url) => {
|
|
const options = {
|
|
headless: true,
|
|
url: url
|
|
};
|
|
let timeout = 8000;
|
|
if (!scope) {
|
|
try {
|
|
scope = await getScope(options);
|
|
await scope.init();
|
|
}
|
|
catch (e) {
|
|
debugger;
|
|
logger.error("Invalid scope - abort", e);
|
|
return;
|
|
}
|
|
scope.page.on("pageerror", function (err) {
|
|
logger.error('page-error!', err);
|
|
});
|
|
scope.page.on("error", function (err) {
|
|
logger.error('brower-error!', err);
|
|
});
|
|
scope.page.on('console', msg => {
|
|
if (msg._type === 'error') {
|
|
logger.error('Browser error:', msg);
|
|
scope.page.isError = true;
|
|
}
|
|
});
|
|
}
|
|
const parse = (resolve) => {
|
|
scope.page.content().then((c) => {
|
|
if (!c) {
|
|
logger.error('error user page ', url);
|
|
resolve(null);
|
|
return;
|
|
}
|
|
const $ = cheerio.load(c, {
|
|
xmlMode: true
|
|
});
|
|
const links = [];
|
|
$('a').each((index, element) => {
|
|
const href = $(element).attr('href');
|
|
if (href && href.indexOf('contact') !== -1) {
|
|
links.push(href);
|
|
}
|
|
});
|
|
resolve({ html: c, text: $('body').text(), links });
|
|
});
|
|
};
|
|
return new Promise((resolve) => {
|
|
scope.page.goto(url, {
|
|
timeout: timeout,
|
|
waitUntil: 'networkidle0'
|
|
}).then((v) => {
|
|
parse(resolve);
|
|
}).catch((e) => {
|
|
logger.error('error loading page', e);
|
|
});
|
|
});
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvaHRtbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekIsT0FBTyxLQUE2QixNQUFNLE9BQU8sQ0FBQTtBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQTtBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBR3pCLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBQzVDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBRTFELE1BQU0saUJBQWlCLEdBQUcsY0FBcUIsQ0FBQTtBQUMvQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBR3BDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUE7QUFDekMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFBO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUE7QUFDekMsTUFBTSxDQUFDLElBQUksS0FBWSxDQUFBO0FBRXZCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ2pELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7QUFDekQsSUFBSSxRQUFlLENBQUE7QUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQTtBQUU1QixrREFBa0Q7QUFFbEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFpQixF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
|