diff --git a/README.md b/README.md index f42b913fc..f8d8c8150 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,10 @@ Installing the current repository "you can download the beta version from the cu const venom = require('venom-bot'); venom - .create() + .create({ + session: 'session-name', //name of session + multidevice: false // for version not multidevice use false.(default: true) + }) .then((client) => start(client)) .catch((erro) => { console.log(erro); @@ -178,7 +181,7 @@ venom }, // options { - multidevice: true, // enabled multidevice.(default: true) + multidevice: false, // for version not multidevice use false.(default: true) folderNameToken: 'tokens', //folder name when saving tokens mkdirFolderToken: '', //folder directory tokens, just inside the venom folder, example: { mkdirFolderToken: '/node_modules', } //will save the tokens folder in the node_modules directory headless: true, // Headless chrome @@ -250,7 +253,9 @@ venom //Create session wss return "serverClose" case server for close console.log('Session name: ', session); }, - undefined + { + multidevice: false // for version not multidevice use false.(default: true) + } ) .then((client) => { start(client); diff --git a/src/api/layers/host.layer.ts b/src/api/layers/host.layer.ts index e5314b7c3..cb766377b 100644 --- a/src/api/layers/host.layer.ts +++ b/src/api/layers/host.layer.ts @@ -88,6 +88,9 @@ export class HostLayer { constructor(public page: Page, session?: string, options?: CreateConfig) { this.session = session; this.options = { ...defaultOptions, ...options }; + + // this.spin('Initializing...', 'spinning'); + //this._initialize(this.page); } protected spin(text?: string, status?: Spinnies.SpinnerStatus) { @@ -269,7 +272,7 @@ export class HostLayer { this.spin('Checking QRCode status...'); // Wait for interface update - await sleep(3000); + await sleep(200); authenticated = await isAuthenticated(this.page).catch(() => null); if (authenticated === null || JSON.stringify(authenticated) === '{}') { @@ -295,7 +298,7 @@ export class HostLayer { this.cancelAutoClose(); this.startAutoClose(); // Wait for interface update - await sleep(3000); + await sleep(200); this.spin('Checking phone is connected...'); const inChat = await this.waitForInChat(); diff --git a/src/config/WAuserAgente.ts b/src/config/WAuserAgente.ts index 4371255a8..317d74839 100644 --- a/src/config/WAuserAgente.ts +++ b/src/config/WAuserAgente.ts @@ -54,5 +54,5 @@ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM */ const useragentOverride = - 'WhatsApp/2.2043.8 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'; + 'WhatsApp/2.2043.8 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'; export { useragentOverride }; diff --git a/src/config/create-config.ts b/src/config/create-config.ts index 1db0628f3..4b5406af9 100644 --- a/src/config/create-config.ts +++ b/src/config/create-config.ts @@ -62,8 +62,8 @@ import { puppeteerConfig } from './puppeteer.config'; // Server config export interface CreateConfig { - /** - * multidevice option + /** enabled multidevice + * @default true */ multidevice?: boolean; /** folder name when saving tokens diff --git a/src/config/puppeteer.config.ts b/src/config/puppeteer.config.ts index 0cb720b86..d2a3ed4a0 100644 --- a/src/config/puppeteer.config.ts +++ b/src/config/puppeteer.config.ts @@ -58,7 +58,6 @@ const puppeteerConfig = { // `--app=${WAUrl}`, '--log-level=3', // fatal only //'--start-maximized', - '-wait-for-browser', '--no-default-browser-check', '--disable-site-isolation-trials', '--no-experiments', @@ -66,7 +65,6 @@ const puppeteerConfig = { '--ignore-certificate-errors', '--ignore-certificate-errors-spki-list', '--disable-gpu', - '--disable-web-security', '--disable-extensions', '--disable-default-apps', '--enable-features=NetworkService', @@ -92,7 +90,9 @@ const puppeteerConfig = { '--disable-app-list-dismiss-on-blur', '--disable-accelerated-video-decode', '--disable-dev-shm-usage', - '--user-agent=WhatsApp/2.2043.8 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' + '--disable-gl-drawing-for-tests', + '--incognito', + '--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' ] }; diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts index 1ebad8933..1bb4b7eae 100644 --- a/src/controllers/auth.ts +++ b/src/controllers/auth.ts @@ -57,7 +57,7 @@ import * as path from 'path'; import * as puppeteer from 'puppeteer'; import * as qrcode from 'qrcode-terminal'; import { existsSync, readFileSync } from 'fs'; -import { CreateConfig, defaultOptions } from '../config/create-config'; +import { CreateConfig } from '../config/create-config'; import { ScrapQrcode } from '../api/model/qrcode'; import { tokenSession } from '../config/tokenSession.config'; @@ -211,8 +211,7 @@ export async function auth_InjectToken( page: puppeteer.Page, session: string, options: CreateConfig, - token?: tokenSession, - clear = options.multidevice ? true : false + token?: tokenSession ) { if (!token) { const pathToken: string = path.join( @@ -232,12 +231,8 @@ export async function auth_InjectToken( } //Auth with token ->start<- - await page.evaluate(async (session) => { - if (clear) { - await page.evaluate((session) => { - localStorage.clear(); - }); - } + await page.evaluate((session) => { + localStorage.clear(); Object.keys(session).forEach((key) => { localStorage.setItem(key, session[key]); }); diff --git a/src/controllers/browser.ts b/src/controllers/browser.ts index 93e4f5920..7d03c7317 100644 --- a/src/controllers/browser.ts +++ b/src/controllers/browser.ts @@ -56,46 +56,20 @@ import * as ChromeLauncher from 'chrome-launcher'; import * as path from 'path'; import { Browser, BrowserContext, Page } from 'puppeteer'; import puppeteer from 'puppeteer-extra'; -import { CreateConfig, defaultOptions } from '../config/create-config'; +import { CreateConfig } from '../config/create-config'; import { puppeteerConfig } from '../config/puppeteer.config'; import StealthPlugin = require('puppeteer-extra-plugin-stealth'); import { auth_InjectToken } from './auth'; import { useragentOverride } from '../config/WAuserAgente'; import { tokenSession } from '../config/tokenSession.config'; -import * as os from 'os'; -import * as rimraf from 'rimraf'; -import { addExitCallback } from 'catch-exit'; - -export async function unregisterServiceWorker(page: Page) { - await page.evaluateOnNewDocument(() => { - // Remove existent service worker - navigator.serviceWorker - .getRegistrations() - .then((registrations) => { - for (let registration of registrations) { - registration.unregister(); - } - }) - .catch((err) => null); - - // Disable service worker registration - // @ts-ignore - navigator.serviceWorker.register = undefined; - // Disable service worker detection - // @ts-ignore - delete navigator.serviceWorker; - }); -} export async function initWhatsapp( session: string, options: CreateConfig, browser: Browser, - token?: tokenSession, - clear = options.multidevice ? true : false + token?: tokenSession ): Promise { const waPage: Page = await getWhatsappPage(browser); - await unregisterServiceWorker(waPage); if (waPage != null) { try { await waPage.setUserAgent(useragentOverride); @@ -103,7 +77,7 @@ export async function initWhatsapp( waitUntil: 'domcontentloaded' }); // Auth with token - await auth_InjectToken(waPage, session, options, token, clear); + await auth_InjectToken(waPage, session, options, token); await waPage.evaluate(() => { window.location.reload(); }); @@ -118,7 +92,7 @@ export async function initWhatsapp( export async function injectApi(page: Page) { const injected = await page .evaluate(() => { - localStorage.setItem('md-opted-in', 'false'); + // @ts-ignore return ( typeof window.WAPI !== 'undefined' && typeof window.Store !== 'undefined' @@ -203,28 +177,6 @@ export async function initBrowser( browser = 'launch'; }); } - // Register an exit callback to remove user-data-dir - try { - const arg = browser - .process() - .spawnargs.find((s: string) => s.startsWith('--user-data-dir=')); - - if (arg) { - const tmpUserDataDir = arg.split('=')[1]; - - // Only if path is in TMP directory - if (path.relative(os.tmpdir(), tmpUserDataDir).startsWith('puppeteer')) { - addExitCallback((signal) => { - // Remove only on exit signal - if (signal === 'exit') { - try { - rimraf.sync(tmpUserDataDir); - } catch (error) {} - } - }); - } - } - } catch (error) {} return browser; } diff --git a/src/controllers/initializer.ts b/src/controllers/initializer.ts index bad7e339b..ff5c7c2ed 100644 --- a/src/controllers/initializer.ts +++ b/src/controllers/initializer.ts @@ -55,7 +55,9 @@ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM import * as chalk from 'chalk'; -import { readFileSync } from 'fs'; +import * as fs from 'fs'; + +import { fstat, readFileSync } from 'fs'; import { Browser, Page } from 'puppeteer'; @@ -163,6 +165,12 @@ export async function create( if (options?.multidevice != false) { const dirPath = `./${defaultOptions.folderNameToken}/${session}`; + let existFile = fs.existsSync(dirPath + '.data.json'); + + if (existFile) { + fs.unlinkSync(dirPath + '.data.json'); + } + defaultOptions.puppeteerOptions = { userDataDir: dirPath }; diff --git a/src/lib/wapi/functions/check-send-exist.js b/src/lib/wapi/functions/check-send-exist.js index f81dda2d5..144d292eb 100644 --- a/src/lib/wapi/functions/check-send-exist.js +++ b/src/lib/wapi/functions/check-send-exist.js @@ -138,7 +138,7 @@ export function sendCheckType(chatId = undefined) { chatId, true, 404, - 'incorrect parameters! Use as an example: 00000000-000000@g.us' + 'incorrect parameters! Use as an example: 00000000-000000@g.us or 00000000000000@g.us' ); } }