fb-anya 0.0.1-security → 2.0.0

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.

Potentially problematic release.


This version of fb-anya might be problematic. Click here for more details.

Files changed (106) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -0
  2. package/.cache/replit/modules.stamp +0 -0
  3. package/.cache/replit/nix/env.json +1 -0
  4. package/.gitattributes +2 -0
  5. package/Extra/ExtraAddons.js +78 -0
  6. package/Extra/ExtraFindUID.js +60 -0
  7. package/Extra/ExtraGetThread.js +118 -0
  8. package/Extra/ExtraTranslate.js +62 -0
  9. package/Extra/ExtraUptimeRobot.js +59 -0
  10. package/Extra/Html/Classic/script.js +231 -0
  11. package/Extra/Html/Classic/style.css +149 -0
  12. package/Extra/PM2/ecosystem.config.js +23 -0
  13. package/Extra/Security/Index.js +174 -0
  14. package/Extra/Security/Step_1.js +15 -0
  15. package/Extra/Security/Step_2.js +23 -0
  16. package/Extra/Security/Step_3.js +23 -0
  17. package/Extra/Src/History.js +115 -0
  18. package/Extra/Src/Last-Run.js +65 -0
  19. package/Extra/Src/Premium.js +85 -0
  20. package/Extra/Src/SecurityCheck.js +2 -0
  21. package/Func/AcceptAgreement.js +33 -0
  22. package/Func/ClearCache.js +63 -0
  23. package/Func/ReportV1.js +54 -0
  24. package/Language/index.json +176 -0
  25. package/OldSecurity.js +100 -0
  26. package/README.md +16 -3
  27. package/Settings/Database.js +21 -0
  28. package/Settings/Location.js +60 -0
  29. package/Settings/Location.json +24 -0
  30. package/Settings/Settings.js +60 -0
  31. package/StateCrypt.js +98 -0
  32. package/broadcast.js +38 -0
  33. package/index.js +1451 -0
  34. package/logger.js +65 -0
  35. package/package-anya/Database-Anya/index.js +358 -0
  36. package/package-anya/Database-Anya/package.json +63 -0
  37. package/package-anya/Database-Anya/readme.md +8 -0
  38. package/package-anya/anya-sp/README.md +11 -0
  39. package/package-anya/anya-sp/desktop.ini +2 -0
  40. package/package-anya/anya-sp/index.js +41 -0
  41. package/package-anya/anya-sp/logger.js +16 -0
  42. package/package-anya/anya-sp/package.json +54 -0
  43. package/package.json +84 -4
  44. package/src/K2IMG.js +8 -0
  45. package/src/Premium.js +30 -0
  46. package/src/Screenshot.js +77 -0
  47. package/src/T2S.js +8 -0
  48. package/src/addExternalModule.js +16 -0
  49. package/src/addUserToGroup.js +79 -0
  50. package/src/changeAdminStatus.js +79 -0
  51. package/src/changeArchivedStatus.js +41 -0
  52. package/src/changeAvt.js +85 -0
  53. package/src/changeBio.js +65 -0
  54. package/src/changeBlockedStatus.js +36 -0
  55. package/src/changeGroupImage.js +106 -0
  56. package/src/changeNickname.js +45 -0
  57. package/src/changeThreadColor.js +62 -0
  58. package/src/changeThreadEmoji.js +42 -0
  59. package/src/createNewGroup.js +70 -0
  60. package/src/createPoll.js +60 -0
  61. package/src/deleteMessage.js +45 -0
  62. package/src/deleteThread.js +43 -0
  63. package/src/desktop.ini +2 -0
  64. package/src/forwardAttachment.js +48 -0
  65. package/src/getAccessToken.js +32 -0
  66. package/src/getCurrentUserID.js +7 -0
  67. package/src/getEmojiUrl.js +27 -0
  68. package/src/getFriendsList.js +73 -0
  69. package/src/getMessage.js +80 -0
  70. package/src/getThreadHistory.js +537 -0
  71. package/src/getThreadInfo.js +346 -0
  72. package/src/getThreadList.js +213 -0
  73. package/src/getThreadMain.js +219 -0
  74. package/src/getThreadPictures.js +59 -0
  75. package/src/getUID.js +59 -0
  76. package/src/getUserID.js +62 -0
  77. package/src/getUserInfo.js +129 -0
  78. package/src/getUserInfoMain.js +65 -0
  79. package/src/getUserInfoV2.js +35 -0
  80. package/src/getUserInfoV3.js +63 -0
  81. package/src/getUserInfoV4.js +55 -0
  82. package/src/getUserInfoV5.js +61 -0
  83. package/src/handleFriendRequest.js +46 -0
  84. package/src/handleMessageRequest.js +49 -0
  85. package/src/httpGet.js +49 -0
  86. package/src/httpPost.js +48 -0
  87. package/src/httpPostFormData.js +41 -0
  88. package/src/listenMqtt.js +725 -0
  89. package/src/logout.js +68 -0
  90. package/src/markAsDelivered.js +48 -0
  91. package/src/markAsRead.js +70 -0
  92. package/src/markAsReadAll.js +43 -0
  93. package/src/markAsSeen.js +51 -0
  94. package/src/muteThread.js +47 -0
  95. package/src/removeUserFromGroup.js +49 -0
  96. package/src/resolvePhotoUrl.js +37 -0
  97. package/src/searchForThread.js +43 -0
  98. package/src/sendMessage.js +334 -0
  99. package/src/sendTypingIndicator.js +80 -0
  100. package/src/setMessageReaction.js +109 -0
  101. package/src/setPostReaction.js +102 -0
  102. package/src/setTitle.js +74 -0
  103. package/src/threadColors.js +39 -0
  104. package/src/unfriend.js +43 -0
  105. package/src/unsendMessage.js +40 -0
  106. package/utils.js +1648 -0
package/index.js ADDED
@@ -0,0 +1,1451 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Developers: @KanzuWakazaki - @HarryWakazaki
5
+ ** A few words about developer appstate security.
6
+ *! Statement renouncing responsibility for the security of appstate encryption of the following operating systems: windows, Android, Linux operating systems,.. (maybe repl.it?),
7
+ *! because the above operating systems are private (except rep.it if the fraudster does not own your account or invite link to join).
8
+ *! If the intruder owns the computer, these private operating systems,the security of this fca cannot guarantee 100% of the time.
9
+ ** If the grammar is wrong, please understand because I'm just a kid 🍵.
10
+ */
11
+
12
+ /!-[ Max Cpu Speed ]-!/
13
+
14
+ process.env.UV_THREADPOOL_SIZE = require('os').cpus().length;
15
+
16
+ /!-[ Global Set ]-!/
17
+
18
+ global.Fca = new Object({
19
+ isThread: new Array(),
20
+ isUser: new Array(),
21
+ startTime: Date.now(),
22
+ Setting: new Map(),
23
+ Require: new Object({
24
+ fs: require("fs"),
25
+ Fetch: require('got'),
26
+ log: require("npmlog"),
27
+ utils: require("./utils"),
28
+ logger: require('./logger'),
29
+ Security: require("uuid-apikey"),
30
+ languageFile: require('./Language/index.json'),
31
+ Database: require("./package-anya/Database-Anya")
32
+ }),
33
+ getText: function(/** @type {any[]} */...Data) {
34
+ var Main = (Data.splice(0,1)).toString();
35
+ for (let i = 0; i < Data.length; i++) Main = Main.replace(RegExp(`%${i + 1}`, 'g'), Data[i]);
36
+ return Main;
37
+ },
38
+ Data: new Object({
39
+ ObjFastConfig: {
40
+ "Language": "en",
41
+ "PreKey": "",
42
+ "AutoUpdate": true,
43
+ "MainColor": "#9900FF",
44
+ "MainName": "[ FB-ANYA ]",
45
+ "Uptime": false,
46
+ "Config": "default",
47
+ "Login2Fa": false,
48
+ "AutoLogin": false,
49
+ "BroadCast": true,
50
+ "AuthString": "SD4S XQ32 O2JA WXB3 FUX2 OPJ7 Q7JZ 4R6Z | https://i.imgur.com/RAg3rvw.png Please remove this !, Recommend If You Using getUserInfoV2",
51
+ "EncryptFeature": true,
52
+ "ResetDataLogin": false,
53
+ "AutoRestartMinutes": 0,
54
+ "HTML": {
55
+ "HTML": true,
56
+ "UserName": "Guest",
57
+ "MusicLink": ""
58
+ }
59
+ },
60
+ CountTime: function() {
61
+ var fs = global.Fca.Require.fs;
62
+ if (fs.existsSync(__dirname + '/CountTime.json')) {
63
+ try {
64
+ var data = Number(fs.readFileSync(__dirname + '/CountTime.json', 'utf8')),
65
+ hours = Math.floor(data / (60 * 60));
66
+ }
67
+ catch (e) {
68
+ fs.writeFileSync(__dirname + '/CountTime.json', 0);
69
+ hours = 0;
70
+ }
71
+ }
72
+ else {
73
+ hours = 0;
74
+ }
75
+ return `${hours} Hours`;
76
+ }
77
+ }),
78
+ AutoLogin: async function () {
79
+ var Database = global.Fca.Require.Database;
80
+ var logger = global.Fca.Require.logger;
81
+ var Email = (await global.Fca.Require.Database.get('Account')).replace(RegExp('"', 'g'), ''); //hmm IDK
82
+ var PassWord = (await global.Fca.Require.Database.get('Password')).replace(RegExp('"', 'g'), '');
83
+ login({ email: Email, password: PassWord},async (error, api) => {
84
+ if (error) {
85
+ logger.Error(JSON.stringify(error,null,2), function() { logger.Error("AutoLogin Failed!", function() { process.exit(0); }) });
86
+ }
87
+ try {
88
+ await Database.set("TempState", api.getAppState());
89
+ }
90
+ catch(e) {
91
+ logger.Warning(global.Fca.Require.Language.Index.ErrDatabase);
92
+ logger.Error();
93
+ process.exit(0);
94
+ }
95
+ process.exit(1);
96
+ });
97
+ }
98
+ });
99
+
100
+ /!-[ Check File To Run Process ]-!/
101
+
102
+ let Boolean_Fca = ["AutoUpdate","Uptime","BroadCast","EncryptFeature","AutoLogin","ResetDataLogin","Login2Fa"];
103
+ let String_Fca = ["MainName","PreKey","Language","AuthString","Config"]
104
+ let Number_Fca = ["AutoRestartMinutes"];
105
+ let All_Variable = Boolean_Fca.concat(String_Fca,Number_Fca);
106
+
107
+ try {
108
+ if (!global.Fca.Require.fs.existsSync('./FastConfigFca.json')) {
109
+ global.Fca.Require.fs.writeFileSync("./FastConfigFca.json", JSON.stringify(global.Fca.Data.ObjFastConfig, null, "\t"));
110
+ process.exit(1);
111
+ }
112
+
113
+ try {
114
+ var DataLanguageSetting = require("../../FastConfigFca.json");
115
+ }
116
+ catch (e) {
117
+ global.Fca.Require.logger.Error('Detect Your FastConfigFca Settings Invalid!, Carry out default restoration');
118
+ global.Fca.Require.fs.writeFileSync("./FastConfigFca.json", JSON.stringify(global.Fca.Data.ObjFastConfig, null, "\t"));
119
+ process.exit(1)
120
+ }
121
+ if (global.Fca.Require.fs.existsSync('./FastConfigFca.json')) {
122
+ try {
123
+ if (!DataLanguageSetting.Config || global.Fca.Require.utils.getType(DataLanguageSetting.Config) != 'String') {
124
+ DataLanguageSetting.Config = "default"
125
+ global.Fca.Require.fs.writeFileSync("./FastConfigFca.json", JSON.stringify(DataLanguageSetting, null, "\t"));
126
+ }
127
+ }
128
+ catch (e) {
129
+ console.log(e);
130
+ }
131
+ if (!global.Fca.Require.languageFile.some((/** @type {{ Language: string; }} */i) => i.Language == DataLanguageSetting.Language)) {
132
+ global.Fca.Require.logger.Warning("Not Support Language: " + DataLanguageSetting.Language + " Only 'en' and 'vi'");
133
+ process.exit(0);
134
+ }
135
+ var Language = global.Fca.Require.languageFile.find((/** @type {{ Language: string; }} */i) => i.Language == DataLanguageSetting.Language).Folder.Index;
136
+ global.Fca.Require.Language = global.Fca.Require.languageFile.find((/** @type {{ Language: string; }} */i) => i.Language == DataLanguageSetting.Language).Folder;
137
+ } else process.exit(1);
138
+ for (let i in DataLanguageSetting) {
139
+ if (Boolean_Fca.includes(i)) {
140
+ if (global.Fca.Require.utils.getType(DataLanguageSetting[i]) != "Boolean") return logger.Error(i + " Is Not A Boolean, Need To Be true Or false !", function() { process.exit(0) });
141
+ else continue;
142
+ }
143
+ else if (String_Fca.includes(i)) {
144
+ if (global.Fca.Require.utils.getType(DataLanguageSetting[i]) != "String") return logger.Error(i + " Is Not A String, Need To Be String!", function() { process.exit(0) });
145
+ else continue;
146
+ }
147
+ else if (Number_Fca.includes(i)) {
148
+ if (global.Fca.Require.utils.getType(DataLanguageSetting[i]) != "Number") return logger.Error(i + " Is Not A Number, Need To Be Number !", function() { process.exit(0) });
149
+ else continue;
150
+ }
151
+ }
152
+ for (let i of All_Variable) {
153
+ if (!DataLanguageSetting[All_Variable[i]] == undefined) {
154
+ DataLanguageSetting[All_Variable[i]] = global.Fca.Data.ObjFastConfig[All_Variable[i]];
155
+ global.Fca.Require.fs.writeFileSync("./FastConfigFca.json", JSON.stringify(DataLanguageSetting, null, "\t"));
156
+ }
157
+ else continue;
158
+ }
159
+ global.Fca.Require.FastConfig = DataLanguageSetting;
160
+ }
161
+ catch (e) {
162
+ console.log(e);
163
+ global.Fca.Require.logger.Error();
164
+ }
165
+
166
+ /!-[ Require All Package Need Use ]-!/
167
+
168
+ var utils = global.Fca.Require.utils,
169
+ logger = global.Fca.Require.logger,
170
+ fs = global.Fca.Require.fs,
171
+ getText = global.Fca.getText,
172
+ log = global.Fca.Require.log,
173
+ Fetch = global.Fca.Require.Fetch,
174
+ express = require("express")(),
175
+ { join } = require('path'),
176
+ cheerio = require("cheerio"),
177
+ StateCrypt = require('./OldSecurity'),
178
+ { readFileSync } = require('fs-extra'),
179
+ Database = require("./package-anya/Database-Anya"),
180
+ readline = require("readline"),
181
+ chalk = require("chalk"),
182
+ figlet = require("figlet"),
183
+ os = require("os"),
184
+ Security = require("./Extra/Security/Index");
185
+
186
+ /!-[ Set Variable For Process ]-!/
187
+
188
+ log.maxRecordSize = 100;
189
+ var checkVerified = null;
190
+ var Boolean_Option = ['online','selfListen','listenEvents','updatePresence','forceLogin','autoMarkDelivery','autoMarkRead','listenTyping','autoReconnect','emitReady'];
191
+
192
+ /!-[ Set And Check Template HTML ]-!/
193
+
194
+ var css = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'style.css'));
195
+ var js = readFileSync(join(__dirname, 'Extra', 'Html', 'Classic', 'script.js'));
196
+
197
+ /!-[ Function Generate HTML Template ]-!/
198
+
199
+ /**
200
+ * It returns a string of HTML code.
201
+ * @param UserName - The username of the user
202
+ * @param Type - The type of user, either "Free" or "Premium"
203
+ * @param link - The link to the music you want to play
204
+ * @returns A HTML file
205
+ */
206
+
207
+ function ClassicHTML(UserName,Type,link) {
208
+ return `<!DOCTYPE html>
209
+ <html lang="en">
210
+ <head>
211
+ <title>Choru TikTokers</title>
212
+ <link rel="shortcut icon" href="https://i.imgur.com/74HcgfV.jpeg">
213
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
214
+
215
+ <link rel="stylesheet" href="../CHORUYTAPI/css/owl.carousel.min.css" />
216
+ <link rel="stylesheet" href="../CHORUYTAPI/css/superslides.css" />
217
+ <link
218
+ rel="stylesheet"
219
+ href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
220
+ />
221
+ <link
222
+ rel="stylesheet"
223
+ href="https://use.fontawesome.com/releases/v5.10.2/css/all.css"
224
+ />
225
+ <link
226
+ rel="stylesheet"
227
+ href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css"
228
+ />
229
+ <link rel="stylesheet" href="style.css" />
230
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
231
+ </head>
232
+
233
+ <body>
234
+ <!-- Navbar -->
235
+ <nav id="navigation" class="navbar navbar-expand-lg">
236
+ <a class="navbar-brand" href="#">Choru TikTokers Api</a>
237
+
238
+ <button
239
+ class="navbar-toggler"
240
+ type="button"
241
+ data-toggle="collapse"
242
+ data-target="#navbarNav"
243
+ aria-controls="navbarNav"
244
+ aria-expanded="false"
245
+ aria-label="Toggle navigation"
246
+ >
247
+ <span class="navbar-toggler-icon"></span>
248
+ </button>
249
+
250
+ <div class="collapse navbar-collapse" id="navbarNav">
251
+ <ul class="navbar-nav">
252
+ <li class="nav-item active">
253
+ <a class="nav-link" href="https://github.com/ChoruTiktokers182"
254
+ >github<span class="sr-only"></span
255
+ ></a>
256
+ </li>
257
+ <li class="nav-item">
258
+ <a class="nav-link" href="https://www.facebook.com/profile.php?id=100084149373287&mibextid=ZbWKwL">facebook</a>
259
+ </li>
260
+ <li class="nav-item">
261
+ <a class="nav-link" href="https://replit.com/@VEGITO-OFFICIAL">replit vegito</a>
262
+ </li>
263
+ <li class="nav-item">
264
+ <a class="nav-link" href="https://replit.com/@Anya-official">replit anya</a>
265
+ </li>
266
+ <li class="nav-item">
267
+ <a class="nav-link" href="../Choru/Choru.html">api</a>
268
+ </li>
269
+ </ul>
270
+ </div>
271
+ </nav>
272
+ <!-- Stats -->
273
+ <div id="stats" class="statsSection section">
274
+ <div class="container">
275
+ <div class="row">
276
+ <div class="col-md-3 col-sm-6">
277
+ <div class="squareItem">
278
+ <div class="squareInnerContainer">
279
+ <div class="squareIcon">
280
+ <i class="fas fa-globe"></i>
281
+ </div>
282
+ <div class="squareContent">
283
+ <h2 class="counter">3367</h2>
284
+ <h3>total request</h3>
285
+ </div>
286
+ </div>
287
+ </div>
288
+ </div>
289
+
290
+ <div class="col-md-3 col-sm-6">
291
+ <div class="squareItem">
292
+ <div class="squareInnerContainer">
293
+ <div class="squareIcon">
294
+ <i class="fas fa-address-book"></i>
295
+ </div>
296
+ <div class="squareContent">
297
+ <h2 class="counter">567</h2>
298
+ <h3>total users</h3>
299
+ </div>
300
+ </div>
301
+ </div>
302
+ </div>
303
+
304
+ <div class="col-md-3 col-sm-6">
305
+ <div class="squareItem">
306
+
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ <!-- Contact -->
313
+ <div id="contact" class="contactSection section">
314
+ <div class="col-md-12 text-center">
315
+ <h3 class="subHeading">request now</h3>
316
+ <p>free public api that can be used for your project </p>
317
+ <a href="https://choruyt.okslangako.repl.co" class="contactButton"
318
+ >open api</a
319
+ >
320
+ </div>
321
+ </div>
322
+
323
+ <!-- Copyright -->
324
+
325
+ <div class="copyrightSection">
326
+ <div class="col-md-12 text-center">
327
+ <p>
328
+ Choru TikTokers
329
+ </p>
330
+ </div>
331
+ </div>
332
+
333
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/countup.js/1.8.2/countUp.min.js"></script>
334
+ <script src="../CHORUYTAPI/js/countUp-jquery.js"></script>
335
+ <script src="../CHORUYTAPI/js/jquery.superslides.min.js"></script>
336
+ <script src="../CHORUYTAPI/js/owl.carousel.min.js"></script>
337
+ <script src="../CHORUYTAPI/js/jquery.easypiechart.min.js"></script>
338
+ <script src="../CHORUYTAPI/js/typed.min.js"></script>
339
+ <script
340
+ src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
341
+ integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
342
+ crossorigin="anonymous"
343
+ ></script>
344
+ <script
345
+ src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
346
+ integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
347
+ crossorigin="anonymous"
348
+ ></script>
349
+ <script
350
+ type="text/javascript"
351
+ src="https://unpkg.com/isotope-layout@3.0.6/dist/isotope.pkgd.min.js"
352
+ ></script>
353
+ <script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>
354
+ <script src="../CHORUYTAPI/js/script.js"></script>
355
+ </body>
356
+ </html>`
357
+ //lazy to change
358
+ }
359
+
360
+ /!-[ Stating Http Infomation ]-!/
361
+
362
+ express.set('DFP', (process.env.PORT || process.env.port || 1932));
363
+ express.use(function(req, res, next) {
364
+ switch (req.url.split('?')[0]) {
365
+ case '/script.js': {
366
+ res.writeHead(200, { 'Content-Type': 'text/javascript' });
367
+ res.write(js);
368
+ break;
369
+ }
370
+ case '/style.css': {
371
+ res.writeHead(200, { 'Content-Type': 'text/css' });
372
+ res.write(css);
373
+ break;
374
+ }
375
+ // case '/History': {
376
+ // if (req.query.PassWord == process.env.REPL_OWNER) {
377
+ // res.writeHead(200, { 'Content-Type': 'application/json charset=utf-8' });
378
+ // res.write(JSON.stringify(console.history,null,2),'utf8');
379
+ // res.end();
380
+ // }
381
+ // else res.json({
382
+ // Status: false,
383
+ // Error: "Thiếu Params ?PassWord=PassWordCuaBan =))"
384
+ // });
385
+ // break;
386
+ // }
387
+ default: {
388
+ res.writeHead(200, "OK", { "Content-Type": "text/html" });
389
+ res.write(ClassicHTML(global.Fca.Require.FastConfig.HTML.UserName, global.Fca.Data.PremText.includes("Premium") ? "Premium": "Free", global.Fca.Require.FastConfig.HTML.MusicLink));
390
+ }
391
+ }
392
+ res.end();
393
+ })
394
+
395
+ global.Fca.Require.Web = express;
396
+
397
+ /!-[ Function setOptions ]-!/
398
+
399
+ /**
400
+ * @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
401
+ * @param {{ [x: string]: any; logLevel?: any; forceLogin?: boolean; userAgent?: any; pauseLog?: any; logRecordSize?: any; pageID?: any; proxy?: any; }} options
402
+ */
403
+
404
+ function setOptions(globalOptions, options) {
405
+ Object.keys(options).map(function(key) {
406
+ switch (Boolean_Option.includes(key)) {
407
+ case true: {
408
+ globalOptions[key] = Boolean(options[key]);
409
+ break;
410
+ }
411
+ case false: {
412
+ switch (key) {
413
+ case 'pauseLog': {
414
+ if (options.pauseLog) log.pause();
415
+ else log.resume();
416
+ break;
417
+ }
418
+ case 'logLevel': {
419
+ log.level = options.logLevel;
420
+ globalOptions.logLevel = options.logLevel;
421
+ break;
422
+ }
423
+ case 'logRecordSize': {
424
+ log.maxRecordSize = options.logRecordSize;
425
+ globalOptions.logRecordSize = options.logRecordSize;
426
+ break;
427
+ }
428
+ case 'pageID': {
429
+ globalOptions.pageID = options.pageID.toString();
430
+ break;
431
+ }
432
+ case 'userAgent': {
433
+ globalOptions.userAgent = (options.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36');
434
+ break;
435
+ }
436
+ case 'proxy': {
437
+ if (typeof options.proxy != "string") {
438
+ delete globalOptions.proxy;
439
+ utils.setProxy();
440
+ } else {
441
+ globalOptions.proxy = options.proxy;
442
+ utils.setProxy(globalOptions.proxy);
443
+ }
444
+ break;
445
+ }
446
+ default: {
447
+ log.warn("setOptions", "Unrecognized option given to setOptions: " + key);
448
+ break;
449
+ }
450
+ }
451
+ break;
452
+ }
453
+ }
454
+ });
455
+ }
456
+
457
+ /!-[ Function BuildAPI ]-!/
458
+
459
+ /**
460
+ * @param {any} globalOptions
461
+ * @param {string} html
462
+ * @param {{ getCookies: (arg0: string) => any[]; }} jar
463
+ */
464
+
465
+ function buildAPI(globalOptions, html, jar) {
466
+ var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function(/** @type {{ cookieString: () => string; }} */val) { return val.cookieString().split("=")[0] === "c_user"; });
467
+
468
+ if (maybeCookie.length === 0) {
469
+ switch (global.Fca.Require.FastConfig.AutoLogin) {
470
+ case true: {
471
+ global.Fca.Require.logger.Warning(global.Fca.Require.Language.Index.AutoLogin, function() {
472
+ return global.Fca.AutoLogin();
473
+ });
474
+ break;
475
+ }
476
+ case false: {
477
+ throw { error: global.Fca.Require.Language.Index.ErrAppState };
478
+
479
+ }
480
+ }
481
+ }
482
+
483
+ if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", Language.CheckPointLevelI);
484
+
485
+ var userID = maybeCookie[0].cookieString().split("=")[1].toString();
486
+ process.env['UID'] = logger.Normal(getText(Language.UID,userID), userID);
487
+
488
+ try {
489
+ clearInterval(checkVerified);
490
+ } catch (e) {
491
+ console.log(e);
492
+ }
493
+
494
+ var clientID = (Math.random() * 2147483648 | 0).toString(16);
495
+
496
+ var CHECK_MQTT = {
497
+ oldFBMQTTMatch: html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/),
498
+ newFBMQTTMatch: html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/),
499
+ legacyFBMQTTMatch: html.match(/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/)
500
+ }
501
+
502
+ let Slot = Object.keys(CHECK_MQTT);
503
+
504
+ var mqttEndpoint,region,irisSeqID;
505
+ Object.keys(CHECK_MQTT).map(function(MQTT) {
506
+ if (CHECK_MQTT[MQTT] && !region) {
507
+ switch (Slot.indexOf(MQTT)) {
508
+ case 0: {
509
+ irisSeqID = CHECK_MQTT[MQTT][1];
510
+ mqttEndpoint = CHECK_MQTT[MQTT][2];
511
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
512
+ return;
513
+ }
514
+ case 1: {
515
+ irisSeqID = CHECK_MQTT[MQTT][2];
516
+ mqttEndpoint = CHECK_MQTT[MQTT][1].replace(/\\\//g, "/");
517
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
518
+ return;
519
+ }
520
+ case 2: {
521
+ mqttEndpoint = CHECK_MQTT[MQTT][4];
522
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
523
+ return;
524
+ }
525
+ }
526
+ return;
527
+ }
528
+ });
529
+
530
+ var ctx = {
531
+ userID: userID,
532
+ jar: jar,
533
+ clientID: clientID,
534
+ globalOptions: globalOptions,
535
+ loggedIn: true,
536
+ access_token: 'NONE',
537
+ clientMutationId: 0,
538
+ mqttClient: undefined,
539
+ lastSeqId: irisSeqID,
540
+ syncToken: undefined,
541
+ mqttEndpoint: mqttEndpoint,
542
+ region: region,
543
+ firstListen: true
544
+ };
545
+
546
+ var api = {
547
+ setOptions: setOptions.bind(null, globalOptions),
548
+ getAppState: function getAppState() {
549
+ return utils.getAppState(jar);
550
+ }
551
+ };
552
+
553
+ if (region && mqttEndpoint) {
554
+ //do sth
555
+ }
556
+ else {
557
+ log.warn("login", getText(Language.NoAreaData));
558
+ api["htmlData"] = html;
559
+ }
560
+
561
+ var defaultFuncs = utils.makeDefaults(html, userID, ctx);
562
+
563
+ fs.readdirSync(__dirname + "/src").filter((/** @type {string} */File) => File.endsWith(".js") && !File.includes('Dev_')).map((/** @type {string} */File) => api[File.split('.').slice(0, -1).join('.')] = require('./src/' + File)(defaultFuncs, api, ctx));
564
+
565
+ return {
566
+ ctx,
567
+ defaultFuncs,
568
+ api
569
+ };
570
+ }
571
+
572
+ /!-[ Function makeLogin ]-!/
573
+
574
+ /**
575
+ * @param {{ setCookie: (arg0: any, arg1: string) => void; }} jar
576
+ * @param {any} email
577
+ * @param {any} password
578
+ * @param {{ forceLogin: any; }} loginOptions
579
+ * @param {(err: any, api: any) => any} callback
580
+ * @param {any} prCallback
581
+ */
582
+
583
+ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
584
+ return function(/** @type {{ body: any; }} */res) {
585
+ var html = res.body,$ = cheerio.load(html),arr = [];
586
+
587
+ $("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
588
+
589
+ arr = arr.filter(function(v) {
590
+ return v.val && v.val.length;
591
+ });
592
+
593
+ var form = utils.arrToForm(arr);
594
+ form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}");
595
+ form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64');
596
+ form.email = email;
597
+ form.pass = password;
598
+ form.default_persistent = '0';
599
+ form.locale = 'en_US';
600
+ form.timezone = '240';
601
+ form.lgnjs = ~~(Date.now() / 1000);
602
+
603
+ html.split("\"_js_").slice(1).map((/** @type {any} */val) => {
604
+ jar.setCookie(utils.formatCookie(JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]"), "facebook"),"https://www.facebook.com")
605
+ });
606
+
607
+ logger.Normal(Language.OnLogin);
608
+ return utils
609
+ .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions)
610
+ .then(utils.saveCookies(jar))
611
+ .then(function(/** @type {{ headers: any; }} */res) {
612
+ var headers = res.headers;
613
+ if (!headers.location) throw { error: Language.InvaildAccount };
614
+
615
+ // This means the account has login approvals turned on.
616
+ if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) {
617
+ logger.Warning(Language.TwoAuth);
618
+ var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php';
619
+
620
+ return utils
621
+ .get(headers.location, jar, null, loginOptions)
622
+ .then(utils.saveCookies(jar))
623
+ .then(async function(/** @type {{ body: any; }} */res) {
624
+ if (!await Database.get('ThroughAcc')) {
625
+ await Database.set('ThroughAcc', email);
626
+ }
627
+ else {
628
+ if (String((await Database.get('ThroughAcc'))).replace(RegExp('"','g'), '') != String(email).replace(RegExp('"','g'), '')) {
629
+ await Database.set('ThroughAcc', email);
630
+ if (await Database.get('Through2Fa')) {
631
+ await Database.delete('Through2Fa');
632
+ }
633
+ }
634
+ }
635
+ var html = res.body,$ = cheerio.load(html), arr = [];
636
+ $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
637
+ arr = arr.filter(v => { return v.val && v.val.length });
638
+ var form = utils.arrToForm(arr);
639
+ if (html.indexOf("checkpoint/?next") > -1) {
640
+ setTimeout(() => {
641
+ checkVerified = setInterval((_form) => {}, 5000, {
642
+ fb_dtsg: form.fb_dtsg,
643
+ jazoest: form.jazoest,
644
+ dpr: 1
645
+ });
646
+ }, 2500);
647
+ switch (global.Fca.Require.FastConfig.Login2Fa) {
648
+ case true: {
649
+ try {
650
+ const question = question => {
651
+ const rl = readline.createInterface({
652
+ input: process.stdin,
653
+ output: process.stdout
654
+ });
655
+ return new Promise(resolve => {
656
+ rl.question(question, answer => {
657
+ rl.close();
658
+ return resolve(answer);
659
+ });
660
+ });
661
+ };
662
+ async function EnterSecurityCode() {
663
+ try {
664
+ var Through2Fa = await Database.get('Through2Fa');
665
+ if (Through2Fa) {
666
+ Through2Fa.map(function(/** @type {{ key: string; value: string; expires: string; domain: string; path: string; }} */c) {
667
+ let str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
668
+ jar.setCookie(str, "http://" + c.domain);
669
+ })
670
+ var from2 = utils.arrToForm(arr);
671
+ from2.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}");
672
+ from2.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64');
673
+ from2.email = email;
674
+ from2.pass = password;
675
+ from2.default_persistent = '0';
676
+ from2.locale = 'en_US';
677
+ from2.timezone = '240';
678
+ from2.lgnjs = ~~(Date.now() / 1000);
679
+ return utils
680
+ .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, from2, loginOptions)
681
+ .then(utils.saveCookies(jar))
682
+ .then(function(/** @type {{ headers: any; }} */res) {
683
+ var headers = res.headers;
684
+ if (!headers['set-cookie'][0].includes('deleted')) {
685
+ logger.Warning(Language.ErrThroughCookies, async function() {
686
+ await Database.delete('Through2Fa');
687
+ });
688
+ process.exit(1);
689
+ }
690
+ if (headers.location && headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) {
691
+ return utils
692
+ .get(headers.location, jar, null, loginOptions)
693
+ .then(utils.saveCookies(jar))
694
+ .then(function(/** @type {{ body: any; }} */res) {
695
+ var html = res.body,$ = cheerio.load(html), arr = [];
696
+ $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
697
+ arr = arr.filter(v => { return v.val && v.val.length });
698
+ var from2 = utils.arrToForm(arr);
699
+
700
+ if (html.indexOf("checkpoint/?next") > -1) {
701
+ setTimeout(() => {
702
+ checkVerified = setInterval((_form) => {}, 5000, {
703
+ fb_dtsg: from2.fb_dtsg,
704
+ jazoest: from2.jazoest,
705
+ dpr: 1
706
+ });
707
+ }, 2500);
708
+ if (!res.headers.location && res.headers['set-cookie'][0].includes('checkpoint')) {
709
+ try {
710
+ delete from2.name_action_selected;
711
+ from2['submit[Continue]'] = $("#checkpointSubmitButton").html();
712
+ return utils
713
+ .post(nextURL, jar, from2, loginOptions)
714
+ .then(utils.saveCookies(jar))
715
+ .then(function() {
716
+ from2['submit[This was me]'] = "This was me";
717
+ return utils.post(nextURL, jar, from2, loginOptions).then(utils.saveCookies(jar));
718
+ })
719
+ .then(function() {
720
+ delete from2['submit[This was me]'];
721
+ from2.name_action_selected = 'save_device';
722
+ from2['submit[Continue]'] = $("#checkpointSubmitButton").html();
723
+ return utils.post(nextURL, jar, from2, loginOptions).then(utils.saveCookies(jar));
724
+ })
725
+ .then(async function(/** @type {{ headers: any; body: string | string[]; }} */res) {
726
+ var headers = res.headers;
727
+ if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: "wtf ??:D" };
728
+ var appState = utils.getAppState(jar,false);
729
+ await Database.set('Through2Fa', appState);
730
+ return loginHelper(appState, email, password, loginOptions, callback);
731
+ })
732
+ .catch((/** @type {any} */e) => callback(e));
733
+ }
734
+ catch (e) {
735
+ console.log(e)
736
+ }
737
+ }
738
+ }
739
+ })
740
+ }
741
+ return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar));
742
+ }).catch((/** @type {any} */e) => console.log(e));
743
+ }
744
+ }
745
+ catch (e) {
746
+ await Database.delete('Through2Fa');
747
+ }
748
+ var code = await question(Language.EnterSecurityCode);
749
+ try {
750
+ form.approvals_code = code;
751
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html();
752
+ var prResolve,prReject;
753
+ var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; });
754
+ if (typeof code == "string") { //always strings
755
+ utils
756
+ .post(nextURL, jar, form, loginOptions)
757
+ .then(utils.saveCookies(jar))
758
+ .then(function(/** @type {{ body: string | Buffer; }} */res) {
759
+ var $ = cheerio.load(res.body);
760
+ var error = $("#approvals_code").parent().attr("data-xui-error");
761
+ if (error) {
762
+ logger.Warning(Language.InvaildTwoAuthCode,function() { EnterSecurityCode(); }); //bruh loop
763
+ };
764
+ })
765
+ .then(function() {
766
+ delete form.no_fido;delete form.approvals_code;
767
+ form.name_action_selected = 'save_device'; //'save_device' || 'dont_save;
768
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
769
+ })
770
+ .then(async function(/** @type {{ headers: any; body: string | string[]; }} */res) {
771
+ var headers = res.headers;
772
+ if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) {
773
+ try {
774
+ delete form.name_action_selected;
775
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html();
776
+ return utils
777
+ .post(nextURL, jar, form, loginOptions)
778
+ .then(utils.saveCookies(jar))
779
+ .then(function() {
780
+ form['submit[This was me]'] = "This was me";
781
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
782
+ })
783
+ .then(function() {
784
+ delete form['submit[This was me]'];
785
+ form.name_action_selected = 'save_device';
786
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html();
787
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
788
+ })
789
+ .then(async function(/** @type {{ headers: any; body: string | string[]; }} */res) {
790
+ var headers = res.headers;
791
+ if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: "wtf ??:D" };
792
+ var appState = utils.getAppState(jar,false);
793
+ await Database.set('Through2Fa', appState);
794
+ return loginHelper(appState, email, password, loginOptions, callback);
795
+ })
796
+ .catch((/** @type {any} */e) => callback(e));
797
+ }
798
+ catch (e) {
799
+ console.log(e)
800
+ }
801
+ }
802
+ var appState = utils.getAppState(jar,false);
803
+ if (callback === prCallback) {
804
+ callback = function(/** @type {any} */err, /** @type {any} */api) {
805
+ if (err) return prReject(err);
806
+ return prResolve(api);
807
+ };
808
+ }
809
+ await Database.set('Through2Fa', appState);
810
+ return loginHelper(appState, email, password, loginOptions, callback);
811
+ })
812
+ .catch(function(/** @type {any} */err) {
813
+ if (callback === prCallback) prReject(err);
814
+ else callback(err);
815
+ });
816
+ } else {
817
+ utils
818
+ .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" })
819
+ .then(utils.saveCookies(jar))
820
+ .then(async function(/** @type {{ body: string; }} */res) {
821
+ try {
822
+ JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, ""));
823
+ } catch (ex) {
824
+ clearInterval(checkVerified);
825
+ logger.Warning(Language.VerifiedCheck);
826
+ if (callback === prCallback) {
827
+ callback = function(/** @type {any} */err, /** @type {any} */api) {
828
+ if (err) return prReject(err);
829
+ return prResolve(api);
830
+ };
831
+ }
832
+ let appState = utils.getAppState(jar,false);
833
+ return loginHelper(appState, email, password, loginOptions, callback);
834
+ }
835
+ })
836
+ .catch((/** @type {any} */ex) => {
837
+ log.error("login", ex);
838
+ if (callback === prCallback) prReject(ex);
839
+ else callback(ex);
840
+ });
841
+ }
842
+ return rtPromise;
843
+ }
844
+ catch (e) {
845
+ logger.Error(e)
846
+ logger.Error()
847
+ process.exit(0)
848
+ }
849
+ }
850
+ await EnterSecurityCode()
851
+ }
852
+ catch (e) {
853
+ logger.Error(e)
854
+ logger.Error();
855
+ process.exit(0);
856
+ }
857
+ }
858
+ break;
859
+ case false: {
860
+ throw {
861
+ error: 'login-approval',
862
+ continue: function submit2FA(/** @type {any} */code) {
863
+ form.approvals_code = code;
864
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue';
865
+ var prResolve,prReject;
866
+ var rtPromise = new Promise((resolve, reject) => { prResolve = resolve; prReject = reject; });
867
+ if (typeof code == "string") {
868
+ utils
869
+ .post(nextURL, jar, form, loginOptions)
870
+ .then(utils.saveCookies(jar))
871
+ .then(function(/** @type {{ body: string | Buffer; }} */res) {
872
+ var $ = cheerio.load(res.body);
873
+ var error = $("#approvals_code").parent().attr("data-xui-error");
874
+ if (error) {
875
+ throw {
876
+ error: 'login-approval',
877
+ errordesc: Language.InvaildTwoAuthCode,
878
+ lerror: error,
879
+ continue: submit2FA
880
+ };
881
+ }
882
+ })
883
+ .then(function() {
884
+ delete form.no_fido;delete form.approvals_code;
885
+ form.name_action_selected = 'dont_save'; //'save_device' || 'dont_save;
886
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
887
+ })
888
+ .then(function(/** @type {{ headers: any; body: string | string[]; }} */res) {
889
+ var headers = res.headers;
890
+ if (!headers.location && res.headers['set-cookie'][0].includes('checkpoint')) throw { error: Language.ApprovalsErr };
891
+ var appState = utils.getAppState(jar,false);
892
+ if (callback === prCallback) {
893
+ callback = function(/** @type {any} */err, /** @type {any} */api) {
894
+ if (err) return prReject(err);
895
+ return prResolve(api);
896
+ };
897
+ }
898
+ return loginHelper(appState, email, password, loginOptions, callback);
899
+ })
900
+ .catch(function(/** @type {any} */err) {
901
+ if (callback === prCallback) prReject(err);
902
+ else callback(err);
903
+ });
904
+ } else {
905
+ utils
906
+ .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" })
907
+ .then(utils.saveCookies(jar))
908
+ .then((/** @type {{ body: string; }} */res) => {
909
+ try {
910
+ JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, ""));
911
+ } catch (ex) {
912
+ clearInterval(checkVerified);
913
+ logger.Warning(Language.VerifiedCheck);
914
+ if (callback === prCallback) {
915
+ callback = function(/** @type {any} */err, /** @type {any} */api) {
916
+ if (err) return prReject(err);
917
+ return prResolve(api);
918
+ };
919
+ }
920
+ return loginHelper(utils.getAppState(jar,false), email, password, loginOptions, callback);
921
+ }
922
+ })
923
+ .catch((/** @type {any} */ex) => {
924
+ log.error("login", ex);
925
+ if (callback === prCallback) prReject(ex);
926
+ else callback(ex);
927
+ });
928
+ }
929
+ return rtPromise;
930
+ }
931
+ };
932
+ }
933
+ }
934
+ } else {
935
+ if (!loginOptions.forceLogin) throw { error: Language.ForceLoginNotEnable };
936
+
937
+ if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me";
938
+ else form['submit[This Is Okay]'] = "This Is Okay";
939
+
940
+ return utils
941
+ .post(nextURL, jar, form, loginOptions)
942
+ .then(utils.saveCookies(jar))
943
+ .then(function() {
944
+ form.name_action_selected = 'dont_save';
945
+
946
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
947
+ })
948
+ .then(function(/** @type {{ headers: any; body: string | string[]; }} */res) {
949
+ var headers = res.headers;
950
+
951
+ if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." };
952
+
953
+ var appState = utils.getAppState(jar,false);
954
+
955
+ return loginHelper(appState, email, password, loginOptions, callback);
956
+ })
957
+ .catch((/** @type {any} */e) => callback(e));
958
+ }
959
+ });
960
+ }
961
+ return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar));
962
+ });
963
+ };
964
+ }
965
+
966
+ /!-[ Function backup ]-!/
967
+
968
+ /**
969
+ * @param {string} data
970
+ * @param {any} globalOptions
971
+ * @param {any} callback
972
+ * @param {any} prCallback
973
+ */
974
+
975
+ function backup(data,globalOptions, callback, prCallback) {
976
+ try {
977
+ var appstate;
978
+ try {
979
+ appstate = JSON.parse(data)
980
+ }
981
+ catch(e) {
982
+ appstate = data;
983
+ }
984
+ logger.Warning(Language.BackupNoti);
985
+ try {
986
+ loginHelper(appstate,null,null,globalOptions, callback, prCallback)
987
+ }
988
+ catch (e) {
989
+ logger.Error(Language.ErrBackup);
990
+ process.exit(0);
991
+ }
992
+ }
993
+ catch (e) {
994
+ return logger.Error();
995
+ }
996
+ }
997
+
998
+ /!-[ async function loginHelper ]-!/
999
+
1000
+ /**
1001
+ * @param {string | any[]} appState
1002
+ * @param {any} email
1003
+ * @param {any} password
1004
+ * @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
1005
+ * @param {(arg0: any, arg1: undefined) => void} callback
1006
+ * @param {(error: any, api: any) => any} [prCallback]
1007
+ */
1008
+
1009
+ async function loginHelper(appState, email, password, globalOptions, callback, prCallback) {
1010
+ var mainPromise = null;
1011
+ var jar = utils.getJar();
1012
+
1013
+ if (fs.existsSync('./backupappstate.json')) {
1014
+ fs.unlinkSync('./backupappstate.json');
1015
+ }
1016
+
1017
+ try {
1018
+ if (appState) {
1019
+ logger.Normal(Language.OnProcess);
1020
+ switch (await Database.has("FBKEY")) {
1021
+ case true: {
1022
+ process.env.FBKEY = await Database.get("FBKEY");
1023
+ }
1024
+ break;
1025
+ case false: {
1026
+ const SecurityKey = global.Fca.Require.Security.create().apiKey;
1027
+ process.env['FBKEY'] = SecurityKey;
1028
+ await Database.set('FBKEY', SecurityKey);
1029
+ }
1030
+ break;
1031
+ default: {
1032
+ const SecurityKey = global.Fca.Require.Security.create().apiKey;
1033
+ process.env['FBKEY'] = SecurityKey;
1034
+ await Database.set('FBKEY', SecurityKey);
1035
+ }
1036
+ }
1037
+ try {
1038
+ switch (global.Fca.Require.FastConfig.EncryptFeature) {
1039
+ case true: {
1040
+ appState = JSON.parse(JSON.stringify(appState, null, "\t"));
1041
+ switch (utils.getType(appState)) {
1042
+ case "Array": {
1043
+ switch (utils.getType(appState[0])) {
1044
+ case "Object": {
1045
+ logger.Normal(Language.NotReadyToDecrypt);
1046
+ }
1047
+ break;
1048
+ case "String": {
1049
+ appState = Security(appState,process.env['FBKEY'],'Decrypt');
1050
+ logger.Normal(Language.DecryptSuccess);
1051
+ }
1052
+ }
1053
+ }
1054
+ break;
1055
+ case "Object": {
1056
+ try {
1057
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
1058
+ logger.Normal(Language.DecryptSuccess);
1059
+ }
1060
+ catch (e) {
1061
+ if (process.env.Backup != undefined && process.env.Backup) {
1062
+ await backup(process.env.Backup,globalOptions, callback, prCallback);
1063
+ }
1064
+ else {
1065
+ try {
1066
+ if (await Database.has('Backup')) {
1067
+ return await backup(await Database.get('Backup'),globalOptions, callback, prCallback);
1068
+ }
1069
+ else {
1070
+ logger.Normal(Language.ErrBackup);
1071
+ process.exit(0);
1072
+ }
1073
+ }
1074
+ catch (e) {
1075
+ logger.Warning(Language.ErrBackup);
1076
+ logger.Error();
1077
+ process.exit(0);
1078
+ }
1079
+ }
1080
+ logger.Warning(Language.DecryptFailed);
1081
+ return logger.Error();
1082
+ }
1083
+ }
1084
+ break;
1085
+ case "String": {
1086
+ try {
1087
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
1088
+ logger.Normal(Language.DecryptSuccess);
1089
+ }
1090
+ catch (e) {
1091
+ if (process.env.Backup != undefined && process.env.Backup) {
1092
+ await backup(process.env.Backup,globalOptions, callback, prCallback);
1093
+ }
1094
+ else {
1095
+ try {
1096
+ if (await Database.has('Backup')) {
1097
+ return await backup(await Database.get('Backup'),globalOptions, callback, prCallback);
1098
+ }
1099
+ else {
1100
+ logger.Normal(Language.ErrBackup);
1101
+ process.exit(0);
1102
+ }
1103
+ }
1104
+ catch (e) {
1105
+ logger.Warning(Language.ErrBackup);
1106
+ logger.Error();
1107
+ process.exit(0);
1108
+ }
1109
+ }
1110
+ logger.Warning(Language.DecryptFailed);
1111
+ return logger.Error();
1112
+ }
1113
+ }
1114
+ break;
1115
+ default: {
1116
+ logger.Warning(Language.InvaildAppState);
1117
+ process.exit(0)
1118
+ }
1119
+ }
1120
+ }
1121
+ break;
1122
+ case false: {
1123
+ switch (utils.getType(appState)) {
1124
+ case "Array": {
1125
+ logger.Normal(Language.EncryptStateOff);
1126
+ }
1127
+ break;
1128
+ case "Object": {
1129
+ logger.Normal(Language.EncryptStateOff);
1130
+ try {
1131
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
1132
+ logger.Normal(Language.DecryptSuccess);
1133
+ }
1134
+ catch (e) {
1135
+ if (process.env.Backup != undefined && process.env.Backup) {
1136
+ await backup(process.env.Backup,globalOptions, callback, prCallback);
1137
+ }
1138
+ else {
1139
+ try {
1140
+ if (await Database.has('Backup')) {
1141
+ return await backup(await Database.get('Backup'),globalOptions, callback, prCallback);
1142
+ }
1143
+ else {
1144
+ logger.Warning(Language.ErrBackup);
1145
+ process.exit(0);
1146
+ }
1147
+ }
1148
+ catch (e) {
1149
+ logger.Warning(Language.ErrBackup);
1150
+ logger.Error();
1151
+ process.exit(0);
1152
+ }
1153
+ }
1154
+ logger.Warning(Language.DecryptFailed);
1155
+ return logger.Error();
1156
+ }
1157
+ }
1158
+ break;
1159
+ default: {
1160
+ logger.Warning(Language.InvaildAppState);
1161
+ process.exit(0)
1162
+ }
1163
+ }
1164
+ }
1165
+ break;
1166
+ default: {
1167
+ logger.Warning(getText(Language.IsNotABoolean,global.Fca.Require.FastConfig.EncryptFeature))
1168
+ process.exit(0);
1169
+ }
1170
+ }
1171
+ }
1172
+ catch (e) {
1173
+ console.log(e);
1174
+ }
1175
+
1176
+ try {
1177
+ appState = JSON.parse(appState);
1178
+ }
1179
+ catch (e) {
1180
+ try {
1181
+ appState = appState;
1182
+ }
1183
+ catch (e) {
1184
+ return logger.Error();
1185
+ }
1186
+ }
1187
+ try {
1188
+ global.Fca.Data.AppState = appState;
1189
+ appState.map(function(/** @type {{ key: string; value: string; expires: string; domain: string; path: string; }} */c) {
1190
+ var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
1191
+ jar.setCookie(str, "http://" + c.domain);
1192
+ });
1193
+ process.env.Backup = appState;
1194
+ await Database.set('Backup', appState);
1195
+ mainPromise = utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
1196
+ } catch (e) {
1197
+ if (process.env.Backup != undefined && process.env.Backup) {
1198
+ return await backup(process.env.Backup,globalOptions, callback, prCallback);
1199
+ }
1200
+ try {
1201
+ if (await Database.has('Backup')) {
1202
+ return await backup(await Database.get('Backup'),globalOptions, callback, prCallback);
1203
+ }
1204
+ else {
1205
+ logger.Warning(Language.ErrBackup);
1206
+ process.exit(0);
1207
+ }
1208
+ }
1209
+ catch (e) {
1210
+ logger.Warning(Language.ErrBackup);
1211
+ logger.Error();
1212
+ process.exit(0);
1213
+ }
1214
+ return logger.Warning(Language.ErrBackup); // unreachable 👑
1215
+ }
1216
+ } else {
1217
+ mainPromise = utils
1218
+ .get("https://www.facebook.com/", null, null, globalOptions, { noRef: true })
1219
+ .then(utils.saveCookies(jar))
1220
+ .then(makeLogin(jar, email, password, globalOptions, callback, prCallback))
1221
+ .then(function() {
1222
+ return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(utils.saveCookies(jar));
1223
+ });
1224
+ }
1225
+ } catch (e) {
1226
+ console.log(e);
1227
+ }
1228
+ var ctx,api;
1229
+ mainPromise = mainPromise
1230
+ .then(function(/** @type {{ body: string; }} */res) {
1231
+ var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/,redirect = reg.exec(res.body);
1232
+ if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
1233
+ return res;
1234
+ })
1235
+ .then(function(/** @type {{ body: any; }} */res) {
1236
+ var html = res.body,Obj = buildAPI(globalOptions, html, jar);
1237
+ ctx = Obj.ctx;
1238
+ api = Obj.api;
1239
+ process.env.api = Obj.api;
1240
+ return res;
1241
+ });
1242
+ if (globalOptions.pageID) {
1243
+ mainPromise = mainPromise
1244
+ .then(function() {
1245
+ return utils.get('https://www.facebook.com/' + ctx.globalOptions.pageID + '/messages/?section=messages&subsection=inbox', ctx.jar, null, globalOptions);
1246
+ })
1247
+ .then(function(/** @type {{ body: any; }} */resData) {
1248
+ var url = utils.getFrom(resData.body, 'window.location.replace("https:\\/\\/www.facebook.com\\', '");').split('\\').join('');
1249
+ url = url.substring(0, url.length - 1);
1250
+ return utils.get('https://www.facebook.com' + url, ctx.jar, null, globalOptions);
1251
+ });
1252
+ }
1253
+ mainPromise
1254
+ .then(function() {
1255
+ var { readFileSync } = require('fs-extra');
1256
+ const { execSync } = require('child_process');
1257
+ Fetch('https://raw.githubusercontent.com/ChoruTiktokers182/fb-anya/main/package.json').then(async (/** @type {{ body: { toString: () => string; }; }} */res) => {
1258
+ const localVersion = JSON.parse(readFileSync('./node_modules/fca-ANYA-remake/package.json')).version;
1259
+ if (Number(localVersion.replace(/\./g,"")) < Number(JSON.parse(res.body.toString()).version.replace(/\./g,"")) ) {
1260
+ log.warn("[ FCA-ANYA ] •",getText(Language.NewVersionFound,JSON.parse(readFileSync('./node_modules/fb-anya/package.json')).version,JSON.parse(res.body.toString()).version));
1261
+ if (global.Fca.Require.FastConfig.AutoUpdate == true) {
1262
+ log.warn("[ FB-ANYA ] •",Language.AutoUpdate);
1263
+ try {
1264
+ execSync('npm install fb-anya@latest', { stdio: 'inherit' });
1265
+ logger.Success(Language.UpdateSuccess)
1266
+ logger.Normal(Language.RestartAfterUpdate);
1267
+ await new Promise(resolve => setTimeout(resolve,5*1000));
1268
+ console.clear();process.exit(1);
1269
+ }
1270
+ catch (err) {
1271
+ log.warn('Error Update: ' + err);
1272
+ logger.Normal(Language.UpdateFailed);
1273
+ try {
1274
+ require.resolve('horizon-sp');
1275
+ }
1276
+ catch (e) {
1277
+ logger.Normal(Language.InstallSupportTool);
1278
+ execSync('npm install ./package-anya/anya-sp', { stdio: 'inherit' });
1279
+ process.exit(1);
1280
+ }
1281
+ fcasp = require('./package-anya/anya-sp');
1282
+ try {
1283
+ fcasp.onError()
1284
+ }
1285
+ catch (e) {
1286
+ logger.Normal(Language.NotiAfterUseToolFail, "[ FB - Helper ]")
1287
+ logger.Normal("rmdir ./node_modules after type npm i && npm start","[ FB - Helper ]");
1288
+ process.exit(0);
1289
+ }
1290
+ }
1291
+ }
1292
+ }
1293
+ else {
1294
+ logger.Normal(getText(Language.LocalVersion,localVersion));
1295
+ logger.Normal(getText(Language.CountTime,global.Fca.Data.CountTime()))
1296
+ logger.Normal(Language.WishMessage[Math.floor(Math.random()*Language.WishMessage.length)]);
1297
+ require('./Extra/ExtraUptimeRobot')();
1298
+ DataLanguageSetting.HTML.HTML==true? global.Fca.Require.Web.listen(global.Fca.Require.Web.get('DFP')) : global.Fca.Require.Web = null;
1299
+ callback(null, api);
1300
+ }
1301
+ });
1302
+ }).catch(function(/** @type {{ error: any; }} */e) {
1303
+ log.error("login", e.error || e);
1304
+ callback(e);
1305
+ });
1306
+ }
1307
+
1308
+ /**
1309
+ * It asks the user for their account and password, and then saves it to the database.
1310
+ */
1311
+
1312
+ function setUserNameAndPassWord() {
1313
+ let rl = readline.createInterface({
1314
+ input: process.stdin,
1315
+ output: process.stdout
1316
+ });
1317
+ let localbrand2 = JSON.parse(readFileSync('./node_modules/fca-anya-remake/package.json')).version;
1318
+ console.clear();
1319
+ console.log(figlet.textSync('Horizon', {font: 'ANSI Shadow',horizontalLayout: 'default',verticalLayout: 'default',width: 0,whitespaceBreak: true }));
1320
+ console.log(chalk.bold.hex('#9900FF')("[</>]") + chalk.bold.yellow(' => ') + "Operating System: " + chalk.bold.red(os.type()));
1321
+ console.log(chalk.bold.hex('#9900FF')("[</>]") + chalk.bold.yellow(' => ') + "Machine Version: " + chalk.bold.red(os.version()));
1322
+ console.log(chalk.bold.hex('#9900FF')("[</>]") + chalk.bold.yellow(' => ') + "Fca Version: " + chalk.bold.red(localbrand2) + '\n');
1323
+ try {
1324
+ rl.question(Language.TypeAccount, (Account) => {
1325
+ if (!Account.includes("@") && global.Fca.Require.utils.getType(parseInt(Account)) != "Number") return logger.Normal(Language.TypeAccountError, function () { process.exit(1) }); //Very Human
1326
+ else rl.question(Language.TypePassword,async function (Password) {
1327
+ rl.close();
1328
+ try {
1329
+ await Database.set("Account", Account);
1330
+ await Database.set("Password", Password);
1331
+ }
1332
+ catch (e) {
1333
+ logger.Warning(Language.ErrDataBase);
1334
+ logger.Error();
1335
+ process.exit(0);
1336
+ }
1337
+ if (global.Fca.Require.FastConfig.ResetDataLogin) {
1338
+ global.Fca.Require.FastConfig.ResetDataLogin = false;
1339
+ global.Fca.Require.fs.writeFileSync('./FastConfigFca.json', JSON.stringify(global.Fca.Require.FastConfig, null, 4));
1340
+ }
1341
+ logger.Success(Language.SuccessSetData);
1342
+ process.exit(1);
1343
+ });
1344
+ })
1345
+ }
1346
+ catch (e) {
1347
+ logger.Error(e)
1348
+ }
1349
+ }
1350
+
1351
+ /**
1352
+ * @param {{ email: any; password: any; appState: any; }} loginData
1353
+ * @param {{}} options
1354
+ * @param {(error: any, api: any) => any} callback
1355
+ */
1356
+
1357
+ function login(loginData, options, callback) {
1358
+ if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
1359
+ callback = options;
1360
+ options = {};
1361
+ }
1362
+
1363
+ var globalOptions = {
1364
+ selfListen: false,
1365
+ listenEvents: true,
1366
+ listenTyping: false,
1367
+ updatePresence: false,
1368
+ forceLogin: false,
1369
+ autoMarkDelivery: false,
1370
+ autoMarkRead: false,
1371
+ autoReconnect: true,
1372
+ logRecordSize: 100,
1373
+ online: false,
1374
+ emitReady: false,
1375
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8"
1376
+ };
1377
+
1378
+ if (loginData.email && loginData.password) {
1379
+ setOptions(globalOptions, {
1380
+ logLevel: "silent",
1381
+ forceLogin: true,
1382
+ userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36"
1383
+ });
1384
+ }
1385
+ else if (loginData.appState) {
1386
+ setOptions(globalOptions, options);
1387
+ }
1388
+
1389
+ var prCallback = null;
1390
+ if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
1391
+ var rejectFunc = null;
1392
+ var resolveFunc = null;
1393
+ var returnPromise = new Promise(function(resolve, reject) {
1394
+ resolveFunc = resolve;
1395
+ rejectFunc = reject;
1396
+ });
1397
+ prCallback = function(/** @type {any} */error, /** @type {any} */api) {
1398
+ if (error) return rejectFunc(error);
1399
+ return resolveFunc(api);
1400
+ };
1401
+ callback = prCallback;
1402
+ }
1403
+
1404
+ (async function() {
1405
+ var Premium = require("./Extra/Src/Premium");
1406
+ global.Fca.Data.PremText = await Premium(global.Fca.Require.Security.create().uuid) || "Sanaol sayo";
1407
+ if (!loginData.email && !loginData.password) {
1408
+ switch (global.Fca.Require.FastConfig.AutoLogin) {
1409
+ case true: {
1410
+ if (global.Fca.Require.FastConfig.ResetDataLogin) return setUserNameAndPassWord();
1411
+ else {
1412
+ try {
1413
+ if (await Database.get("TempState")) {
1414
+ try {
1415
+ loginData.appState = JSON.parse(await Database.get("TempState"));
1416
+ }
1417
+ catch (_) {
1418
+ loginData.appState = await Database.get("TempState");
1419
+ }
1420
+ await Database.delete("TempState");
1421
+ }
1422
+ }
1423
+ catch (e) {
1424
+ console.log(e)
1425
+ await Database.delete("TempState");
1426
+ logger.Warning(Language.ErrDataBase);
1427
+ logger.Error();
1428
+ process.exit(0);
1429
+ }
1430
+ try {
1431
+ if (await Database.has('Account') && await Database.has('Password')) return loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
1432
+ else return setUserNameAndPassWord();
1433
+ }
1434
+ catch (e) {
1435
+ logger.Warning(Language.ErrDataBase);
1436
+ logger.Error();
1437
+ process.exit(0);
1438
+ }
1439
+ }
1440
+ }
1441
+ case false: {
1442
+ loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
1443
+ }
1444
+ }
1445
+ }
1446
+ else loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
1447
+ })()
1448
+ return returnPromise;
1449
+ }
1450
+
1451
+ module.exports = login;