node-ainzfb-new 1.7.10-2-zGsq2er → 1.7.10-26yTr9uw
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 +78 -110
- package/package.json +3 -3
- package/src/pinMessage.js +58 -0
- package/src/shareContact.js +46 -0
- package/src/shareLink.js +54 -0
- package/utils.js +23 -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
@@ -9,7 +9,7 @@ process.env.UV_THREADPOOL_SIZE = require('os').cpus().length;
|
|
9
9
|
global.isThread = new Array();
|
10
10
|
global.isUser = new Array();
|
11
11
|
global.startTime = Date.now();
|
12
|
-
global.getText =
|
12
|
+
global.getText = require('gettext.js')();
|
13
13
|
|
14
14
|
/!-[ Require All Package Need Use ]-!/
|
15
15
|
/*globalThis.Fca = new Object({
|
@@ -19,13 +19,11 @@ global.getText = require('gettext.js')();
|
|
19
19
|
var utils = require("./utils"),
|
20
20
|
cheerio = require("cheerio"),
|
21
21
|
log = require("npmlog"),
|
22
|
-
//{ getAccessToken } = require('./Extra/ExtraAddons'),
|
22
|
+
//{ getAccessToken } = require('./Extra/ExtraAddons'),
|
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'),
|
30
28
|
Client = require("@replit/database"),
|
31
29
|
languageFile = require('./Language/index.json'),
|
@@ -90,7 +88,7 @@ var checkVerified = null;
|
|
90
88
|
/!-[ Function setOptions ]-!/
|
91
89
|
|
92
90
|
function setOptions(globalOptions, options) {
|
93
|
-
Object.keys(options).map(function(key) {
|
91
|
+
Object.keys(options).map(function (key) {
|
94
92
|
switch (key) {
|
95
93
|
case 'pauseLog':
|
96
94
|
if (options.pauseLog) log.pause();
|
@@ -158,7 +156,7 @@ function setOptions(globalOptions, options) {
|
|
158
156
|
/!-[ Function BuildAPI ]-!/
|
159
157
|
|
160
158
|
async function buildAPI(globalOptions, html, jar) {
|
161
|
-
var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function(val) { return val.cookieString().split("=")[0] === "c_user"; });
|
159
|
+
var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function (val) { return val.cookieString().split("=")[0] === "c_user"; });
|
162
160
|
|
163
161
|
if (maybeCookie.length === 0) throw { error: Language.ErrAppState };
|
164
162
|
|
@@ -246,7 +244,7 @@ async function buildAPI(globalOptions, html, jar) {
|
|
246
244
|
}
|
247
245
|
|
248
246
|
function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
249
|
-
return function(res) {
|
247
|
+
return function (res) {
|
250
248
|
var html = res.body;
|
251
249
|
var $ = cheerio.load(html);
|
252
250
|
var arr = [];
|
@@ -254,7 +252,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
254
252
|
// This will be empty, but just to be sure we leave it
|
255
253
|
$("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
|
256
254
|
|
257
|
-
arr = arr.filter(function(v) {
|
255
|
+
arr = arr.filter(function (v) {
|
258
256
|
return v.val && v.val.length;
|
259
257
|
});
|
260
258
|
|
@@ -280,7 +278,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
280
278
|
//
|
281
279
|
// ---------- Very Hacky Part Starts -----------------
|
282
280
|
var willBeCookies = html.split("\"_js_");
|
283
|
-
willBeCookies.slice(1).map(function(val) {
|
281
|
+
willBeCookies.slice(1).map(function (val) {
|
284
282
|
var cookieData = JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]");
|
285
283
|
jar.setCookie(utils.formatCookie(cookieData, "facebook"), "https://www.facebook.com");
|
286
284
|
});
|
@@ -290,7 +288,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
290
288
|
return utils
|
291
289
|
.post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions)
|
292
290
|
.then(utils.saveCookies(jar))
|
293
|
-
.then(function(res) {
|
291
|
+
.then(function (res) {
|
294
292
|
var headers = res.headers;
|
295
293
|
if (!headers.location) throw { error: Language.InvaildAccount };
|
296
294
|
|
@@ -302,21 +300,21 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
302
300
|
return utils
|
303
301
|
.get(headers.location, jar, null, loginOptions)
|
304
302
|
.then(utils.saveCookies(jar))
|
305
|
-
.then(function(res) {
|
303
|
+
.then(function (res) {
|
306
304
|
var html = res.body;
|
307
305
|
// Make the form in advance which will contain the fb_dtsg and nh
|
308
306
|
var $ = cheerio.load(html);
|
309
307
|
var arr = [];
|
310
308
|
$("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
|
311
309
|
|
312
|
-
arr = arr.filter(function(v) {
|
310
|
+
arr = arr.filter(function (v) {
|
313
311
|
return v.val && v.val.length;
|
314
312
|
});
|
315
313
|
|
316
314
|
var form = utils.arrToForm(arr);
|
317
315
|
if (html.indexOf("checkpoint/?next") > -1) {
|
318
316
|
setTimeout(() => {
|
319
|
-
checkVerified = setInterval((_form) => {}, 5000, {
|
317
|
+
checkVerified = setInterval((_form) => { }, 5000, {
|
320
318
|
fb_dtsg: form.fb_dtsg,
|
321
319
|
jazoest: form.jazoest,
|
322
320
|
dpr: 1
|
@@ -329,7 +327,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
329
327
|
form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue';
|
330
328
|
var prResolve = null;
|
331
329
|
var prReject = null;
|
332
|
-
var rtPromise = new Promise(function(resolve, reject) {
|
330
|
+
var rtPromise = new Promise(function (resolve, reject) {
|
333
331
|
prResolve = resolve;
|
334
332
|
prReject = reject;
|
335
333
|
});
|
@@ -337,7 +335,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
337
335
|
utils
|
338
336
|
.post(nextURL, jar, form, loginOptions)
|
339
337
|
.then(utils.saveCookies(jar))
|
340
|
-
.then(function(res) {
|
338
|
+
.then(function (res) {
|
341
339
|
var $ = cheerio.load(res.body);
|
342
340
|
var error = $("#approvals_code").parent().attr("data-xui-error");
|
343
341
|
if (error) {
|
@@ -349,7 +347,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
349
347
|
};
|
350
348
|
}
|
351
349
|
})
|
352
|
-
.then(function() {
|
350
|
+
.then(function () {
|
353
351
|
// Use the same form (safe I hope)
|
354
352
|
delete form.no_fido;
|
355
353
|
delete form.approvals_code;
|
@@ -357,14 +355,14 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
357
355
|
|
358
356
|
return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
|
359
357
|
})
|
360
|
-
.then(function(res) {
|
358
|
+
.then(function (res) {
|
361
359
|
var headers = res.headers;
|
362
360
|
if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: Language.ApprovalsErr };
|
363
361
|
|
364
362
|
var appState = utils.getAppState(jar);
|
365
363
|
|
366
364
|
if (callback === prCallback) {
|
367
|
-
callback = function(err, api) {
|
365
|
+
callback = function (err, api) {
|
368
366
|
if (err) return prReject(err);
|
369
367
|
return prResolve(api);
|
370
368
|
};
|
@@ -374,7 +372,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
374
372
|
// and will then complete the login process
|
375
373
|
return loginHelper(appState, email, password, loginOptions, callback);
|
376
374
|
})
|
377
|
-
.catch(function(err) {
|
375
|
+
.catch(function (err) {
|
378
376
|
// Check if using Promise instead of callback
|
379
377
|
if (callback === prCallback) prReject(err);
|
380
378
|
else callback(err);
|
@@ -390,7 +388,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
390
388
|
clearInterval(checkVerified);
|
391
389
|
logger(Language.VerifiedCheck, "[ FCA-SUS ]");
|
392
390
|
if (callback === prCallback) {
|
393
|
-
callback = function(err, api) {
|
391
|
+
callback = function (err, api) {
|
394
392
|
if (err) return prReject(err);
|
395
393
|
return prResolve(api);
|
396
394
|
};
|
@@ -416,13 +414,13 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
416
414
|
return utils
|
417
415
|
.post(nextURL, jar, form, loginOptions)
|
418
416
|
.then(utils.saveCookies(jar))
|
419
|
-
.then(function() {
|
417
|
+
.then(function () {
|
420
418
|
// Use the same form (safe I hope)
|
421
419
|
form.name_action_selected = 'save_device';
|
422
420
|
|
423
421
|
return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
|
424
422
|
})
|
425
|
-
.then(function(res) {
|
423
|
+
.then(function (res) {
|
426
424
|
var headers = res.headers;
|
427
425
|
|
428
426
|
if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." };
|
@@ -463,76 +461,8 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
463
461
|
// back into the jar.
|
464
462
|
try {
|
465
463
|
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
464
|
logger(Language.OnProcess, "[ FCA-SUS ]");
|
535
|
-
var backup = async(data) => {
|
465
|
+
var backup = async (data) => {
|
536
466
|
if (fs.existsSync('./appstate.json')) {
|
537
467
|
try {
|
538
468
|
fs.writeFileSync('./appstate.json', data);
|
@@ -580,9 +510,9 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
580
510
|
{
|
581
511
|
if (process.env["REPL_ID"] == undefined) {
|
582
512
|
try {
|
583
|
-
|
584
|
-
|
585
|
-
|
513
|
+
var { body } = await Fetch('https://sampleapi.netlify.app/.netlify/functions/api/generate/key');
|
514
|
+
|
515
|
+
process.env['FBKEY'] = JSON.parse(body).response.key;
|
586
516
|
} catch (e) {
|
587
517
|
logger(Language.ErrGetPassWord, '[ FCA-SUS ]');
|
588
518
|
logger.Error();
|
@@ -611,7 +541,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
611
541
|
case "android":
|
612
542
|
{
|
613
543
|
try {
|
614
|
-
|
544
|
+
var { body } = await Fetch('https://sampleapi.netlify.app/.netlify/functions/api/generate/key');
|
615
545
|
process.env['FBKEY'] = JSON.parse(body).response.key;
|
616
546
|
} catch (e) {
|
617
547
|
logger(Language.ErrGetPassWord, '[ FCA-SUS ]');
|
@@ -632,7 +562,6 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
632
562
|
case true:
|
633
563
|
{
|
634
564
|
appState = JSON.parse(JSON.stringify(appState, null, "\t"));
|
635
|
-
//console.log(appState);
|
636
565
|
switch (utils.getType(appState)) {
|
637
566
|
case "Array":
|
638
567
|
{
|
@@ -729,9 +658,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
729
658
|
case "String":
|
730
659
|
{
|
731
660
|
logger(Language.EncryptStateOff, "[ FCA-SUS ]");
|
732
|
-
//console.log("hello")
|
733
661
|
try {
|
734
|
-
// appState = appState;
|
735
662
|
appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
|
736
663
|
logger(Language.DecryptSuccess, '[ FCA-SUS ]');
|
737
664
|
} catch (e) {
|
@@ -827,7 +754,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
827
754
|
}
|
828
755
|
}
|
829
756
|
try {
|
830
|
-
appState.map(function(c) {
|
757
|
+
appState.map(function (c) {
|
831
758
|
var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
|
832
759
|
jar.setCookie(str, "http://" + c.domain);
|
833
760
|
});
|
@@ -879,7 +806,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
879
806
|
mainPromise = utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
|
880
807
|
} catch (e) {
|
881
808
|
|
882
|
-
if
|
809
|
+
if (process.env.Backup != undefined && process.env.Backup) {
|
883
810
|
return backup(process.env.Backup);
|
884
811
|
}
|
885
812
|
switch (process.platform) {
|
@@ -951,7 +878,7 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
951
878
|
.get("https://www.facebook.com/", null, null, globalOptions, { noRef: true })
|
952
879
|
.then(utils.saveCookies(jar))
|
953
880
|
.then(makeLogin(jar, email, password, globalOptions, callback, prCallback))
|
954
|
-
.then(function() {
|
881
|
+
.then(function () {
|
955
882
|
return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(utils.saveCookies(jar));
|
956
883
|
});
|
957
884
|
}
|
@@ -962,15 +889,54 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
962
889
|
var _defaultFuncs = null;
|
963
890
|
var api = null;
|
964
891
|
|
892
|
+
let redirect = [1, "https://m.facebook.com/"], bypass_region_err = false;
|
893
|
+
|
894
|
+
function CheckAndFixErr(res) {
|
895
|
+
let reg_antierr = /This browser is not supported/gs; // =))))))
|
896
|
+
if (reg_antierr.test(res.body)) {
|
897
|
+
const Data = JSON.stringify(res.body);
|
898
|
+
const Dt_Check = Data.split('2Fhome.php&gfid=')[1];
|
899
|
+
if (Dt_Check == undefined) return res
|
900
|
+
const fid = Dt_Check.split("\\\\")[0];//fix sau
|
901
|
+
if (Dt_Check == undefined || Dt_Check == "") return res
|
902
|
+
const final_fid = fid.split(`\\`)[0];
|
903
|
+
if (final_fid == undefined || final_fid == '') return res;
|
904
|
+
const redirectlink = redirect[1] + "a/preferences.php?basic_site_devices=m_basic&uri=" + encodeURIComponent("https://m.facebook.com/home.php") + "&gfid=" + final_fid;
|
905
|
+
bypass_region_err = true;
|
906
|
+
return utils.get(redirectlink, jar, null, globalOptions).then(utils.saveCookies(jar));
|
907
|
+
}
|
908
|
+
else return res
|
909
|
+
}
|
910
|
+
|
911
|
+
function Redirect(res) {
|
912
|
+
var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/;
|
913
|
+
redirect = reg.exec(res.body);
|
914
|
+
if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
|
915
|
+
return res;
|
916
|
+
}
|
917
|
+
|
965
918
|
mainPromise = mainPromise
|
966
|
-
.then(function(res) {
|
919
|
+
.then(function (res) {
|
967
920
|
// Hacky check for the redirection that happens on some ISPs, which doesn't return statusCode 3xx
|
968
921
|
var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/;
|
969
922
|
var redirect = reg.exec(res.body);
|
970
923
|
if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
|
971
924
|
return res;
|
972
925
|
})
|
973
|
-
.then(
|
926
|
+
.then(res => Redirect(res))
|
927
|
+
.then(res => CheckAndFixErr(res))
|
928
|
+
.then(function (res) {
|
929
|
+
let Regex_Via = /MPageLoadClientMetrics/gs; //default for normal account, can easily get region, without this u can't get region in some case but u can run normal
|
930
|
+
if (!Regex_Via.test(res.body)) {
|
931
|
+
//www.facebook.com
|
932
|
+
globalOptions.userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1";
|
933
|
+
return utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
|
934
|
+
}
|
935
|
+
else return res
|
936
|
+
})
|
937
|
+
.then(res => Redirect(res))
|
938
|
+
.then(res => CheckAndFixErr(res))
|
939
|
+
.then(async function (res) {
|
974
940
|
var html = res.body;
|
975
941
|
var stuff = await buildAPI(globalOptions, html, jar);
|
976
942
|
ctx = stuff[0];
|
@@ -978,13 +944,14 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
978
944
|
api = stuff[2];
|
979
945
|
return res;
|
980
946
|
});
|
947
|
+
|
981
948
|
// given a pageID we log in as a page
|
982
949
|
if (globalOptions.pageID) {
|
983
950
|
mainPromise = mainPromise
|
984
|
-
.then(function() {
|
951
|
+
.then(function () {
|
985
952
|
return utils.get('https://www.facebook.com/' + ctx.globalOptions.pageID + '/messages/?section=messages&subsection=inbox', ctx.jar, null, globalOptions);
|
986
953
|
})
|
987
|
-
.then(function(resData) {
|
954
|
+
.then(function (resData) {
|
988
955
|
var url = utils.getFrom(resData.body, 'window.location.replace("https:\\/\\/www.facebook.com\\', '");').split('\\').join('');
|
989
956
|
url = url.substring(0, url.length - 1);
|
990
957
|
return utils.get('https://www.facebook.com' + url, ctx.jar, null, globalOptions);
|
@@ -993,14 +960,14 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
993
960
|
|
994
961
|
// At the end we call the callback or catch an exception
|
995
962
|
mainPromise
|
996
|
-
.then(function() {
|
963
|
+
.then(function () {
|
997
964
|
logger(Language.DoneLogin, "[ FCA-SUS ]");
|
998
965
|
logger(Language.AutoCheckUpdate, "[ FCA-SUS ]");
|
999
966
|
//!---------- Auto Check, Update START -----------------!//
|
1000
967
|
var Fetch = require('got');
|
1001
968
|
var { readFileSync } = require('fs-extra');
|
1002
969
|
const { execSync } = require('child_process');
|
1003
|
-
Fetch('https://raw.githubusercontent.com/amogusdevlol/node-ainzfb/main/package.json').then(async(res) => {
|
970
|
+
Fetch('https://raw.githubusercontent.com/amogusdevlol/node-ainzfb/main/package.json').then(async (res) => {
|
1004
971
|
const localbrand = JSON.parse(readFileSync('./node_modules/node-ainzfb-new/package.json')).version;
|
1005
972
|
if (Number(localbrand.replace(/\./g, "")) < Number(JSON.parse(res.body.toString()).version.replace(/\./g, ""))) {
|
1006
973
|
log.warn("[ FCA-SUS ] •", getText.gettext(Language.NewVersionFound, JSON.parse(readFileSync('./node_modules/node-ainzfb/package.json')).version, JSON.parse(res.body.toString()).version));
|
@@ -1040,13 +1007,14 @@ async function loginHelper(appState, email, password, globalOptions, callback, p
|
|
1040
1007
|
callback(null, api);
|
1041
1008
|
}
|
1042
1009
|
});
|
1043
|
-
}).catch(function(e) {
|
1010
|
+
}).catch(function (e) {
|
1044
1011
|
log.error("login", e.error || e);
|
1045
1012
|
callback(e);
|
1046
1013
|
});
|
1047
1014
|
//!---------- Auto Check, Update END -----------------!//
|
1048
1015
|
}
|
1049
1016
|
|
1017
|
+
|
1050
1018
|
function login(loginData, options, callback) {
|
1051
1019
|
if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
|
1052
1020
|
callback = options;
|
@@ -1077,11 +1045,11 @@ function login(loginData, options, callback) {
|
|
1077
1045
|
if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
|
1078
1046
|
var rejectFunc = null;
|
1079
1047
|
var resolveFunc = null;
|
1080
|
-
var returnPromise = new Promise(function(resolve, reject) {
|
1048
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
1081
1049
|
resolveFunc = resolve;
|
1082
1050
|
rejectFunc = reject;
|
1083
1051
|
});
|
1084
|
-
prCallback = function(error, api) {
|
1052
|
+
prCallback = function (error, api) {
|
1085
1053
|
if (error) return rejectFunc(error);
|
1086
1054
|
return resolveFunc(api);
|
1087
1055
|
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "node-ainzfb-new",
|
3
|
-
"version": "1.7.10-
|
3
|
+
"version": "1.7.10-26yTr9uw",
|
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",
|
@@ -35,12 +35,12 @@
|
|
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": "latest",
|
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",
|
@@ -0,0 +1,58 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
const { generateOfflineThreadingID, getCurrentTimestamp } = require('../utils');
|
4
|
+
|
5
|
+
function isCallable(func) {
|
6
|
+
try {
|
7
|
+
Reflect.apply(func, null, []);
|
8
|
+
return true;
|
9
|
+
} catch (error) {
|
10
|
+
return false;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
15
|
+
return function pinMessage(pinMode, messageID, threadID, callback) {
|
16
|
+
if (!ctx.mqttClient) {
|
17
|
+
throw new Error('Not connected to MQTT');
|
18
|
+
}
|
19
|
+
|
20
|
+
ctx.wsReqNumber += 1;
|
21
|
+
ctx.wsTaskNumber += 1;
|
22
|
+
|
23
|
+
const taskLabel = pinMode ? '430' : '431';
|
24
|
+
const queueNamePrefix = pinMode ? 'pin_msg_v2_' : 'unpin_msg_v2_';
|
25
|
+
|
26
|
+
const taskPayload = {
|
27
|
+
thread_key: threadID,
|
28
|
+
message_id: messageID,
|
29
|
+
timestamp_ms: getCurrentTimestamp(),
|
30
|
+
};
|
31
|
+
|
32
|
+
const task = {
|
33
|
+
failure_count: null,
|
34
|
+
label: taskLabel,
|
35
|
+
payload: JSON.stringify(taskPayload),
|
36
|
+
queue_name: `${queueNamePrefix}${threadID}`,
|
37
|
+
task_id: ctx.wsTaskNumber,
|
38
|
+
};
|
39
|
+
|
40
|
+
const content = {
|
41
|
+
app_id: '2220391788200892',
|
42
|
+
payload: JSON.stringify({
|
43
|
+
data_trace_id: null,
|
44
|
+
epoch_id: parseInt(generateOfflineThreadingID()),
|
45
|
+
tasks: [task],
|
46
|
+
version_id: '25095469420099952',
|
47
|
+
}),
|
48
|
+
request_id: ctx.wsReqNumber,
|
49
|
+
type: 3,
|
50
|
+
};
|
51
|
+
|
52
|
+
if (isCallable(callback)) {
|
53
|
+
// to be implemented
|
54
|
+
}
|
55
|
+
|
56
|
+
ctx.mqttClient.publish('/ls_req', JSON.stringify(content), { qos: 1, retain: false });
|
57
|
+
};
|
58
|
+
};
|
@@ -0,0 +1,46 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var utils = require("../utils");
|
4
|
+
var log = require("npmlog");
|
5
|
+
|
6
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
7
|
+
return async function shareContact(text, senderID, threadID, mentionID, userID, leaverID, callback) {
|
8
|
+
var resolveFunc = function () { };
|
9
|
+
var rejectFunc = function () { };
|
10
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
11
|
+
resolveFunc = resolve;
|
12
|
+
rejectFunc = reject;
|
13
|
+
});
|
14
|
+
if (!callback) {
|
15
|
+
callback = function (err, data) {
|
16
|
+
if (err) return rejectFunc(err);
|
17
|
+
resolveFunc(data);
|
18
|
+
};
|
19
|
+
}
|
20
|
+
let count_req = 0;
|
21
|
+
var form = JSON.stringify({
|
22
|
+
"app_id": "2220391788200892",
|
23
|
+
"payload": JSON.stringify({
|
24
|
+
tasks: [{
|
25
|
+
label: '359',
|
26
|
+
payload: JSON.stringify({
|
27
|
+
"contact_id": senderID,
|
28
|
+
"sync_group": 1,
|
29
|
+
"text": text || "",
|
30
|
+
"thread_id": threadID
|
31
|
+
}),
|
32
|
+
queue_name: 'messenger_contact_sharing',
|
33
|
+
task_id: Math.random() * 1001 << 0,
|
34
|
+
failure_count: null,
|
35
|
+
}],
|
36
|
+
epoch_id: utils.generateOfflineThreadingID(),
|
37
|
+
version_id: '7214102258676893',
|
38
|
+
}),
|
39
|
+
"request_id": ++count_req,
|
40
|
+
"type": 3
|
41
|
+
});
|
42
|
+
ctx.mqttClient.publish('/ls_req', form);
|
43
|
+
|
44
|
+
return returnPromise;
|
45
|
+
};
|
46
|
+
};
|
package/src/shareLink.js
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var utils = require("../utils");
|
4
|
+
var log = require("npmlog");
|
5
|
+
|
6
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
7
|
+
return async function shareLink(text, url, threadID, callback) {
|
8
|
+
var resolveFunc = function () { };
|
9
|
+
var rejectFunc = function () { };
|
10
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
11
|
+
resolveFunc = resolve;
|
12
|
+
rejectFunc = reject;
|
13
|
+
});
|
14
|
+
if (!callback) {
|
15
|
+
callback = function (err, data) {
|
16
|
+
if (err) return rejectFunc(err);
|
17
|
+
resolveFunc(data);
|
18
|
+
};
|
19
|
+
}
|
20
|
+
ctx.mqttClient.publish('/ls_req',
|
21
|
+
JSON.stringify({
|
22
|
+
"app_id": "2220391788200892",
|
23
|
+
"payload": JSON.stringify({
|
24
|
+
tasks: [{
|
25
|
+
label: 46,
|
26
|
+
payload: JSON.stringify({
|
27
|
+
"otid": utils.generateOfflineThreadingID(),
|
28
|
+
"source": 524289,
|
29
|
+
"sync_group": 1,
|
30
|
+
"send_type": 6,
|
31
|
+
"mark_thread_read": 0,
|
32
|
+
"url": url || "",
|
33
|
+
"text": text || "",
|
34
|
+
"thread_id": threadID,
|
35
|
+
"initiating_source": 0
|
36
|
+
}),
|
37
|
+
queue_name: threadID,
|
38
|
+
task_id: Math.random() * 1001 << 0,
|
39
|
+
failure_count: null,
|
40
|
+
}],
|
41
|
+
epoch_id: utils.generateOfflineThreadingID(),
|
42
|
+
version_id: '7191105584331330',
|
43
|
+
}),
|
44
|
+
"request_id": ++ctx.req_ID,
|
45
|
+
"type": 3
|
46
|
+
}),
|
47
|
+
{
|
48
|
+
qos: 1,
|
49
|
+
retain: false,
|
50
|
+
}
|
51
|
+
)
|
52
|
+
return returnPromise;
|
53
|
+
};
|
54
|
+
};
|
package/utils.js
CHANGED
@@ -150,6 +150,12 @@ function generateThreadingID(clientID) {
|
|
150
150
|
return "<" + k + ":" + l + "-" + m + "@mail.projektitan.com>";
|
151
151
|
}
|
152
152
|
|
153
|
+
function getCurrentTimestamp() {
|
154
|
+
const date = new Date();
|
155
|
+
const unixTime = date.getTime();
|
156
|
+
return unixTime;
|
157
|
+
}
|
158
|
+
|
153
159
|
function binaryToDecimal(data) {
|
154
160
|
var ret = "";
|
155
161
|
while (data !== "0") {
|
@@ -1320,8 +1326,8 @@ function decodeClientPayload(payload) {
|
|
1320
1326
|
}
|
1321
1327
|
|
1322
1328
|
|
1323
|
-
|
1324
1329
|
/*function getAppState(jar) {
|
1330
|
+
var StateCrypt = require('./StateCrypt');
|
1325
1331
|
try {
|
1326
1332
|
var appstate = jar.getCookies("https://www.facebook.com").concat(jar.getCookies("https://facebook.com")).concat(jar.getCookies("https://www.messenger.com"));
|
1327
1333
|
|
@@ -1350,11 +1356,22 @@ function getAppState(jar) {
|
|
1350
1356
|
var StateCrypt = require('./StateCrypt');
|
1351
1357
|
var logger = require('./logger');
|
1352
1358
|
logger('Encrypted Appstate Successfully!', '[ FCA-SUS ]');
|
1353
|
-
|
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
|
+
|
1354
1371
|
if (process.env['FBKEY']) {
|
1355
|
-
return StateCrypt.encryptState(JSON.stringify(appstate),process.env['FBKEY']);
|
1372
|
+
return StateCrypt.encryptState(JSON.stringify(appstate), process.env['FBKEY']);
|
1356
1373
|
}
|
1357
|
-
|
1374
|
+
else return appstate;
|
1358
1375
|
}
|
1359
1376
|
|
1360
1377
|
module.exports = {
|
@@ -1395,5 +1412,6 @@ module.exports = {
|
|
1395
1412
|
decodeClientPayload,
|
1396
1413
|
getAppState,
|
1397
1414
|
getAdminTextMessageType,
|
1398
|
-
setProxy
|
1415
|
+
setProxy,
|
1416
|
+
getCurrentTimestamp
|
1399
1417
|
};
|