UNPKG

fca-amir

Version:
865 lines (807 loc) 70.7 kB
'use strict'; //-[ Require config and use ]-!/ if (global.Fca.Require.Priyansh.Config != 'default') { //do ssth } const Language = global.Fca.Require.languageFile.find((/** @type {{ Language: string; }} */i) => i.Language == global.Fca.Require.Priyansh.Language).Folder.Index; //-[ Require All Package Need Use ]-!/ var utils = global.Fca.Require.utils, logger = global.Fca.Require.logger, fs = global.Fca.Require.fs, getText = global.Fca.getText, log = global.Fca.Require.log, express = require("express")(), { join } = require('path'), cheerio = require("cheerio"), { readFileSync, writeFileSync } = require('fs-extra'), Database = require("./Extra/Database"), readline = require("readline"), chalk = require("chalk"), figlet = require("figlet"), os = require("os"), deasync = require('deasync'), Security = require("./Extra/Security/Base"), { getAll, deleteAll } = require('./Extra/ExtraGetThread'), ws = require('ws'), Websocket = require('./Extra/Src/Websocket'), Convert = require('ansi-to-html'); //-[ Set Variable For Process ]-!/ log.maxRecordSize = 100; var checkVerified = null; const Boolean_Option = ['online','selfListen','listenEvents','updatePresence','forceLogin','autoMarkDelivery','autoMarkRead','listenTyping','autoReconnect','emitReady']; function setOptions(globalOptions, options) { Object.keys(options).map(function(key) { switch (Boolean_Option.includes(key)) { case true: { globalOptions[key] = Boolean(options[key]); break; } case false: { switch (key) { case 'pauseLog': { if (options.pauseLog) log.pause(); else log.resume(); break; } case 'logLevel': { log.level = options.logLevel; globalOptions.logLevel = options.logLevel; break; } case 'logRecordSize': { log.maxRecordSize = options.logRecordSize; globalOptions.logRecordSize = options.logRecordSize; break; } case 'pageID': { globalOptions.pageID = options.pageID.toString(); break; } case 'userAgent': { globalOptions.userAgent = (options.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'); break; } case 'proxy': { if (typeof options.proxy != "string") { delete globalOptions.proxy; utils.setProxy(); } else { globalOptions.proxy = options.proxy; utils.setProxy(globalOptions.proxy); } break; } default: { log.warn("setOptions", "Unrecognized option given to setOptions: " + key); break; } } break; } } }); } function BypassAutomationNotification(resp, jar, globalOptions, appstate,ID) { global.Fca.BypassAutomationNotification = BypassAutomationNotification try { let UID; if (ID) UID = ID else { UID = (appstate.find(i => i.key == 'c_user') || appstate.find(i => i.key == 'i_user')) UID = UID.value; } if (resp !== undefined) { if (resp.request.uri && resp.request.uri.href.includes("https://www.facebook.com/checkpoint/")) { if (resp.request.uri.href.includes('601051028565049')) { const fb_dtsg = utils.getFrom(resp.body, '["DTSGInitData",[],{"token":"', '","'); const jazoest = utils.getFrom(resp.body, 'jazoest=', '",'); const lsd = utils.getFrom(resp.body, "[\"LSD\",[],{\"token\":\"", "\"}"); const FormBypass = { av: UID, fb_dtsg, jazoest, lsd, fb_api_caller_class: "RelayModern", fb_api_req_friendly_name: "FBScrapingWarningMutation", variables: JSON.stringify({}), server_timestamps: true, doc_id: 6339492849481770 } return utils.post("https://www.facebook.com/api/graphql/", jar, FormBypass, globalOptions) .then(utils.saveCookies(jar)).then(function(res) { global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.Bypass_AutoNoti); return process.exit(1); }); } else { return resp; } } else { return resp } } else { return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(function(res) { if (res.request.uri && res.request.uri.href.includes("https://www.facebook.com/checkpoint/")) { if (res.request.uri.href.includes('601051028565049')) return { Status: true, Body: res.body } else return { Status: false, Body: res.body } } else return { Status: false, Body: res.body } }).then(function(res) { if (res.Status === true) { const fb_dtsg = utils.getFrom(res.Body, '["DTSGInitData",[],{"token":"', '","'); const jazoest = utils.getFrom(res.Body, 'jazoest=', '",'); const lsd = utils.getFrom(res.Body, "[\"LSD\",[],{\"token\":\"", "\"}"); const FormBypass = { av: UID, fb_dtsg, jazoest, lsd, fb_api_caller_class: "RelayModern", fb_api_req_friendly_name: "FBScrapingWarningMutation", variables: JSON.stringify({}), server_timestamps: true, doc_id: 6339492849481770 } return utils.post("https://www.facebook.com/api/graphql/", jar, FormBypass, globalOptions).then(utils.saveCookies(jar)) .then(res => { global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.Bypass_AutoNoti); return res }) } else return res; }) .then(function(res) { return utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar)) }) .then(function(res) { return process.exit(1) }) } } catch (e) { console.log(e) } } //-[ Function BuildAPI ]-!/ /** * @param {any} globalOptions * @param {string} html * @param {{ getCookies: (arg0: string) => any[]; }} jar */ function buildAPI(globalOptions, html, jar, bypass_region) { //new feat const fb_dtsg = utils.getFroms(html, '["DTSGInitData",[],{"token":"', '","')[0]; //nhăm nhăm nhăm nhăm //check tiktik var userID; var cookie = jar.getCookies("https://www.facebook.com"); //.log(cookie) var maybeUser = cookie.filter(function(val) { return val.cookieString().split("=")[0] === "c_user"; }); var maybeTiktik = cookie.filter(function(val) { return val.cookieString().split("=")[0] === "i_user"; }); if (maybeUser.length === 0 && maybeTiktik.length === 0) { if (global.Fca.Require.Priyansh.AutoLogin) { return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() { global.Fca.Action('AutoLogin') }); } else if (!global.Fca.Require.Priyansh.AutoLogin) { return global.Fca.Require.logger.Error(global.Fca.Require.Language.Index.ErrAppState); } } else { if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", Language.CheckPointLevelI); if (maybeTiktik[0] && maybeTiktik[0].cookieString().includes('i_user')) { userID = maybeTiktik[0].cookieString().split("=")[1].toString(); } else userID = maybeUser[0].cookieString().split("=")[1].toString(); process.env['UID'] = logger.Normal(getText(Language.UID,userID), userID); try { clearInterval(checkVerified); } catch (e) { console.log(e); } var clientID = (Math.random() * 2147483648 | 0).toString(16); var CHECK_MQTT = { oldFBMQTTMatch: html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/), newFBMQTTMatch: html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/), legacyFBMQTTMatch: html.match(/\["MqttWebConfig",\[\],{"fbid":"(.*?)","appID":219994525426954,"endpoint":"(.*?)","pollingEndpoint":"(.*?)"/) } // tổng hợp danh sách region never die của Kanzu =)) /** * PRN = Pacific Northwest Region (Khu vực Tây Bắc Thái Bình Dương) * VLL = Valley Region * ASH = Ashburn Region * DFW = Dallas/Fort Worth Region * LLA = Los Angeles Region * FRA = Frankfurt * SIN = Singapore * NRT = Tokyo (Japan) * HKG = Hong Kong * SYD = Sydney */ let Slot = Object.keys(CHECK_MQTT); var mqttEndpoint,region,irisSeqID; Object.keys(CHECK_MQTT).map(function(MQTT) { if (CHECK_MQTT[MQTT] && !region) { switch (Slot.indexOf(MQTT)) { case 0: { irisSeqID = CHECK_MQTT[MQTT][1]; mqttEndpoint = CHECK_MQTT[MQTT][2].replace(/\\\//g, "/"); region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } case 1: { irisSeqID = CHECK_MQTT[MQTT][2]; mqttEndpoint = CHECK_MQTT[MQTT][1].replace(/\\\//g, "/"); region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } case 2: { mqttEndpoint = CHECK_MQTT[MQTT][2].replace(/\\\//g, "/"); //is important lmao f? region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase(); return; } } return; } }); const regions = [ { code: "PRN", name: "Pacific Northwest Region", location: "Khu vực Tây Bắc Thái Bình Dương" }, { code: "VLL", name: "Valley Region", location: "Valley" }, { code: "ASH", name: "Ashburn Region", location: "Ashburn" }, { code: "DFW", name: "Dallas/Fort Worth Region", location: "Dallas/Fort Worth" }, { code: "LLA", name: "Los Angeles Region", location: "Los Angeles" }, { code: "FRA", name: "Frankfurt", location: "Frankfurt" }, { code: "SIN", name: "Singapore", location: "Singapore" }, { code: "NRT", name: "Tokyo", location: "Japan" }, { code: "HKG", name: "Hong Kong", location: "Hong Kong" }, { code: "SYD", name: "Sydney", location: "Sydney" }, { code: "PNB", name: "Pacific Northwest - Beta", location: "Pacific Northwest " } ]; if (!region) { region = ['prn',"pnb","vll","hkg","sin"][Math.random()*5|0]; } if (!mqttEndpoint) { mqttEndpoint = "wss://edge-chat.facebook.com/chat?region=" + region; } const Location = regions.find(r => r.code === region.toUpperCase()); logger.Normal(getText(Language.Area,(Location == undefined ? region.toUpperCase() : Location.name))); var ctx = { userID: userID, jar: jar, clientID: clientID, globalOptions: globalOptions, loggedIn: true, access_token: 'NONE', clientMutationId: 0, mqttClient: undefined, lastSeqId: irisSeqID, syncToken: undefined, mqttEndpoint: mqttEndpoint, region: region, firstListen: true, req_ID: 0, callback_Task: {}, fb_dtsg //i love u }; var api = { setOptions: setOptions.bind(null, globalOptions), getAppState: function getAppState() { return utils.getAppState(jar); } }; if (region && mqttEndpoint) { //do sth } else { if (bypass_region) { logger.Normal(Language.NoAreaDataBypass); } else { log.warn("login", getText(Language.NoAreaData)); api["htmlData"] = html; } } var defaultFuncs = utils.makeDefaults(html, userID, ctx); fs.readdirSync(__dirname + "/src").filter((/** @type {string} */File) => File.endsWith(".js") && !File.includes('Dev_')).map((/** @type {string} */File) => { if (File == 'getThreadInfo.js' && global.Fca.Require.Priyansh.AntiGetInfo.AntiGetThreadInfo != true || File == 'getUserInfo.js' && global.Fca.Require.Priyansh.AntiGetInfo.AntiGetUserInfo != true) api[File.split('.').slice(0, -1).join('.')] = require('./src/' + (File.includes('getThreadInfo') ? 'getThreadMain.js' : 'getUserInfoMain.js'))(defaultFuncs, api, ctx) else api[File.split('.').slice(0, -1).join('.')] = require('./src/' + File)(defaultFuncs, api, ctx) }); return { ctx, defaultFuncs, api }; } } //-[ Function makeLogin ]-!/ /** * @param {{ setCookie: (arg0: any, arg1: string) => void; }} jar * @param {any} email * @param {any} password * @param {{ forceLogin: any; }} loginOptions * @param {(err: any, api: any) => any} callback * @param {any} prCallback */ function makeLogin(jar, email, password, loginOptions, callback, prCallback) { return function(res) { var html = res.body,$ = cheerio.load(html),arr = []; $("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(function(v) { return v.val && v.val.length; }); var form = utils.arrToForm(arr); form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}"); form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64'); form.email = email; form.pass = password; form.default_persistent = '0'; form.locale = 'en_US'; form.timezone = '240'; form.lgnjs = ~~(Date.now() / 1000); html.split("\"_js_").slice(1).map((val) => { jar.setCookie(utils.formatCookie(JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]"), "facebook"),"https://www.facebook.com") }); logger.Normal(Language.OnLogin); return utils .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(/** @type {{ headers: any; }} */res) { var headers = res.headers; if (!headers.location) throw { error: Language.InvaildAccount }; // This means the account has login approvals turned on. if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) { logger.Warning(Language.TwoAuth); var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php'; return utils .get(headers.location, jar, null, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { if (!Database().get('ThroughAcc')) { Database().set('ThroughAcc', email); } else { if (String((Database().get('ThroughAcc'))).replace(RegExp('"','g'), '') != String(email).replace(RegExp('"','g'), '')) { Database().set('ThroughAcc', email); if (Database().get('Through2Fa')) { Database().delete('Through2Fa'); } } } var html = res.body,$ = cheerio.load(html), arr = []; $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(v => { return v.val && v.val.length }); var form = utils.arrToForm(arr); if (html.indexOf("checkpoint/?next") > -1) { setTimeout(() => { checkVerified = setInterval((_form) => {}, 5000, { fb_dtsg: form.fb_dtsg, jazoest: form.jazoest, dpr: 1 }); }, 2500); switch (global.Fca.Require.Priyansh.Login2Fa) { case true: { const question = question => { const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var done,answ; rl.question(question, answer => { rl.close(); answ = answer; done = true }) deasync.loopWhile(function(){ return !done; }); return answ; }; try { const Old_Cookie = Database().get('Through2Fa'); if (Old_Cookie) { Old_Cookie.map(function(/** @type {{ key: string; value: string; expires: string; domain: string; path: string; }} */c) { let str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";"; jar.setCookie(str, "http://" + c.domain); }); let Form = utils.arrToForm(arr); Form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}"); Form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64'); Form.email = email; Form.pass = password; Form.default_persistent = '0'; Form.locale = 'en_US'; Form.timezone = '240'; Form.lgnjs = ~~(Date.now() / 1000); return utils .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, Form, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { let headers = res.headers if (!headers['set-cookie'][0].includes('deleted')) { logger.Warning(Language.ErrThroughCookies, function() { Database().delete('Through2Fa'); }); process.exit(1); } if (headers.location && headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) { return utils .get(headers.location, jar, null, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { var html = res.body,$ = cheerio.load(html), arr = []; $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") })); arr = arr.filter(v => { return v.val && v.val.length }); var Form = utils.arrToForm(arr); if (html.indexOf("checkpoint/?next") > -1) { setTimeout(() => { checkVerified = setInterval((_form) => {}, 5000, { fb_dtsg: Form.fb_dtsg, jazoest: Form.jazoest, dpr: 1 }); }, 2500); if (!res.headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { try { delete Form.name_action_selected; Form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils .post(nextURL, jar, Form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { Form['submit[This was me]'] = "This was me"; return utils.post(nextURL, jar, Form, loginOptions).then(utils.saveCookies(jar)); }) .then(function() { delete Form['submit[This was me]']; Form.name_action_selected = 'save_device'; Form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils.post(nextURL, jar, Form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { Database().delete('Through2Fa'); process.exit(1); } var appState = utils.getAppState(jar,false); Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } catch (e) { console.log(e) } } } }) } return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar)); }) .catch((e) => console.log(e)); } } catch (e) { Database().delete('Through2Fa'); } const Otp_code = require('totp-generator'); const Code = global.Fca.Require.Priyansh.AuthString.includes('|') == false ? Otp_code(global.Fca.Require.Priyansh.AuthString.includes(" ") ? global.Fca.Require.Priyansh.AuthString.replace(RegExp(" ", 'g'), "") : global.Fca.Require.Priyansh.AuthString) : question(Language.EnterSecurityCode); try { const approvals = function(N_Code) { form.approvals_code = N_Code; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); var prResolve,prReject; var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; }); if (typeof N_Code == "string") { utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(res) { var $ = cheerio.load(res.body); var error = $("#approvals_code").parent().attr("data-xui-error"); if (error) { logger.Warning(Language.InvaildTwoAuthCode,function() { approvals(question(Language.EnterSecurityCode)) }); //bruh loop }; }) .then(function() { delete form.no_fido;delete form.approvals_code; form.name_action_selected = 'save_device'; //'save_device' || 'dont_save; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) { try { delete form.name_action_selected; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { form['submit[This was me]'] = "This was me"; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function() { delete form['submit[This was me]']; form.name_action_selected = 'save_device'; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: "wtf ??:D" }; var appState = utils.getAppState(jar,false); Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } catch (e) { console.log(e) } } var appState = utils.getAppState(jar,false); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } Database().set('Through2Fa', appState); return loginHelper(appState, email, password, loginOptions, callback); }) .catch(function(err) { if (callback === prCallback) prReject(err); else callback(err); }); } else { utils .post("https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php", jar, form, loginOptions, null, { "Referer": "https://www.facebook.com/checkpoint/?next" }) .then(utils.saveCookies(jar)) .then(function(res) { try { JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, "")); } catch (ex) { clearInterval(checkVerified); logger.Warning(Language.VerifiedCheck); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } let appState = utils.getAppState(jar,false); return loginHelper(appState, email, password, loginOptions, callback); } }) .catch((ex) => { log.error("login", ex); if (callback === prCallback) prReject(ex); else callback(ex); }); } return rtPromise; } return approvals(Code) } catch (e) { logger.Error(e) logger.Error(); process.exit(0); } } case false: { throw { error: 'login-approval', continue: function submit2FA(code) { form.approvals_code = code; form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue'; var prResolve,prReject; var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; }); if (typeof code == "string") { utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function(/** @type {{ body: string | Buffer; }} */res) { var $ = cheerio.load(res.body); var error = $("#approvals_code").parent().attr("data-xui-error"); if (error) { throw { error: 'login-approval', errordesc: Language.InvaildTwoAuthCode, lerror: error, continue: submit2FA }; } }) .then(function() { delete form.no_fido;delete form.approvals_code; form.name_action_selected = 'dont_save'; //'save_device' || 'dont_save; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: Language.ApprovalsErr }; var appState = utils.getAppState(jar,false); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } return loginHelper(appState, email, password, loginOptions, callback); }) .catch(function(err) { if (callback === prCallback) prReject(err); else callback(err); }); } else { utils .post("https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php", jar, form, loginOptions, null, { "Referer": "https://www.facebook.com/checkpoint/?next" }) .then(utils.saveCookies(jar)) .then((res) => { try { JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, "")); } catch (ex) { clearInterval(checkVerified); logger.Warning(Language.VerifiedCheck); if (callback === prCallback) { callback = function(err, api) { if (err) return prReject(err); return prResolve(api); }; } return loginHelper(utils.getAppState(jar,false), email, password, loginOptions, callback); } }) .catch((ex) => { log.error("login", ex); if (callback === prCallback) prReject(ex); else callback(ex); }); } return rtPromise; } }; } } } else { if (!loginOptions.forceLogin) throw { error: Language.ForceLoginNotEnable }; if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me"; else form['submit[This Is Okay]'] = "This Is Okay"; return utils .post(nextURL, jar, form, loginOptions) .then(utils.saveCookies(jar)) .then(function() { form.name_action_selected = 'dont_save'; return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar)); }) .then(function(res) { var headers = res.headers; if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." }; var appState = utils.getAppState(jar,false); return loginHelper(appState, email, password, loginOptions, callback); }) .catch((e) => callback(e)); } }); } return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar)); }); }; } //-[ Function backup ]-!/ /** * @param {string} data * @param {any} globalOptions * @param {any} callback * @param {any} prCallback */ function backup(data,globalOptions, callback, prCallback) { try { var appstate; try { appstate = JSON.parse(data) } catch(e) { appstate = data; } logger.Warning(Language.BackupNoti); try { loginHelper(appstate,null,null,globalOptions, callback, prCallback) } catch (e) { logger.Error(Language.ErrBackup); process.exit(0); } } catch (e) { return logger.Error(); } } //-[ function loginHelper ]-!/ /** * @param {string | any[]} appState * @param {any} email * @param {any} password * @param {{ selfListen?: boolean; listenEvents?: boolean; listenTyping?: boolean; updatePresence?: boolean; forceLogin?: boolean; autoMarkDelivery?: boolean; autoMarkRead?: boolean; autoReconnect?: boolean; logRecordSize?: number; online?: boolean; emitReady?: boolean; userAgent?: string; pageID?: any; }} globalOptions * @param {(arg0: any, arg1: undefined) => void} callback * @param {(error: any, api: any) => any} [prCallback] */ function loginHelper(appState, email, password, globalOptions, callback, prCallback) { var mainPromise = null; var jar = utils.getJar(); try { if (appState) { logger.Normal(Language.OnProcess); switch (Database().has("FBKEY")) { case true: { process.env.FBKEY = Database().get("FBKEY"); } break; case false: { const SecurityKey = global.Fca.Require.Security.create().apiKey; process.env['FBKEY'] = SecurityKey; Database().set('FBKEY', SecurityKey); } break; default: { const SecurityKey = global.Fca.Require.Security.create().apiKey; process.env['FBKEY'] = SecurityKey; Database().set('FBKEY', SecurityKey); } } try { switch (global.Fca.Require.Priyansh.EncryptFeature) { case true: { appState = JSON.parse(JSON.stringify(appState, null, "\t")); switch (utils.getType(appState)) { case "Array": { switch (utils.getType(appState[0])) { case "Object": { logger.Normal(Language.NotReadyToDecrypt); }