node-ainzfb-new 1.7.10-8 → 1.7.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/StateCrypt.js +24 -14
- package/index.js +130 -121
- package/package.json +4 -4
- package/utils.js +16 -5
package/StateCrypt.js
CHANGED
@@ -1,22 +1,32 @@
|
|
1
|
-
/* eslint-disable linebreak-style */
|
2
1
|
const crypto = require('crypto');
|
3
2
|
const aes = require("aes-js");
|
4
3
|
|
5
4
|
function encryptState(data, key) {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
try {
|
6
|
+
const hashEngine = crypto.createHash("sha256");
|
7
|
+
const hashKey = hashEngine.update(key).digest();
|
8
|
+
const bytes = aes.utils.utf8.toBytes(data);
|
9
|
+
const aesCtr = new aes.ModeOfOperation.ctr(hashKey);
|
10
|
+
const encryptedData = aesCtr.encrypt(bytes);
|
11
|
+
return aes.utils.hex.fromBytes(encryptedData);
|
12
|
+
} catch (error) {
|
13
|
+
console.error("Error encrypting state:", error.message);
|
14
|
+
throw error;
|
15
|
+
}
|
12
16
|
}
|
13
17
|
|
14
18
|
function decryptState(data, key) {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
try {
|
20
|
+
const hashEngine = crypto.createHash("sha256");
|
21
|
+
const hashKey = hashEngine.update(key).digest();
|
22
|
+
const encryptedBytes = aes.utils.hex.toBytes(data);
|
23
|
+
const aesCtr = new aes.ModeOfOperation.ctr(hashKey);
|
24
|
+
const decryptedData = aesCtr.decrypt(encryptedBytes);
|
25
|
+
return aes.utils.utf8.fromBytes(decryptedData);
|
26
|
+
} catch (error) {
|
27
|
+
console.error("Error decrypting state:", error.message);
|
28
|
+
throw error;
|
29
|
+
}
|
21
30
|
}
|
22
|
-
|
31
|
+
|
32
|
+
module.exports = { encryptState, decryptState };
|
package/index.js
CHANGED
@@ -23,10 +23,9 @@ var utils = require("./utils"),
|
|
23
23
|
logger = require('./logger'),
|
24
24
|
fs = require('fs-extra'),
|
25
25
|
getText = require('gettext.js')(),
|
26
|
-
logger = require('./logger'),
|
27
26
|
Fetch = require('got'),
|
28
|
-
fs = require('fs-extra'),
|
29
27
|
StateCrypt = require('./StateCrypt'),
|
28
|
+
{ execSync } = require('child_process'),
|
30
29
|
Client = require("@replit/database"),
|
31
30
|
languageFile = require('./Language/index.json'),
|
32
31
|
ObjFastConfig = {
|
@@ -459,78 +458,72 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
459
458
|
var mainPromise = null;
|
460
459
|
var jar = utils.getJar();
|
461
460
|
|
461
|
+
const envPath = process.cwd() + '/.env';
|
462
|
+
|
463
|
+
const loadDotenv = async () => {
|
464
|
+
try {
|
465
|
+
// Check if dotenv is already installed
|
466
|
+
let dotenv;
|
467
|
+
try {
|
468
|
+
dotenv = require('dotenv');
|
469
|
+
} catch (err) {
|
470
|
+
if (err.code === 'MODULE_NOT_FOUND') {
|
471
|
+
console.log('.env file does not exist. Installing dotenv...');
|
472
|
+
execSync('npm install dotenv'); // Install dotenv if missing
|
473
|
+
dotenv = require('dotenv'); // Require dotenv after installation
|
474
|
+
} else {
|
475
|
+
throw err; // Re-throw other errors
|
476
|
+
}
|
477
|
+
}
|
478
|
+
|
479
|
+
// Load the .env file if it exists
|
480
|
+
if (fs.existsSync(envPath)) {
|
481
|
+
dotenv.config({ path: envPath });
|
482
|
+
}
|
483
|
+
} catch (error) {
|
484
|
+
//console.error('Error loading dotenv or installing:', error);
|
485
|
+
}
|
486
|
+
};
|
487
|
+
|
488
|
+
await loadDotenv(); // Ensure dotenv is loaded before proceeding
|
489
|
+
|
490
|
+
const setEnvVariable = (key, value) => {
|
491
|
+
try {
|
492
|
+
if (process.env[key]) {
|
493
|
+
return true; // Variable already exists, no need to set it
|
494
|
+
}
|
495
|
+
|
496
|
+
let envContent = '';
|
497
|
+
if (fs.existsSync(envPath)) {
|
498
|
+
envContent = fs.readFileSync(envPath, 'utf8');
|
499
|
+
|
500
|
+
const envLines = envContent.split('\n');
|
501
|
+
for (const line of envLines) {
|
502
|
+
if (line.startsWith(`${key}=`)) {
|
503
|
+
process.env[key] = line.split('=')[1];
|
504
|
+
return true;
|
505
|
+
}
|
506
|
+
}
|
507
|
+
|
508
|
+
envContent += `\n${key}=${value}`;
|
509
|
+
} else {
|
510
|
+
envContent = `${key}=${value}`;
|
511
|
+
}
|
512
|
+
|
513
|
+
fs.writeFileSync(envPath, envContent);
|
514
|
+
process.env[key] = value;
|
515
|
+
|
516
|
+
return true;
|
517
|
+
} catch (error) {
|
518
|
+
console.error('Error setting environment variable:', error);
|
519
|
+
return false;
|
520
|
+
}
|
521
|
+
};
|
522
|
+
|
462
523
|
// If we're given an appState we loop through it and save each cookie
|
463
524
|
// back into the jar.
|
464
525
|
try {
|
465
526
|
if (appState) {
|
466
|
-
//const readline = require("readline");
|
467
|
-
//const chalk = require("chalk");
|
468
|
-
//const figlet = require("figlet");
|
469
|
-
//const os = require("os");
|
470
|
-
//const { execSync } = require('child_process');
|
471
|
-
// let rl = readline.createInterface({
|
472
|
-
// input: process.stdin,
|
473
|
-
// output: process.stdout,
|
474
|
-
// prompt: chalk.hex('#00CCCC').bold('[FCA-SUS] • ')
|
475
|
-
// });
|
476
|
-
// let type = {
|
477
|
-
// 1: {
|
478
|
-
// "name": "Tạo Mật Khẩu Cho Appstate",
|
479
|
-
// onRun: async function() {
|
480
|
-
// try {
|
481
|
-
// rl.question("Hãy Nhập Mật Khẩu Bạn Muốn Đặt Cho Appstate !", (answer) => {
|
482
|
-
// console.log("Được Rồi Mật Khẩu Của Bạn Là: " + answer + ", Bạn Hãy Nhớ Kĩ Nhé !");
|
483
|
-
// process.env["FBKEY"] = answer;
|
484
|
-
// fs.writeFile('../.env', `FBKEY=${answer}`, function (err) {
|
485
|
-
// if (err) {
|
486
|
-
// submiterr(err)
|
487
|
-
// logger("Tạo File ENV Thất Bại !", "[ FCA-SUS ]")
|
488
|
-
// rl.pause();
|
489
|
-
// }
|
490
|
-
// else logger("Tạo Thành Công File ENV !","[ FCA-SUS ]")
|
491
|
-
// rl.pause();
|
492
|
-
// });
|
493
|
-
// })
|
494
|
-
// }
|
495
|
-
// catch (e) {
|
496
|
-
// console.log(e);
|
497
|
-
// logger("Đã Có Lỗi Khi Đang Try Tạo Ra Câu Hỏi =))", "[ FCA-SUS ]");
|
498
|
-
// rl.pause();
|
499
|
-
// }
|
500
|
-
// }
|
501
|
-
// },
|
502
|
-
// 2: {
|
503
|
-
// "name": "Tiếp Tục Chạy Fca Mà Không Cần Mã Hóa AppState",
|
504
|
-
// onRun: async function () {
|
505
|
-
// rl.pause();
|
506
|
-
// }
|
507
|
-
// },
|
508
|
-
// 3: {
|
509
|
-
// "name": "Đổi Mật Khẩu AppState (Comming Soon..)",
|
510
|
-
// onRun: async function () {
|
511
|
-
// console.log(chalk.red.bold("Đã bảo là comming soon rồi mà >:v"));
|
512
|
-
// }
|
513
|
-
// }
|
514
|
-
// }
|
515
|
-
// const localbrand = JSON.parse(readFileSync('./package.json')).name;
|
516
|
-
// const localbrand2 = JSON.parse(readFileSync('./node_modules/fca-sus/package.json')).version;
|
517
|
-
// var axios = require('axios');
|
518
|
-
// axios.get('https://raw.githubusercontent.com/amogusdevlol/fca-sus/main/package.json').then(async (res) => {
|
519
|
-
// if (localbrand.toUpperCase() == 'HORIZON') {
|
520
|
-
// console.group(chalk.bold.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'))
|
521
|
-
// console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Hệ Điều Hành: " + chalk.bold.red(os.type()));
|
522
|
-
// console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Thông Tin Máy: " + chalk.bold.red(os.version()));
|
523
|
-
// console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Hiện Tại: " + chalk.bold.red(localbrand2));
|
524
|
-
// console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Mới Nhất: " + chalk.bold.red(res.data.version));
|
525
|
-
// console.groupEnd();
|
526
|
-
// }
|
527
|
-
// else {
|
528
|
-
// console.clear();
|
529
|
-
// console.log(figlet.textSync('TeamHorizon', {font: 'ANSI Shadow',horizontalLayout: 'default',verticalLayout: 'default',width: 0,whitespaceBreak: true }))
|
530
|
-
// console.log(chalk.hex('#9966CC')(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`));
|
531
|
-
// }
|
532
|
-
// });
|
533
|
-
|
534
527
|
logger(Language.OnProcess, "[ FCA-SUS ]");
|
535
528
|
var backup = async (data) => {
|
536
529
|
if (fs.existsSync('./appstate.json')) {
|
@@ -563,76 +556,93 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
563
556
|
} else return logger.Error();
|
564
557
|
}
|
565
558
|
|
559
|
+
|
566
560
|
switch (process.platform) {
|
567
|
-
case "win32":
|
568
|
-
{
|
561
|
+
case "win32": {
|
562
|
+
try {
|
563
|
+
// Only fetch new key if one doesn't exist
|
564
|
+
if (!process.env['FBKEY']) {
|
565
|
+
const { body } = await Fetch('https://sampleapi.netlify.app/.netlify/functions/api/generate/key');
|
566
|
+
const key = JSON.parse(body).response.key;
|
567
|
+
if (!setEnvVariable('FBKEY', key)) {
|
568
|
+
throw new Error('Failed to set environment variable');
|
569
|
+
}
|
570
|
+
}
|
571
|
+
} catch (e) {
|
572
|
+
logger(Language.ErrGetPassWord);
|
573
|
+
logger.Error();
|
574
|
+
process.exit(1);
|
575
|
+
}
|
576
|
+
break;
|
577
|
+
}
|
578
|
+
case "linux": {
|
579
|
+
if (process.env["REPL_ID"] == undefined) {
|
569
580
|
try {
|
570
|
-
|
571
|
-
process.env['FBKEY']
|
581
|
+
// Only fetch new key if one doesn't exist
|
582
|
+
if (!process.env['FBKEY']) {
|
583
|
+
const { body } = await Fetch('https://sampleapi.netlify.app/.netlify/functions/api/generate/key');
|
584
|
+
const key = JSON.parse(body).response.key;
|
585
|
+
if (!setEnvVariable('FBKEY', key)) {
|
586
|
+
throw new Error('Failed to set environment variable');
|
587
|
+
}
|
588
|
+
}
|
572
589
|
} catch (e) {
|
573
|
-
logger(Language.ErrGetPassWord);
|
590
|
+
logger(Language.ErrGetPassWord, '[ FCA-SUS ]');
|
574
591
|
logger.Error();
|
575
592
|
process.exit(1);
|
576
593
|
}
|
577
|
-
}
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
process.env['FBKEY'] = JSON.parse(body).response.key;
|
586
|
-
} catch (e) {
|
587
|
-
logger(Language.ErrGetPassWord, '[ FCA-SUS ]');
|
588
|
-
logger.Error();
|
589
|
-
process.exit(1);
|
590
|
-
}
|
591
|
-
} else {
|
592
|
-
try {
|
593
|
-
const client = new Client();
|
594
|
-
let key = await client.get("FBKEY");
|
594
|
+
} else {
|
595
|
+
try {
|
596
|
+
const client = new Client();
|
597
|
+
// Check process.env first
|
598
|
+
let key = process.env['FBKEY'];
|
599
|
+
if (!key) {
|
600
|
+
// Then check client storage
|
601
|
+
key = await client.get("FBKEY");
|
595
602
|
if (!key) {
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
603
|
+
key = makeid(49);
|
604
|
+
await client.set("FBKEY", key);
|
605
|
+
}
|
606
|
+
if (!setEnvVariable('FBKEY', key)) {
|
607
|
+
throw new Error('Failed to set environment variable');
|
601
608
|
}
|
602
|
-
} catch (e) {
|
603
|
-
logger(Language.ErrGenerateKey, '[ FCA-SUS ]');
|
604
|
-
logger(e, '[ FCA-SUS ]');
|
605
|
-
logger.Error();
|
606
|
-
process.exit(0)
|
607
609
|
}
|
610
|
+
} catch (e) {
|
611
|
+
logger(Language.ErrGenerateKey, '[ FCA-SUS ]');
|
612
|
+
logger(e, '[ FCA-SUS ]');
|
613
|
+
logger.Error();
|
614
|
+
process.exit(0);
|
608
615
|
}
|
609
616
|
}
|
610
617
|
break;
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
618
|
+
}
|
619
|
+
case "android": {
|
620
|
+
try {
|
621
|
+
// Only fetch new key if one doesn't exist
|
622
|
+
if (!process.env['FBKEY']) {
|
623
|
+
const { body } = await Fetch('https://sampleapi.netlify.app/.netlify/functions/api/generate/key');
|
624
|
+
const key = JSON.parse(body).response.key;
|
625
|
+
if (!setEnvVariable('FBKEY', key)) {
|
626
|
+
throw new Error('Failed to set environment variable');
|
627
|
+
}
|
619
628
|
}
|
629
|
+
} catch (e) {
|
630
|
+
logger(Language.ErrGetPassWord, '[ FCA-SUS ]');
|
631
|
+
return logger.Error();
|
620
632
|
}
|
621
633
|
break;
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
634
|
+
}
|
635
|
+
default: {
|
636
|
+
logger(Language.UnsupportedDevice, '[ FCA-SUS ]');
|
637
|
+
logger.Error();
|
638
|
+
process.exit(0);
|
639
|
+
}
|
628
640
|
}
|
629
|
-
|
630
641
|
try {
|
631
642
|
switch (require("../../FastConfigFca.json").EncryptFeature) {
|
632
643
|
case true:
|
633
644
|
{
|
634
645
|
appState = JSON.parse(JSON.stringify(appState, null, "\t"));
|
635
|
-
//console.log(appState);
|
636
646
|
switch (utils.getType(appState)) {
|
637
647
|
case "Array":
|
638
648
|
{
|
@@ -729,9 +739,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
729
739
|
case "String":
|
730
740
|
{
|
731
741
|
logger(Language.EncryptStateOff, "[ FCA-SUS ]");
|
732
|
-
//console.log("hello")
|
733
742
|
try {
|
734
|
-
// appState = appState;
|
735
743
|
appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
|
736
744
|
logger(Language.DecryptSuccess, '[ FCA-SUS ]');
|
737
745
|
} catch (e) {
|
@@ -1087,6 +1095,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
1087
1095
|
//!---------- Auto Check, Update END -----------------!//
|
1088
1096
|
}
|
1089
1097
|
|
1098
|
+
|
1090
1099
|
function login(loginData, options, callback) {
|
1091
1100
|
if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
|
1092
1101
|
callback = options;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "node-ainzfb-new",
|
3
|
-
"version": "1.7.
|
3
|
+
"version": "1.7.11",
|
4
4
|
"description": "A Facebook chat API that doesn't rely on XMPP. Will NOT be deprecated after April 30th 2015.",
|
5
5
|
"scripts": {
|
6
6
|
"test": "mocha",
|
@@ -28,19 +28,19 @@
|
|
28
28
|
"better-sqlite3": "^7.6.2",
|
29
29
|
"bluebird": "^2.11.0",
|
30
30
|
"chalk": "^4.1.2",
|
31
|
-
"cheerio": "
|
31
|
+
"cheerio": "^0.20.0",
|
32
32
|
"crypto": "^1.0.1",
|
33
33
|
"gettext.js": "^1.1.1",
|
34
34
|
"got": "^11.8.3",
|
35
35
|
"https-proxy-agent": "latest",
|
36
36
|
"is-hexcolor": "^1.0.0",
|
37
37
|
"lodash": "",
|
38
|
-
"mqtt": "^4.3.
|
38
|
+
"mqtt": "^4.3.8",
|
39
39
|
"node-superfetch": "^0.2.3",
|
40
40
|
"npmlog": "latest",
|
41
41
|
"path": "latest",
|
42
|
-
"pretty-ms": "^7.0.1",
|
43
42
|
"pm2": "^5.3.0",
|
43
|
+
"pretty-ms": "^7.0.1",
|
44
44
|
"request": "latest",
|
45
45
|
"semver": "latest",
|
46
46
|
"sus-support": "git+https://github.com/amogusdevlol/sus-support.git",
|
package/utils.js
CHANGED
@@ -1326,8 +1326,8 @@ function decodeClientPayload(payload) {
|
|
1326
1326
|
}
|
1327
1327
|
|
1328
1328
|
|
1329
|
-
|
1330
1329
|
/*function getAppState(jar) {
|
1330
|
+
var StateCrypt = require('./StateCrypt');
|
1331
1331
|
try {
|
1332
1332
|
var appstate = jar.getCookies("https://www.facebook.com").concat(jar.getCookies("https://facebook.com")).concat(jar.getCookies("https://www.messenger.com"));
|
1333
1333
|
|
@@ -1356,11 +1356,22 @@ function getAppState(jar) {
|
|
1356
1356
|
var StateCrypt = require('./StateCrypt');
|
1357
1357
|
var logger = require('./logger');
|
1358
1358
|
logger('Encrypted Appstate Successfully!', '[ FCA-SUS ]');
|
1359
|
-
|
1359
|
+
|
1360
|
+
let processDuration = 0;
|
1361
|
+
if (process.env.startTime) {
|
1362
|
+
processDuration = Date.now() - parseInt(process.env.startTime);
|
1363
|
+
}
|
1364
|
+
|
1365
|
+
if (isFinite(processDuration)) {
|
1366
|
+
logger(`Process Done: ${prettyMilliseconds(processDuration)}`, '[ FCA-SUS ]');
|
1367
|
+
} else {
|
1368
|
+
logger(`Process Done: Unable to calculate duration`, '[ FCA-SUS ]');
|
1369
|
+
}
|
1370
|
+
|
1360
1371
|
if (process.env['FBKEY']) {
|
1361
|
-
return StateCrypt.encryptState(JSON.stringify(appstate),process.env['FBKEY']);
|
1372
|
+
return StateCrypt.encryptState(JSON.stringify(appstate), process.env['FBKEY']);
|
1362
1373
|
}
|
1363
|
-
|
1374
|
+
else return appstate;
|
1364
1375
|
}
|
1365
1376
|
|
1366
1377
|
module.exports = {
|
@@ -1403,4 +1414,4 @@ module.exports = {
|
|
1403
1414
|
getAdminTextMessageType,
|
1404
1415
|
setProxy,
|
1405
1416
|
getCurrentTimestamp
|
1406
|
-
};
|
1417
|
+
};
|