UNPKG

nyx-lookup

Version:

Reverse phone lookup, based on WhatsApp and Telegram

205 lines (188 loc) 6.39 kB
import WhatsApp from "whatsapp-web.js"; import QRCcode from "qrcode-terminal"; import fs from "fs"; import https from "https"; import { colour, typeColour, COLOUR, removeDuplicateFiles } from "../utils.js"; export function create_table(db) { db.exec(`CREATE TABLE IF NOT EXISTS whatsapp( id INTEGER PRIMARY KEY AUTOINCREMENT, rawPhone TEXT UNIQUE, formattedPhone TEXT, type TEXT, name TEXT, pushname TEXT, about TEXT, lastActivity DATETIME, datetimeCreated DATETIME DEFAULT CURRENT_TIMESTAMP, datetimeModified DATETIME DEFAULT CURRENT_TIMESTAMP, datetimeAccessed DATETIME DEFAULT CURRENT_TIMESTAMP )`); // TODO: remove in a later version // That is to maintain portability between version 2.1.0 and 2.2.0 const alldata = db.prepare("SELECT 1 FROM pragma_table_info('whatsapp') WHERE name = 'datetimeCreated';").all(); // console.log(typeof alldata, alldata); if (alldata.length == 0) { db.exec(`CREATE TABLE IF NOT EXISTS whatsapp0( id INTEGER PRIMARY KEY AUTOINCREMENT, rawPhone TEXT UNIQUE, formattedPhone TEXT, type TEXT, name TEXT, pushname TEXT, about TEXT, lastActivity DATETIME, datetimeCreated DATETIME DEFAULT CURRENT_TIMESTAMP, datetimeModified DATETIME DEFAULT CURRENT_TIMESTAMP, datetimeAccessed DATETIME DEFAULT CURRENT_TIMESTAMP ); INSERT INTO whatsapp0( id, rawPhone, formattedPhone, type, name, pushname, about, lastActivity ) SELECT * FROM whatsapp; DROP TABLE table whatsapp; ALTER TABLE whatsapp0 rename to whatsapp; `); } } function download(url, dest, cb) { const file = fs.createWriteStream(dest); https.get(url, (response) => { response.pipe(file); file.on('finish', () => { file.close(cb) }); }).on('error', (err) => { fs.unlink(dest, cb(err)); }); } export async function Api({ db, argv, phone, pathPhone, pathToken, format, printText }) { db.prepare("UPDATE whatsapp SET datetimeModified = time('now'), datetimeAccessed = time('now') WHERE rawPhone = ?").run(phone); const client = await new Promise(resolve => { // console.log(pathToken, argv) if (!fs.existsSync(pathToken) && argv.nonInteractive === true) return resolve(null); try { const waclient = new WhatsApp.Client({ authStrategy: new WhatsApp.LocalAuth({ dataPath: pathToken }), puppeteer: { // handleSIGINT: false, // headless: true, args: [ "--no-sandbox", "--disable-extensions", '--disable-gpu', "--disable-accelerated-2d-canvas", "--no-first-run", "--no-zygote", "--disable-dev-shm-usage" ], takeoverOnConflict: true, }, webVersionCache: { type: "remote", remotePath: "https://raw.githubusercontent.com/wppconnect-team/wa-version/refs/heads/main/html/2.3000.1039171941-alpha.html", }, qrMaxRetries: 2 }); waclient.on('qr', qr => { console.log("To login to WhatsApp, scan the following QRCode within WhatsApp settings"); // console.log(qr) QRCcode.generate(qr, { small: true }); }); waclient.on('authenticated', qr => { console.log("Authenticated"); }); waclient.on('ready', async () => { // console.log("ready"); resolve(waclient); }); waclient.initialize(); } catch (e) { console.log(e) resolve(e); } }); if (client === null) console.log(`${colour("1;31")}\u2a2f\x1b[0m \x1b[1mWhatsApp:\x1b[0m No session found`); else { // console.log("Logged in!"); const user = await client.getContactById(phone + "@c.us"); // console.log("Got contact by id !") if (user !== null) { const [picture, number, about, chat] = await Promise.allSettled([ user.getProfilePicUrl(), user.getFormattedNumber(), user.getAbout(), user.getChat() ]); // console.log(picture, number, about) // console.log(user); // return 0; if (!user.name && !user.pushname && !user.shortName && !picture && !about && typeof chat?.timestamp !== "number") console.log(`${colour("1;31")}\u2a2f\x1b[0m \x1b[1mWhatsApp:\x1b[0m Phone not occupied`); else { if (format === "text") { var photos = 0; try { photos = fs.readdirSync(pathPhone).filter(v => !v.endsWith(".txt") && !v.endsWith(".json")).length; } catch (e) { // console.error(e); } console.log(`\r${colour("1;4")}WhatsApp:\x1b[0m Type: ${user.isBusiness ? "Business" : (user.isEnterprise ? "Enterprise" : (user.isUser ? "User" : "Unknown"))} Name: ${colour(COLOUR.NAME)}${user.name || ""}\x1b[0m Pushname: ${colour(COLOUR.NAME)}${user.pushname || ""}\x1b[0m Picture: ${picture.value || "None"}, ${photos} saved Phone: ${typeColour(number)}${number.value || ""}\x1b[0m About: ${colour("33")}${about.value || ""}\x1b[0m Last activity: ${typeof chat.value?.timestamp === "number" ? colour("35") + new Date(chat.value?.timestamp * 1000) : "\x1b[3mUnknown"}\x1b[0m `); } const dataJson = { type: user.isBusiness ? "Business" : user.isUser ? "User" : null, rawPhone: phone, formattedPhone: number.value, name: user.name, // shortname: user.shortName, pushname: user.pushname, picture: picture.value, about: about.value, lastActivity: chat.value?.timestamp }; if (argv.save === true) { const data = Object.fromEntries(Object.entries(dataJson).filter(([_, v]) => v != null)); delete data.picture; const dataLength = Object.keys(data).length; if (dataLength !== 0) { // console.log(data) // create_table(db); db.prepare(` INSERT INTO whatsapp(${Object.keys(data).join(',')}) VALUES(${Object.keys(data).map(v => '?').join(',')}) ON CONFLICT (rawPhone) DO UPDATE SET ${Object.keys(data).map(v => v + '=?').join(',')} `).run(...Object.values(data), ...Object.values(data)); } } // console.log(argv, picture.value); if (argv.photo && typeof picture.value === "string") { const filepath = `${pathPhone}/whatsapp-${(new Date()).toISOString()}.${picture.value.split('?', 2)[0].split('.').pop()}` const res = await new Promise(r => download(picture.value, filepath, r)); if (res instanceof Error) throw res; await removeDuplicateFiles(pathPhone); } return dataJson; } } client.removeAllListeners(); await client.destroy(); } }