UNPKG

fca-nazrul-remastered

Version:

Facebook-chat-api protect and deploy by Kanzu and HZI Team

892 lines (832 loc) 76.3 kB
'use strict'; //-[ Require config and use ]-!/ if (global.Fca.Require.FastConfig.Config != 'default') { //do ssth } const Language = global.Fca.Require.languageFile.find((/** @type {{ Language: string; }} */i) => i.Language == global.Fca.Require.FastConfig.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']; //-[ Set And Check Template HTML ]-!/ const css = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'style.css')); const js = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'script.js')); //-[ Function Generate HTML Template ]-!/ /** * It returns a string of HTML code. * @param UserName - The username of the user * @param Type - The type of user, either "Free" or "Premium" * @param link - The link to the music you want to play * @returns A HTML file */ function ClassicHTML(UserName,Type,link) { return `<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title>Horizon</title> <link rel="stylesheet" href="./style.css"> </head> <body> <center> <marquee><b>waiting for u :d</b></marquee> <h2>Horizon User Infomation</h2> <h3>UserName: ${UserName} | Type: ${Type}</h3> <canvas id="myCanvas"></canvas> <script src="./script.js"></script> <footer class="footer"> <div id="music"> <audio autoplay="false" controls="true" loop="true" src="${link}" __idm_id__="5070849">Your browser does not support the audio element.</audio> <br><b>Session ID:</b> ${global.Fca.Require.Security.create().uuid}<br> <br>Thanks For Using <b>Fca-Horizon-Remastered</b> - From <b>Kanzu</b> <3<br> </div> </footer> </div> </center> </html> </body>` //lazy to change } //-[ Stating Http Infomation ]-!/ express.set('DFP', (process.env.PORT || process.env.port || 80)); express.use(function(req, res, next) { switch (req.url.split('?')[0]) { case '/script.js': { res.writeHead(200, { 'Content-Type': 'text/javascript' }); res.write(js); break; } case '/style.css': { res.writeHead(200, { 'Content-Type': 'text/css' }); res.write(css); break; } default: { res.writeHead(200, "OK", { "Content-Type": "text/html" }); res.write(ClassicHTML(global.Fca.Require.FastConfig.HTML.UserName, "Premium Access", global.Fca.Require.FastConfig.HTML.MusicLink)); } } res.end(); }) var Server; if (global.Fca.Require.FastConfig.HTML.HTML) Server= express.listen(express.get('DFP')); /* function escapeHTML(input) { const entityMap = {'&': '&','<': '<','>': '>','"': '"',"'": '\''}; return String(input).replace(/[&<>"'`=\/]/g, function(s) { return entityMap[s]; }); } //avoid html injection if (global.Fca.Require.FastConfig.Websocket_Extension.Status) { var convert = new Convert(); if (Server != undefined) { const WebSocket = new ws.Server({ noServer: true }); const { Client, WSS } = Websocket.connect(WebSocket); Server.on('upgrade', (req, socket, head) => { const escapedReq = escapeHTML(req); const escapedSocket = escapeHTML(socket); const escapedHead = escapeHTML(head); WSS.handleUpgrade(escapedReq, escapedSocket, escapedHead, (wss) => { const escapedWss = escapeHTML(wss); const escapedReq = escapeHTML(req); escapedWss.emit('connection', escapedWss, escapedReq); }); }); console._log = console.__log console.log = function(data) { const All = Object.keys(Client) console._log.apply(data,arguments) try { const log = (convert.toHtml(data) || data || "Nothing to show") console.history.push(log) if (console.history.length > 80) { console.history.shift(); } for (let i of All) { if (Client[i].Status) { Client[i].Websocket.send(JSON.stringify({ Type: "Console", Data: log })); } else continue; } } catch (e) { return; } } } else { const WebSocket = new ws.Server({ port: 80 }); const { Client } = Websocket.connect(WebSocket); console._log = console.__log console.log = function(data) { const All = Object.keys(Client) console._log.apply(data,arguments) try { const log = convert.toHtml(data) console.history.push(log) if (console.history.length > 80) { console.history.shift(); } for (let i of All) { if (Client[i].Status) { Client[i].Websocket.send(JSON.stringify({ Type: "Console", Data: log })); } else continue; } } catch (e) { return } } } } **/ //-[ Function setOptions ]-!/ /** * @param {{ [x: string]: boolean; selfListen?: boolean; listenEvents?: boolean; listenTyping?: boolean; updatePresence?: boolean; forceLogin?: boolean; autoMarkDelivery?: boolean; autoMarkRead?: boolean; autoReconnect?: boolean; logRecordSize: any; online?: boolean; emitReady?: boolean; userAgent: any; logLevel?: any; pageID?: any; proxy?: any; }} globalOptions * @param {{ [x: string]: any; logLevel?: any; forceLogin?: boolean; userAgent?: any; pauseLog?: any; logRecordSize?: any; pageID?: any; proxy?: any; }} options */ 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.FastConfig.AutoLogin) { return global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() { global.Fca.Action('AutoLogin') }); } else if (!global.Fca.Require.FastConfig.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.FastConfig.AntiGetInfo.AntiGetThreadInfo != true || File == 'getUserInfo.js' && global.Fca.Require.FastConfig.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.FastConfig.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.FastConfig.AuthString.includes('|') == false ? Otp_code(global.Fca.Require.FastConfig.AuthString.includes(" ") ? global.Fca.Require.FastConfig.AuthString.replace(RegExp(" ", 'g'), "") : global.Fca.Require.FastConfig.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) {