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: false,
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvaHRtbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekIsT0FBTyxLQUE2QixNQUFNLE9BQU8sQ0FBQTtBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQTtBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFBO0FBR3pCLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBQzVDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBRTFELE1BQU0saUJBQWlCLEdBQUcsY0FBcUIsQ0FBQTtBQUMvQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBR3BDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUE7QUFDekMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFBO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUE7QUFDekMsTUFBTSxDQUFDLElBQUksS0FBWSxDQUFBO0FBRXZCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ2pELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUE7QUFDekQsSUFBSSxRQUFlLENBQUE7QUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQTtBQUU1QixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQUUvQyxNQUFNLENB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
|