fca-amir
Version:
Facebook-chat-api made by Priyansh rajput
865 lines (807 loc) • 70.7 kB
JavaScript
'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);
}