alicezetion 1.7.0 → 1.7.2

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.
Files changed (78) hide show
  1. package/.cache/replit/__replit_disk_meta.json +1 -1
  2. package/.cache/replit/nix/env.json +1 -1
  3. package/Extra/Database/index.js +399 -0
  4. package/Extra/Database/methods.js +286 -0
  5. package/Extra/ExtraAddons.js +213 -0
  6. package/Extra/ExtraGetThread.js +1 -0
  7. package/Extra/ExtraUptimeRobot.js +59 -0
  8. package/Extra/PM2/ecosystem.config.js +23 -0
  9. package/Extra/Src/Last-Run.js +48 -0
  10. package/Language/index.json +151 -0
  11. package/StateCrypt.js +22 -0
  12. package/broadcast.js +42 -0
  13. package/index.js +755 -533
  14. package/logger.js +21 -0
  15. package/package.json +35 -21
  16. package/replit.nix +0 -3
  17. package/src/addExternalModule.js +23 -0
  18. package/{leiamnash → src}/addUserToGroup.js +11 -23
  19. package/{leiamnash → src}/changeAdminStatus.js +32 -16
  20. package/{leiamnash → src}/changeArchivedStatus.js +9 -17
  21. package/src/changeAvt.js +91 -0
  22. package/{leiamnash → src}/changeBio.js +16 -24
  23. package/{leiamnash → src}/changeBlockedStatus.js +13 -18
  24. package/{leiamnash → src}/changeGroupImage.js +14 -23
  25. package/{leiamnash → src}/changeNickname.js +9 -14
  26. package/{leiamnash → src}/changeThreadColor.js +6 -10
  27. package/{leiamnash → src}/changeThreadEmoji.js +6 -11
  28. package/{leiamnash → src}/chat.js +116 -127
  29. package/{leiamnash → src}/createNewGroup.js +19 -27
  30. package/{leiamnash → src}/createPoll.js +6 -12
  31. package/{leiamnash → src}/deleteMessage.js +8 -13
  32. package/{leiamnash → src}/deleteThread.js +7 -14
  33. package/{leiamnash → src}/forwardAttachment.js +9 -16
  34. package/src/getAccessToken.js +32 -0
  35. package/{leiamnash → src}/getCurrentUserID.js +0 -0
  36. package/{leiamnash → src}/getEmojiUrl.js +1 -2
  37. package/{leiamnash → src}/getFriendsList.js +11 -14
  38. package/src/getMessage.js +84 -0
  39. package/{leiamnash → src}/getThreadHistory.js +27 -38
  40. package/{leiamnash → src}/getThreadHistoryDeprecated.js +14 -25
  41. package/src/getThreadInfo.js +197 -0
  42. package/{leiamnash → src}/getThreadInfoDeprecated.js +12 -24
  43. package/{leiamnash → src}/getThreadList.js +122 -88
  44. package/{leiamnash → src}/getThreadListDeprecated.js +9 -20
  45. package/{leiamnash → src}/getThreadPictures.js +9 -17
  46. package/{leiamnash → src}/getUserID.js +8 -11
  47. package/{leiamnash → src}/getUserInfo.js +12 -16
  48. package/src/getUserInfoV2.js +35 -0
  49. package/src/handleFriendRequest.js +47 -0
  50. package/{leiamnash → src}/handleMessageRequest.js +12 -22
  51. package/{leiamnash → src}/httpGet.js +15 -13
  52. package/{leiamnash → src}/httpPost.js +14 -13
  53. package/src/httpPostFormData.js +46 -0
  54. package/src/listenMqtt.js +1280 -0
  55. package/{leiamnash → src}/logout.js +7 -9
  56. package/{leiamnash → src}/markAsDelivered.js +14 -18
  57. package/{leiamnash → src}/markAsRead.js +30 -28
  58. package/{leiamnash → src}/markAsSeen.js +18 -19
  59. package/{leiamnash → src}/muteThread.js +7 -8
  60. package/{leiamnash/setMessageReaction.js → src/react.js} +15 -18
  61. package/{leiamnash → src}/removeUserFromGroup.js +13 -20
  62. package/{leiamnash → src}/resolvePhotoUrl.js +7 -13
  63. package/{leiamnash → src}/searchForThread.js +8 -13
  64. package/{leiamnash/markAsReadAll.js → src/seen.js} +10 -13
  65. package/{leiamnash → src}/sendTypingIndicator.js +23 -31
  66. package/src/setPostReaction.js +104 -0
  67. package/{leiamnash → src}/setTitle.js +15 -21
  68. package/src/threadColors.js +39 -0
  69. package/{leiamnash → src}/unfriend.js +9 -13
  70. package/{leiamnash/unsendMessage.js → src/unsend.js} +7 -16
  71. package/utils.js +1112 -1236
  72. package/leiamnash/addExternalModule.js +0 -19
  73. package/leiamnash/changeApprovalMode.js +0 -80
  74. package/leiamnash/getThreadInfo.js +0 -212
  75. package/leiamnash/handleFriendRequest.js +0 -61
  76. package/leiamnash/listenMqtt.js +0 -1129
  77. package/leiamnash/setPostReaction.js +0 -76
  78. package/leiamnash/threadColors.js +0 -57
package/index.js CHANGED
@@ -1,61 +1,139 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
- var utils = require("./utils");
4
- var cheerio = require("cheerio");
5
- var log = require("npmlog");
3
+ /!-[ Max Cpu Speed ]-!/
6
4
 
5
+ process.env.UV_THREADPOOL_SIZE = require('os').cpus().length;
6
+
7
+ /!-[ Global Set ]-!/
8
+
9
+ global.isThread = new Array();
10
+ global.isUser = new Array();
11
+ global.startTime = Date.now();
12
+ global.getText = require('gettext.js')();
13
+
14
+ /!-[ Require All Package Need Use ]-!/
15
+ /*globalThis.Fca = new Object({
16
+ test: console,log("test"),
17
+ Require: new Object({})
18
+ });*/
19
+ var utils = require("./utils"),
20
+ cheerio = require("cheerio"),
21
+ log = require("npmlog"),
22
+ //{ getAccessToken } = require('./Extra/ExtraAddons'),
23
+ logger = require('./logger'),
24
+ fs = require('fs-extra'),
25
+ getText = require('gettext.js')(),
26
+ logger = require('./logger'),
27
+ Fetch = require('got'),
28
+ fs = require('fs-extra'),
29
+ StateCrypt = require('./StateCrypt'),
30
+ Client = require("@replit/database"),
31
+ languageFile = require('./Language/index.json'),
32
+ ObjFastConfig = {
33
+ "Language": "en",
34
+ "MainColor": "#9900FF",
35
+ "BroadCast": true,
36
+ "EncryptFeature": true,
37
+ "PreKey": "",
38
+ "Uptime": false
39
+ };
40
+
41
+
42
+ /!-[ Check File To Run Process ]-!/
43
+
44
+ try {
45
+ if (!fs.existsSync('./alice/alicezetion.json')) {
46
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
47
+ process.exit(1);
48
+ } else if (fs.existsSync('./alice/alicezetion.json')) {
49
+ try {
50
+ var DataLanguageSetting = require("../../alicezetion.json");
51
+ } catch (e) {
52
+ logger("Invalid Config Settings, Restoring Default...");
53
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
54
+ process.exit(1);
55
+ }
56
+ try {
57
+ if (DataLanguageSetting && !DataLanguageSetting.PreKey) {
58
+ DataLanguageSetting.PreKey = "";
59
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(DataLanguageSetting, null, "\t"));
60
+ }
61
+ } catch (e) {
62
+ console.log(e);
63
+ }
64
+ if (!languageFile.some(i => i.Language == DataLanguageSetting.Language)) {
65
+ logger("Not Support Language: " + DataLanguageSetting.Language + " Only 'en' and 'vi'", "[ Alicezetion ]");
66
+ process.exit(0);
67
+ }
68
+ var Language = languageFile.find(i => i.Language == DataLanguageSetting.Language).Folder.Index;
69
+ } else process.exit(1);
70
+ if (utils.getType(DataLanguageSetting.BroadCast) != "Boolean" && DataLanguageSetting.BroadCast != undefined) {
71
+ log.warn("FastConfig-BroadCast", getText.gettext(Language.IsNotABoolean, DataLanguageSetting.BroadCast));
72
+ process.exit(0)
73
+ } else if (DataLanguageSetting.BroadCast == undefined) {
74
+ fs.writeFileSync("./alice/alicezetion.json", JSON.stringify(ObjFastConfig, null, "\t"));
75
+ process.exit(1);
76
+ }
77
+
78
+ global.FastConfig = DataLanguageSetting;
79
+
80
+ } catch (e) {
81
+ console.log(e);
82
+ logger.Error();
83
+ }
84
+
85
+ /!-[ Set Variable For Process ]-!/
86
+
87
+ log.maxRecordSize = 100;
7
88
  var checkVerified = null;
8
89
 
9
- var defaultLogRecordSize = 100;
10
- log.maxRecordSize = defaultLogRecordSize;
90
+ /!-[ Function setOptions ]-!/
11
91
 
12
92
  function setOptions(globalOptions, options) {
13
93
  Object.keys(options).map(function(key) {
14
94
  switch (key) {
15
- case "pauseLog":
95
+ case 'pauseLog':
16
96
  if (options.pauseLog) log.pause();
17
97
  break;
18
- case "online":
98
+ case 'online':
19
99
  globalOptions.online = Boolean(options.online);
20
100
  break;
21
- case "logLevel":
101
+ case 'logLevel':
22
102
  log.level = options.logLevel;
23
103
  globalOptions.logLevel = options.logLevel;
24
104
  break;
25
- case "logRecordSize":
105
+ case 'logRecordSize':
26
106
  log.maxRecordSize = options.logRecordSize;
27
107
  globalOptions.logRecordSize = options.logRecordSize;
28
108
  break;
29
- case "selfListen":
109
+ case 'selfListen':
30
110
  globalOptions.selfListen = Boolean(options.selfListen);
31
111
  break;
32
- case "listenEvents":
112
+ case 'listenEvents':
33
113
  globalOptions.listenEvents = Boolean(options.listenEvents);
34
114
  break;
35
- case "pageID":
115
+ case 'pageID':
36
116
  globalOptions.pageID = options.pageID.toString();
37
117
  break;
38
- case "updatePresence":
118
+ case 'updatePresence':
39
119
  globalOptions.updatePresence = Boolean(options.updatePresence);
40
120
  break;
41
- case "forceLogin":
121
+ case 'forceLogin':
42
122
  globalOptions.forceLogin = Boolean(options.forceLogin);
43
123
  break;
44
- case "userAgent":
124
+ case 'userAgent':
45
125
  globalOptions.userAgent = options.userAgent;
46
126
  break;
47
- case "autoMarkDelivery":
48
- globalOptions.autoMarkDelivery = Boolean(
49
- options.autoMarkDelivery
50
- );
127
+ case 'autoMarkDelivery':
128
+ globalOptions.autoMarkDelivery = Boolean(options.autoMarkDelivery);
51
129
  break;
52
- case "autoMarkRead":
130
+ case 'autoMarkRead':
53
131
  globalOptions.autoMarkRead = Boolean(options.autoMarkRead);
54
132
  break;
55
- case "listenTyping":
133
+ case 'listenTyping':
56
134
  globalOptions.listenTyping = Boolean(options.listenTyping);
57
135
  break;
58
- case "proxy":
136
+ case 'proxy':
59
137
  if (typeof options.proxy != "string") {
60
138
  delete globalOptions.proxy;
61
139
  utils.setProxy();
@@ -64,58 +142,40 @@ function setOptions(globalOptions, options) {
64
142
  utils.setProxy(globalOptions.proxy);
65
143
  }
66
144
  break;
67
- case "autoReconnect":
145
+ case 'autoReconnect':
68
146
  globalOptions.autoReconnect = Boolean(options.autoReconnect);
69
147
  break;
70
- case "emitReady":
148
+ case 'emitReady':
71
149
  globalOptions.emitReady = Boolean(options.emitReady);
72
150
  break;
73
151
  default:
74
- log.warn(
75
- "setOptions",
76
- "Unrecognized option given to setOptions: " + key
77
- );
152
+ log.warn("setOptions", "Unrecognized option given to setOptions: " + key);
78
153
  break;
79
154
  }
80
155
  });
81
156
  }
82
157
 
83
- function buildAPI(globalOptions, html, jar) {
84
- var maybeCookie = jar
85
- .getCookies("https://www.facebook.com")
86
- .filter(function(val) {
87
- return val.cookieString().split("=")[0] === "c_user";
88
- });
158
+ /!-[ Function BuildAPI ]-!/
89
159
 
90
- if (maybeCookie.length === 0) {
91
- throw {
92
- error:
93
- "Error retrieving userID. This can be caused by a lot of things, including getting blocked by Facebook for logging in from an unknown location. Try logging in with a browser to verify.",
94
- };
95
- }
160
+ 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"; });
96
162
 
97
- if (html.indexOf("/checkpoint/block/?next") > -1) {
98
- log.warn(
99
- "login",
100
- "Checkpoint detected. Please log in with a browser to verify."
101
- );
102
- }
163
+ if (maybeCookie.length === 0) throw { error: Language.ErrAppState };
164
+
165
+ if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", Language.CheckPointLevelI);
103
166
 
104
- var userID = maybeCookie[0]
105
- .cookieString()
106
- .split("=")[1]
107
- .toString();
108
- //log.info("login", `Logged in as ${userID}`);
167
+ var userID = maybeCookie[0].cookieString().split("=")[1].toString();
168
+ process.env['UID'] = userID;
109
169
 
110
170
  try {
111
171
  clearInterval(checkVerified);
112
- } catch (_) {}
172
+ } catch (e) {
173
+ console.log(e);
174
+ }
113
175
 
114
- var clientID = ((Math.random() * 2147483648) | 0).toString(16);
176
+ var clientID = (Math.random() * 2147483648 | 0).toString(16);
115
177
 
116
- let oldFBMQTTMatch = html.match(
117
- /irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/
118
- );
178
+ let oldFBMQTTMatch = html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/);
119
179
  let mqttEndpoint = null;
120
180
  let region = null;
121
181
  let irisSeqID = null;
@@ -125,140 +185,58 @@ function buildAPI(globalOptions, html, jar) {
125
185
  irisSeqID = oldFBMQTTMatch[1];
126
186
  mqttEndpoint = oldFBMQTTMatch[2];
127
187
  region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
128
- // log.info("login", `Got this account's message region: ${region}`);
188
+ logger(getText.gettext(Language.Area, region), "[ FCA-SUS ]");
129
189
  } else {
130
- let newFBMQTTMatch = html.match(
131
- /{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/
132
- );
190
+ let newFBMQTTMatch = html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/);
133
191
  if (newFBMQTTMatch) {
134
192
  irisSeqID = newFBMQTTMatch[2];
135
193
  mqttEndpoint = newFBMQTTMatch[1].replace(/\\\//g, "/");
136
- region = new URL(mqttEndpoint).searchParams
137
- .get("region")
138
- .toUpperCase();
139
- // log.info("login", `Got this account's message region: ${region}`);
194
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
140
195
  } else {
141
- let legacyFBMQTTMatch = html.match(
142
- /(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/
143
- );
196
+ let legacyFBMQTTMatch = html.match(/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/);
144
197
  if (legacyFBMQTTMatch) {
145
198
  mqttEndpoint = legacyFBMQTTMatch[4];
146
- region = new URL(mqttEndpoint).searchParams
147
- .get("region")
148
- .toUpperCase();
149
- /* log.warn(
150
- "login",
151
- `Cannot get sequence ID with new RegExp. Fallback to old RegExp (without seqID)...`
152
- );
153
- log.info(
154
- "login",
155
- `Got this account's message region: ${region}`
156
- );
157
- log.info(
158
- "login",
159
- `[Unused] Polling endpoint: ${legacyFBMQTTMatch[6]}`
160
- );*/
199
+ region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
200
+ log.warn("login", `Cannot get sequence ID with new RegExp. Fallback to old RegExp (without seqID)...`);
201
+ logger("login", `[Unused] Polling endpoint: ${legacyFBMQTTMatch[6]}`);
161
202
  } else {
162
- // log.warn("login", "Cannot get MQTT region & sequence ID.");
203
+ log.warn("login", getText.gettext(Language.NoAreaData));
163
204
  noMqttData = html;
164
205
  }
165
206
  }
166
207
  }
167
208
 
168
- // All data available to api functions
169
209
  var ctx = {
170
210
  userID: userID,
171
211
  jar: jar,
172
212
  clientID: clientID,
173
213
  globalOptions: globalOptions,
174
214
  loggedIn: true,
175
- access_token: "NONE",
215
+ access_token: 'none',
176
216
  clientMutationId: 0,
177
217
  mqttClient: undefined,
178
218
  lastSeqId: irisSeqID,
179
219
  syncToken: undefined,
180
220
  mqttEndpoint,
181
221
  region,
182
- firstListen: true,
222
+ firstListen: true
183
223
  };
184
224
 
185
225
  var api = {
186
226
  setOptions: setOptions.bind(null, globalOptions),
187
227
  getAppState: function getAppState() {
188
228
  return utils.getAppState(jar);
189
- },
229
+ }
190
230
  };
191
231
 
192
- if (noMqttData) {
193
- api["htmlData"] = noMqttData;
194
- }
232
+ if (noMqttData) api["htmlData"] = noMqttData;
195
233
 
196
- const apiFuncNames = [
197
- "addExternalModule",
198
- "addUserToGroup",
199
- "changeAdminStatus",
200
- "changeApprovalMode",
201
- "changeArchivedStatus",
202
- "changeBio",
203
- "changeBlockedStatus",
204
- "changeGroupImage",
205
- "changeNickname",
206
- "changeThreadColor",
207
- "changeThreadEmoji",
208
- "createNewGroup",
209
- "createPoll",
210
- "deleteMessage",
211
- "deleteThread",
212
- "forwardAttachment",
213
- "getCurrentUserID",
214
- "getEmojiUrl",
215
- "getFriendsList",
216
- "getThreadHistory",
217
- "getThreadInfo",
218
- "getThreadList",
219
- "getThreadPictures",
220
- "getUserID",
221
- "getUserInfo",
222
- "handleMessageRequest",
223
- "listenMqtt",
224
- "logout",
225
- "markAsDelivered",
226
- "markAsRead",
227
- "markAsReadAll",
228
- "markAsSeen",
229
- "muteThread",
230
- "removeUserFromGroup",
231
- "resolvePhotoUrl",
232
- "searchForThread",
233
- "chat",
234
- "sendTypingIndicator",
235
- "setMessageReaction",
236
- "setTitle",
237
- "threadColors",
238
- "unsendMessage",
239
- "unfriend",
240
-
241
- // HTTP
242
- "httpGet",
243
- "httpPost",
244
-
245
- // Deprecated features
246
- "getThreadListDeprecated",
247
- "getThreadHistoryDeprecated",
248
- "getThreadInfoDeprecated",
249
- ];
234
+ const apiFuncNames = fs.readdirSync(__dirname + "/src").filter((File) => File.endsWith(".js") && !File.includes('Dev'));
250
235
 
251
236
  var defaultFuncs = utils.makeDefaults(html, userID, ctx);
252
237
 
253
238
  // Load all api functions in a loop
254
- apiFuncNames.map(function(v) {
255
- api[v] = require("./leiamnash/" + v)(defaultFuncs, api, ctx);
256
- });
257
-
258
- //Removing original `listen` that uses pull.
259
- //Map it to listenMqtt instead for backward compatibly.
260
- api.listen = api.listenMqtt;
261
-
239
+ apiFuncNames.map(v => api[v.replace(".js", "")] = require('./src/' + v)(defaultFuncs, api, ctx));
262
240
  return [ctx, defaultFuncs, api];
263
241
  }
264
242
 
@@ -269,27 +247,24 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
269
247
  var arr = [];
270
248
 
271
249
  // This will be empty, but just to be sure we leave it
272
- $("#login_form input").map(function(i, v) {
273
- arr.push({ val: $(v).val(), name: $(v).attr("name") });
274
- });
250
+ $("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
275
251
 
276
252
  arr = arr.filter(function(v) {
277
253
  return v.val && v.val.length;
278
254
  });
279
255
 
280
256
  var form = utils.arrToForm(arr);
281
- form.lsd = utils.getFrom(html, '["LSD",[],{"token":"', '"}');
282
- form.lgndim = Buffer.from(
283
- '{"w":1440,"h":900,"aw":1440,"ah":834,"c":24}'
284
- ).toString("base64");
257
+ form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}");
258
+ form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64');
285
259
  form.email = email;
286
260
  form.pass = password;
287
- form.default_persistent = "0";
288
- form.lgnrnd = utils.getFrom(html, 'name="lgnrnd" value="', '"');
289
- form.locale = "en_US";
290
- form.timezone = "240";
261
+ form.default_persistent = '0';
262
+ form.lgnrnd = utils.getFrom(html, "name=\"lgnrnd\" value=\"", "\"");
263
+ form.locale = 'en_US';
264
+ form.timezone = '240';
291
265
  form.lgnjs = ~~(Date.now() / 1000);
292
266
 
267
+
293
268
  // Getting cookies from the HTML page... (kill me now plz)
294
269
  // we used to get a bunch of cookies in the headers of the response of the
295
270
  // request, but FB changed and they now send those cookies inside the JS.
@@ -299,42 +274,23 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
299
274
  // variable name.
300
275
  //
301
276
  // ---------- Very Hacky Part Starts -----------------
302
- var willBeCookies = html.split('"_js_');
277
+ var willBeCookies = html.split("\"_js_");
303
278
  willBeCookies.slice(1).map(function(val) {
304
- var cookieData = JSON.parse(
305
- '["' + utils.getFrom(val, "", "]") + "]"
306
- );
307
- jar.setCookie(
308
- utils.formatCookie(cookieData, "facebook"),
309
- "https://www.facebook.com"
310
- );
279
+ var cookieData = JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]");
280
+ jar.setCookie(utils.formatCookie(cookieData, "facebook"), "https://www.facebook.com");
311
281
  });
312
282
  // ---------- Very Hacky Part Ends -----------------
313
283
 
314
- // log.info("login", "Logging in...");
315
284
  return utils
316
- .post(
317
- "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110",
318
- jar,
319
- form,
320
- loginOptions
321
- )
285
+ .post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions)
322
286
  .then(utils.saveCookies(jar))
323
287
  .then(function(res) {
324
288
  var headers = res.headers;
325
- if (!headers.location) {
326
- throw { error: "Wrong username/password." };
327
- }
289
+ if (!headers.location) throw { error: Language.InvaildAccount };
328
290
 
329
291
  // This means the account has login approvals turned on.
330
- if (
331
- headers.location.indexOf(
332
- "https://www.facebook.com/checkpoint/"
333
- ) > -1
334
- ) {
335
- log.info("login", "You have login approvals turned on.");
336
- var nextURL =
337
- "https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php";
292
+ if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) {
293
+ var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php';
338
294
 
339
295
  return utils
340
296
  .get(headers.location, jar, null, loginOptions)
@@ -344,12 +300,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
344
300
  // Make the form in advance which will contain the fb_dtsg and nh
345
301
  var $ = cheerio.load(html);
346
302
  var arr = [];
347
- $("form input").map(function(i, v) {
348
- arr.push({
349
- val: $(v).val(),
350
- name: $(v).attr("name"),
351
- });
352
- });
303
+ $("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
353
304
 
354
305
  arr = arr.filter(function(v) {
355
306
  return v.val && v.val.length;
@@ -358,76 +309,36 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
358
309
  var form = utils.arrToForm(arr);
359
310
  if (html.indexOf("checkpoint/?next") > -1) {
360
311
  setTimeout(() => {
361
- checkVerified = setInterval(
362
- (_form) => {
363
- /* utils
364
- .post("https://www.facebook.com/login/approvals/approved_machine_check/", jar, form, loginOptions, null, {
365
- "Referer": "https://www.facebook.com/checkpoint/?next"
366
- })
367
- .then(utils.saveCookies(jar))
368
- .then(res => {
369
- try {
370
- JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*()/, ""));
371
- } catch (ex) {
372
- clearInterval(checkVerified);
373
- log.info("login", "Verified from browser. Logging in...");
374
- return loginHelper(utils.getAppState(jar), email, password, loginOptions, callback);
375
- }
376
- })
377
- .catch(ex => {
378
- log.error("login", ex);
379
- }); */
380
- },
381
- 5000,
382
- {
383
- fb_dtsg: form.fb_dtsg,
384
- jazoest: form.jazoest,
385
- dpr: 1,
386
- }
387
- );
312
+ checkVerified = setInterval((_form) => {}, 5000, {
313
+ fb_dtsg: form.fb_dtsg,
314
+ jazoest: form.jazoest,
315
+ dpr: 1
316
+ });
388
317
  }, 2500);
389
318
  throw {
390
- error: "login-approval",
319
+ error: 'login-approval',
391
320
  continue: function submit2FA(code) {
392
321
  form.approvals_code = code;
393
- form["submit[Continue]"] = $(
394
- "#checkpointSubmitButton"
395
- ).html(); //'Continue';
322
+ form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue';
396
323
  var prResolve = null;
397
324
  var prReject = null;
398
- var rtPromise = new Promise(function(
399
- resolve,
400
- reject
401
- ) {
325
+ var rtPromise = new Promise(function(resolve, reject) {
402
326
  prResolve = resolve;
403
327
  prReject = reject;
404
328
  });
405
329
  if (typeof code == "string") {
406
330
  utils
407
- .post(
408
- nextURL,
409
- jar,
410
- form,
411
- loginOptions
412
- )
331
+ .post(nextURL, jar, form, loginOptions)
413
332
  .then(utils.saveCookies(jar))
414
333
  .then(function(res) {
415
- var $ = cheerio.load(
416
- res.body
417
- );
418
- var error = $(
419
- "#approvals_code"
420
- )
421
- .parent()
422
- .attr("data-xui-error");
334
+ var $ = cheerio.load(res.body);
335
+ var error = $("#approvals_code").parent().attr("data-xui-error");
423
336
  if (error) {
424
337
  throw {
425
- error:
426
- "login-approval",
427
- errordesc:
428
- "Invalid 2FA code.",
338
+ error: 'login-approval',
339
+ errordesc: Language.InvaildTwoAuthCode,
429
340
  lerror: error,
430
- continue: submit2FA,
341
+ continue: submit2FA
431
342
  };
432
343
  }
433
344
  })
@@ -435,287 +346,585 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
435
346
  // Use the same form (safe I hope)
436
347
  delete form.no_fido;
437
348
  delete form.approvals_code;
438
- form.name_action_selected =
439
- "dont_save"; //'save_device';
440
-
441
- return utils
442
- .post(
443
- nextURL,
444
- jar,
445
- form,
446
- loginOptions
447
- )
448
- .then(
449
- utils.saveCookies(
450
- jar
451
- )
452
- );
349
+ form.name_action_selected = 'save_device'; //'save_device' || 'dont_save;
350
+
351
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
453
352
  })
454
353
  .then(function(res) {
455
354
  var headers = res.headers;
456
- if (
457
- !headers.location &&
458
- res.body.indexOf(
459
- "Review Recent Login"
460
- ) > -1
461
- ) {
462
- throw {
463
- error:
464
- "Something went wrong with login approvals.",
465
- };
466
- }
355
+ if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: Language.ApprovalsErr };
467
356
 
468
- var appState = utils.getAppState(
469
- jar
470
- );
471
-
472
- if (
473
- callback === prCallback
474
- ) {
475
- callback = function(
476
- err,
477
- api
478
- ) {
479
- if (err) {
480
- return prReject(
481
- err
482
- );
483
- }
484
- return prResolve(
485
- api
486
- );
357
+ var appState = utils.getAppState(jar);
358
+
359
+ if (callback === prCallback) {
360
+ callback = function(err, api) {
361
+ if (err) return prReject(err);
362
+ return prResolve(api);
487
363
  };
488
364
  }
489
365
 
490
366
  // Simply call loginHelper because all it needs is the jar
491
367
  // and will then complete the login process
492
- return loginHelper(
493
- appState,
494
- email,
495
- password,
496
- loginOptions,
497
- callback
498
- );
368
+ return loginHelper(appState, email, password, loginOptions, callback);
499
369
  })
500
370
  .catch(function(err) {
501
371
  // Check if using Promise instead of callback
502
- if (
503
- callback === prCallback
504
- ) {
505
- prReject(err);
506
- } else {
507
- callback(err);
508
- }
372
+ if (callback === prCallback) prReject(err);
373
+ else callback(err);
509
374
  });
510
375
  } else {
511
376
  utils
512
- .post(
513
- "https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php",
514
- jar,
515
- form,
516
- loginOptions,
517
- null,
518
- {
519
- Referer:
520
- "https://www.facebook.com/checkpoint/?next",
521
- }
522
- )
377
+ .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" })
523
378
  .then(utils.saveCookies(jar))
524
- .then((res) => {
379
+ .then(res => {
525
380
  try {
526
- JSON.parse(
527
- res.body.replace(
528
- /for\s*\(\s*;\s*;\s*\)\s*;\s*/,
529
- ""
530
- )
531
- );
381
+ JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, ""));
532
382
  } catch (ex) {
533
- clearInterval(
534
- checkVerified
535
- );
536
- /* log.info(
537
- "login",
538
- "Verified from browser. Logging in..."
539
- );*/
540
- if (
541
- callback ===
542
- prCallback
543
- ) {
544
- callback = function(
545
- err,
546
- api
547
- ) {
548
- if (err) {
549
- return prReject(
550
- err
551
- );
552
- }
553
- return prResolve(
554
- api
555
- );
383
+ clearInterval(checkVerified);
384
+ if (callback === prCallback) {
385
+ callback = function(err, api) {
386
+ if (err) return prReject(err);
387
+ return prResolve(api);
556
388
  };
557
389
  }
558
- return loginHelper(
559
- utils.getAppState(
560
- jar
561
- ),
562
- email,
563
- password,
564
- loginOptions,
565
- callback
566
- );
390
+ return loginHelper(utils.getAppState(jar), email, password, loginOptions, callback);
567
391
  }
568
392
  })
569
- .catch((ex) => {
393
+ .catch(ex => {
570
394
  log.error("login", ex);
571
- if (
572
- callback === prCallback
573
- ) {
574
- prReject(ex);
575
- } else {
576
- callback(ex);
577
- }
395
+ if (callback === prCallback) prReject(ex);
396
+ else callback(ex);
578
397
  });
579
398
  }
580
399
  return rtPromise;
581
- },
400
+ }
582
401
  };
583
402
  } else {
584
- if (!loginOptions.forceLogin) {
585
- throw {
586
- error:
587
- "Couldn't login. Facebook might have blocked this account. Please login with a browser or enable the option 'forceLogin' and try again.",
588
- };
589
- }
590
- if (
591
- html.indexOf("Suspicious Login Attempt") >
592
- -1
593
- ) {
594
- form["submit[This was me]"] = "This was me";
595
- } else {
596
- form["submit[This Is Okay]"] =
597
- "This Is Okay";
598
- }
403
+ if (!loginOptions.forceLogin) throw { error: Language.ForceLoginNotEnable };
404
+
405
+ if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me";
406
+ else form['submit[This Is Okay]'] = "This Is Okay";
599
407
 
600
408
  return utils
601
409
  .post(nextURL, jar, form, loginOptions)
602
410
  .then(utils.saveCookies(jar))
603
411
  .then(function() {
604
412
  // Use the same form (safe I hope)
605
- form.name_action_selected =
606
- "save_device";
607
-
608
- return utils
609
- .post(
610
- nextURL,
611
- jar,
612
- form,
613
- loginOptions
614
- )
615
- .then(utils.saveCookies(jar));
413
+ form.name_action_selected = 'save_device';
414
+
415
+ return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
616
416
  })
617
417
  .then(function(res) {
618
418
  var headers = res.headers;
619
419
 
620
- if (
621
- !headers.location &&
622
- res.body.indexOf(
623
- "Review Recent Login"
624
- ) > -1
625
- ) {
626
- throw {
627
- error:
628
- "Something went wrong with review recent login.",
629
- };
630
- }
420
+ if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." };
631
421
 
632
422
  var appState = utils.getAppState(jar);
633
423
 
634
424
  // Simply call loginHelper because all it needs is the jar
635
425
  // and will then complete the login process
636
- return loginHelper(
637
- appState,
638
- email,
639
- password,
640
- loginOptions,
641
- callback
642
- );
426
+ return loginHelper(appState, email, password, loginOptions, callback);
643
427
  })
644
- .catch(function(e) {
645
- callback(e);
646
- });
428
+ .catch(e => callback(e));
647
429
  }
648
430
  });
649
431
  }
650
432
 
651
- return utils
652
- .get("https://www.facebook.com/", jar, null, loginOptions)
653
- .then(utils.saveCookies(jar));
433
+ return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar));
654
434
  });
655
435
  };
656
436
  }
657
437
 
438
+ function makeid(length) {
439
+ var result = '';
440
+ var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
441
+ var charactersLength = characters.length;
442
+ for (var i = 0; i < length; i++) {
443
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
444
+ }
445
+ return result;
446
+ }
447
+
448
+
658
449
  // Helps the login
659
- function loginHelper(
660
- appState,
661
- email,
662
- password,
663
- globalOptions,
664
- callback,
665
- prCallback
666
- ) {
450
+ async function loginHelper(appState, email, password, globalOptions, callback, prCallback) {
667
451
  var mainPromise = null;
668
452
  var jar = utils.getJar();
669
453
 
670
454
  // If we're given an appState we loop through it and save each cookie
671
455
  // back into the jar.
672
- if (appState) {
673
- appState.map(function(c) {
674
- var str =
675
- c.key +
676
- "=" +
677
- c.value +
678
- "; expires=" +
679
- c.expires +
680
- "; domain=" +
681
- c.domain +
682
- "; path=" +
683
- c.path +
684
- ";";
685
- jar.setCookie(str, "http://" + c.domain);
686
- });
456
+ try {
457
+ if (appState) {
458
+ //const readline = require("readline");
459
+ //const chalk = require("chalk");
460
+ //const figlet = require("figlet");
461
+ //const os = require("os");
462
+ //const { execSync } = require('child_process');
463
+ // let rl = readline.createInterface({
464
+ // input: process.stdin,
465
+ // output: process.stdout,
466
+ // prompt: chalk.hex('#00CCCC').bold('[FCA-SUS] • ')
467
+ // });
468
+ // let type = {
469
+ // 1: {
470
+ // "name": "Tạo Mật Khẩu Cho Appstate",
471
+ // onRun: async function() {
472
+ // try {
473
+ // rl.question("Hãy Nhập Mật Khẩu Bạn Muốn Đặt Cho Appstate !", (answer) => {
474
+ // console.log("Được Rồi Mật Khẩu Của Bạn Là: " + answer + ", Bạn Hãy Nhớ Kĩ Nhé !");
475
+ // process.env["FBKEY"] = answer;
476
+ // fs.writeFile('../.env', `FBKEY=${answer}`, function (err) {
477
+ // if (err) {
478
+ // submiterr(err)
479
+ // logger("Tạo File ENV Thất Bại !", "[ FCA-SUS ]")
480
+ // rl.pause();
481
+ // }
482
+ // else logger("Tạo Thành Công File ENV !","[ FCA-SUS ]")
483
+ // rl.pause();
484
+ // });
485
+ // })
486
+ // }
487
+ // catch (e) {
488
+ // console.log(e);
489
+ // logger("Đã Có Lỗi Khi Đang Try Tạo Ra Câu Hỏi =))", "[ FCA-SUS ]");
490
+ // rl.pause();
491
+ // }
492
+ // }
493
+ // },
494
+ // 2: {
495
+ // "name": "Tiếp Tục Chạy Fca Mà Không Cần Mã Hóa AppState",
496
+ // onRun: async function () {
497
+ // rl.pause();
498
+ // }
499
+ // },
500
+ // 3: {
501
+ // "name": "Đổi Mật Khẩu AppState (Comming Soon..)",
502
+ // onRun: async function () {
503
+ // console.log(chalk.red.bold("Đã bảo là comming soon rồi mà >:v"));
504
+ // }
505
+ // }
506
+ // }
507
+ // const localbrand = JSON.parse(readFileSync('./package.json')).name;
508
+ // const localbrand2 = JSON.parse(readFileSync('./node_modules/fca-sus/package.json')).version;
509
+ // var axios = require('axios');
510
+ // axios.get('https://raw.githubusercontent.com/amogusdevlol/fca-sus/main/package.json').then(async (res) => {
511
+ // if (localbrand.toUpperCase() == 'HORIZON') {
512
+ // console.group(chalk.bold.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'))
513
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Hệ Điều Hành: " + chalk.bold.red(os.type()));
514
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Thông Tin Máy: " + chalk.bold.red(os.version()));
515
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Hiện Tại: " + chalk.bold.red(localbrand2));
516
+ // console.log(chalk.bold.hex('#00FFCC')("[</>]") + chalk.bold.yellow(' => ') + "Phiên Bản Mới Nhất: " + chalk.bold.red(res.data.version));
517
+ // console.groupEnd();
518
+ // }
519
+ // else {
520
+ // console.clear();
521
+ // console.log(figlet.textSync('TeamHorizon', {font: 'ANSI Shadow',horizontalLayout: 'default',verticalLayout: 'default',width: 0,whitespaceBreak: true }))
522
+ // console.log(chalk.hex('#9966CC')(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`));
523
+ // }
524
+ // });
687
525
 
688
- // Load the main page.
689
- mainPromise = utils
690
- .get("https://www.facebook.com/", jar, null, globalOptions, {
691
- noRef: true,
692
- })
693
- .then(utils.saveCookies(jar));
694
- } else {
695
- // Open the main page, then we login with the given credentials and finally
696
- // load the main page again (it'll give us some IDs that we need)
697
- mainPromise = utils
698
- .get("https://www.facebook.com/", null, null, globalOptions, {
699
- noRef: true,
700
- })
701
- .then(utils.saveCookies(jar))
702
- .then(
703
- makeLogin(
704
- jar,
705
- email,
706
- password,
707
- globalOptions,
708
- callback,
709
- prCallback
710
- )
711
- )
712
- .then(function() {
713
- return utils
714
- .get("https://www.facebook.com/", jar, null, globalOptions)
715
- .then(utils.saveCookies(jar));
716
- });
717
- }
526
+ var backup = async(data) => {
527
+ if (fs.existsSync('./alicestate.json')) {
528
+ try {
529
+ fs.writeFileSync('./alicestate.json', data);
530
+ } catch (e) {
531
+ fs.writeFileSync('./alicestate.json', JSON.stringify(data, null, "\t"));
532
+ }
533
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
534
+ process.exit(1);
535
+ } else return logger.Error();
536
+ }
537
+
538
+ switch (process.platform) {
539
+ case "win32":
540
+ {
541
+ try {
542
+ var { body } = await Fetch('https://decrypt-appstate-production.up.railway.app/getKey');
543
+ process.env['FBKEY'] = JSON.parse(body).Data;
544
+ } catch (e) {
545
+ logger(Language.ErrGetPassWord);
546
+ logger.Error();
547
+ process.exit(1);
548
+ }
549
+ }
550
+ break;
551
+ case "linux":
552
+ {
553
+ if (process.env["REPL_ID"] == undefined) {
554
+ try {
555
+ var { body } = await Fetch.get('https://decrypt-appstate-production.up.railway.app/getKey');
556
+ process.env['FBKEY'] = JSON.parse(body).Data;
557
+ } catch (e) {
558
+ logger.Error();
559
+ process.exit(1);
560
+ }
561
+ } else {
562
+ /* try {
563
+ const client = new Client();
564
+ let key = await client.get("FBKEY");
565
+ if (!key) {
566
+ await client.set("FBKEY", makeid(49));
567
+ let key = await client.get("FBKEY");
568
+ process.env['FBKEY'] = key;
569
+ } else {
570
+ process.env['FBKEY'] = key;
571
+ }
572
+ } catch (e) {
573
+ logger(Language.ErrGenerateKey, '[ FCA-SUS ]');
574
+ logger(e, '[ FCA-SUS ]');
575
+ logger.Error();
576
+ process.exit(0)
577
+ }*/
578
+ }
579
+ }
580
+ break;
581
+ case "android":
582
+ {
583
+ try {
584
+ var { body } = await Fetch.get('https://decrypt-appstate-production.up.railway.app/getKey');
585
+ process.env['FBKEY'] = JSON.parse(body).Data;
586
+ } catch (e) {
587
+
588
+ return logger.Error();
589
+ }
590
+ }
591
+ break;
592
+ default:
593
+ {
594
+
595
+ logger.Error();
596
+ process.exit(0);
597
+ }
598
+ }
599
+
600
+ try {
601
+ switch (require("../../FastConfigFca.json").EncryptFeature) {
602
+ case true:
603
+ {
604
+ appState = JSON.parse(JSON.stringify(appState, null, "\t"));
605
+ switch (utils.getType(appState)) {
606
+ case "Array":
607
+ {
608
+
609
+ }
610
+ break;
611
+ case "String":
612
+ {
613
+ try {
614
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
615
+ logger(Language.DecryptSuccess, '[ FCA-SUS ]');
616
+ } catch (e) {
617
+ if (process.env.Backup != undefined && process.env.Backup) {
618
+ backup(process.env.Backup);
619
+ } else switch (process.platform) {
620
+ case "win32":
621
+ {
622
+ try {
623
+ if (fs.existsSync('./backupappstate.json')) {
624
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
625
+ return backup(content);
626
+ }
627
+ } catch (e) {
628
+
629
+ logger.Error();
630
+ process.exit(0);
631
+ }
632
+ }
633
+ break;
634
+ case "linux":
635
+ {
636
+ if (process.env["REPL_ID"] == undefined) {
637
+ try {
638
+ if (fs.existsSync('./backupappstate.json')) {
639
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
640
+ return backup(content);
641
+ }
642
+ } catch (e) {
643
+ //logger(Language.ErrBackup, '[ FCA-SUS ]');
644
+ logger.Error();
645
+ process.exit(0);
646
+ }
647
+ } else {
648
+ try {
649
+ const client = new Client();
650
+ let key = await client.get("Backup");
651
+ if (key) {
652
+ return backup(JSON.stringify(key));
653
+ } else {
654
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
655
+ }
656
+ } catch (e) {
657
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
658
+ }
659
+ }
660
+ }
661
+ break;
662
+ case "android":
663
+ {
664
+ try {
665
+ if (fs.existsSync('./backupappstate.json')) {
666
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
667
+ return backup(content);
668
+ }
669
+ } catch (e) {
670
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
671
+ logger.Error();
672
+ process.exit(0);
673
+ }
674
+ }
675
+ }
676
+ logger(Language.DecryptFailed, '[ FCA-SUS ]');
677
+ return logger.Error();
678
+ }
679
+ logger(getText.gettext(Language.YourAppStatePass, process.env.FBKEY), '[ FCA-SUS ]');
680
+ }
681
+ break;
682
+ default:
683
+ {
684
+ logger(Language.InvaildAppState, "[ FCA-SUS ]");
685
+ process.exit(0)
686
+ }
687
+ }
688
+ }
689
+ break;
690
+ case false:
691
+ {
692
+ switch (utils.getType(appState)) {
693
+ case "Array":
694
+ {
695
+ logger(Language.EncryptStateOff, "[ FCA-SUS ]");
696
+ }
697
+ break;
698
+ case "String":
699
+ {
700
+ logger(Language.EncryptStateOff, "[ FCA-SUS ]");
701
+ try {
702
+ appState = StateCrypt.decryptState(appState, process.env['FBKEY']);
703
+ logger(Language.DecryptSuccess, '[ FCA-SUS ]');
704
+ } catch (e) {
705
+ if (process.env.Backup != undefined && process.env.Backup) {
706
+ backup(process.env.Backup);
707
+ } else switch (process.platform) {
708
+ case "win32":
709
+ {
710
+ try {
711
+ if (fs.existsSync('./backupappstate.json')) {
712
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
713
+ return backup(content);
714
+ }
715
+ } catch (e) {
716
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
717
+ logger.Error();
718
+ process.exit(0);
719
+ }
720
+ }
721
+ break;
722
+ case "linux":
723
+ {
724
+ if (process.env["REPL_ID"] == undefined) {
725
+ try {
726
+ if (fs.existsSync('./backupappstate.json')) {
727
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
728
+ return backup(content);
729
+ }
730
+ } catch (e) {
731
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
732
+ logger.Error();
733
+ process.exit(0);
734
+ }
735
+ } else {
736
+ try {
737
+ const client = new Client();
738
+ let key = await client.get("Backup");
739
+ if (key) {
740
+ return backup(JSON.stringify(key));
741
+ } else {
742
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
743
+ }
744
+ } catch (e) {
745
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
746
+ }
747
+ }
748
+ }
749
+ break;
750
+ case "android":
751
+ {
752
+ try {
753
+ if (fs.existsSync('./backupappstate.json')) {
754
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
755
+ return backup(content);
756
+ }
757
+ } catch (e) {
758
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
759
+ logger.Error();
760
+ process.exit(0);
761
+ }
762
+ }
763
+ }
764
+ logger(Language.DecryptFailed, '[ FCA-SUS ]');
765
+ return logger.Error();
766
+ }
767
+ }
768
+ break;
769
+ default:
770
+ {
771
+ logger(Language.InvaildAppState, "[ FCA-SUS ]");
772
+ process.exit(0)
773
+ }
774
+ }
775
+ }
776
+ break;
777
+ default:
778
+ {
779
+ logger(getText.gettext(Language.IsNotABoolean, require("../../FastConfigFca.json").EncryptFeature), "[ FCA-SUS ]")
780
+ process.exit(0);
781
+ }
782
+ }
783
+ } catch (e) {
784
+ console.log(e);
785
+ }
786
+
787
+ try {
788
+ appState = JSON.parse(appState);
789
+ } catch (e) {
790
+ try {
791
+ appState = appState;
792
+ } catch (e) {
793
+ return logger.Error();
794
+ }
795
+ }
796
+ try {
797
+ appState.map(function(c) {
798
+ var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
799
+ jar.setCookie(str, "http://" + c.domain);
800
+ });
801
+ switch (process.platform) {
802
+ case "win32":
803
+ {
804
+ try {
805
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
806
+ process.env.Backup = JSON.stringify(appState, null, "\t");
807
+ } catch (e) {
808
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
809
+ }
810
+ }
811
+ break;
812
+ case "linux":
813
+ {
814
+ if (process.env["REPL_ID"] == undefined) {
815
+ try {
816
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
817
+ process.env.Backup = JSON.stringify(appState, null, "\t");
818
+ } catch (e) {
819
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
820
+ }
821
+ } else {
822
+ try {
823
+ if (fs.existsSync('./backupappstate.json')) {
824
+ fs.unlinkSync('./backupappstate.json');
825
+ }
826
+ const client = new Client();
827
+ await client.set("Backup", appState);
828
+ process.env.Backup = JSON.stringify(appState, null, "\t");
829
+ } catch (e) {
830
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
831
+ }
832
+ }
833
+ }
834
+ break;
835
+ case "android":
836
+ {
837
+ try {
838
+ fs.writeFileSync("./backupappstate.json", JSON.stringify(appState, null, "\t"));
839
+ process.env.Backup = JSON.stringify(appState, null, "\t");
840
+ } catch (e) {
841
+ logger(Language.BackupFailed, '[ FCA-SUS ]');
842
+ }
843
+ }
844
+ }
845
+
846
+ mainPromise = utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
847
+ } catch (e) {
848
+
849
+ if (process.env.Backup != undefined && process.env.Backup) {
850
+ return backup(process.env.Backup);
851
+ }
852
+ switch (process.platform) {
853
+ case "win32":
854
+ {
855
+ try {
856
+ if (fs.existsSync('./backupappstate.json')) {
857
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
858
+ return backup(content);
859
+ }
860
+ } catch (e) {
861
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
862
+ logger.Error();
863
+ process.exit(0);
864
+ }
865
+ }
866
+ break;
867
+ case "linux":
868
+ {
869
+ if (process.env["REPL_ID"] == undefined) {
870
+ try {
871
+ if (fs.existsSync('./backupappstate.json')) {
872
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
873
+ return backup(content);
874
+ }
875
+ } catch (e) {
876
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
877
+ logger.Error();
878
+ process.exit(0);
879
+ }
880
+ } else {
881
+ try {
882
+ const client = new Client();
883
+ let key = await client.get("Backup");
884
+ if (key) {
885
+ backup(JSON.stringify(key));
886
+ } else {
887
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
888
+ }
889
+ } catch (e) {
890
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
891
+ }
892
+ }
893
+ }
894
+ break;
895
+ case "android":
896
+ {
897
+ try {
898
+ if (fs.existsSync('./backupappstate.json')) {
899
+ let content = fs.readFileSync('./backupappstate.json', 'utf8');
900
+ return backup(content);
901
+ }
902
+ } catch (e) {
903
+ logger(Language.ErrBackup, '[ FCA-SUS ]');
904
+ logger.Error();
905
+ process.exit(0);
906
+ }
907
+ }
908
+ break;
909
+ }
718
910
 
911
+ console.log(e);
912
+ return //logger(Language.ScreenShotConsoleAndSendToAdmin, '[ FCA-SUS ]');
913
+ }
914
+ } else {
915
+ // Open the main page, then we login with the given credentials and finally
916
+ // load the main page again (it'll give us some IDs that we need)
917
+ mainPromise = utils
918
+ .get("https://www.facebook.com/", null, null, globalOptions, { noRef: true })
919
+ .then(utils.saveCookies(jar))
920
+ .then(makeLogin(jar, email, password, globalOptions, callback, prCallback))
921
+ .then(function() {
922
+ return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(utils.saveCookies(jar));
923
+ });
924
+ }
925
+ } catch (e) {
926
+ console.log(e);
927
+ }
719
928
  var ctx = null;
720
929
  var _defaultFuncs = null;
721
930
  var api = null;
@@ -725,72 +934,88 @@ function loginHelper(
725
934
  // Hacky check for the redirection that happens on some ISPs, which doesn't return statusCode 3xx
726
935
  var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/;
727
936
  var redirect = reg.exec(res.body);
728
- if (redirect && redirect[1]) {
729
- return utils
730
- .get(redirect[1], jar, null, globalOptions)
731
- .then(utils.saveCookies(jar));
732
- }
937
+ if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
733
938
  return res;
734
939
  })
735
- .then(function(res) {
940
+ .then(async function(res) {
736
941
  var html = res.body;
737
- var stuff = buildAPI(globalOptions, html, jar);
942
+ var stuff = await buildAPI(globalOptions, html, jar);
738
943
  ctx = stuff[0];
739
944
  _defaultFuncs = stuff[1];
740
945
  api = stuff[2];
741
946
  return res;
742
947
  });
743
-
744
948
  // given a pageID we log in as a page
745
949
  if (globalOptions.pageID) {
746
950
  mainPromise = mainPromise
747
951
  .then(function() {
748
- return utils.get(
749
- "https://www.facebook.com/" +
750
- ctx.globalOptions.pageID +
751
- "/messages/?section=messages&subsection=inbox",
752
- ctx.jar,
753
- null,
754
- globalOptions
755
- );
952
+ return utils.get('https://www.facebook.com/' + ctx.globalOptions.pageID + '/messages/?section=messages&subsection=inbox', ctx.jar, null, globalOptions);
756
953
  })
757
954
  .then(function(resData) {
758
- var url = utils
759
- .getFrom(
760
- resData.body,
761
- 'window.location.replace("https:\\/\\/www.facebook.com\\',
762
- '");'
763
- )
764
- .split("\\")
765
- .join("");
955
+ var url = utils.getFrom(resData.body, 'window.location.replace("https:\\/\\/www.facebook.com\\', '");').split('\\').join('');
766
956
  url = url.substring(0, url.length - 1);
767
-
768
- return utils.get(
769
- "https://www.facebook.com" + url,
770
- ctx.jar,
771
- null,
772
- globalOptions
773
- );
957
+ return utils.get('https://www.facebook.com' + url, ctx.jar, null, globalOptions);
774
958
  });
775
959
  }
776
960
 
777
961
  // At the end we call the callback or catch an exception
778
962
  mainPromise
779
963
  .then(function() {
780
- //log.info("login", "Done logging in.");
781
- return callback(null, api);
782
- })
783
- .catch(function(e) {
784
- //log.error("login", e.error || e);
964
+ /*logger(Language.DoneLogin, "[ FCA-SUS ]");
965
+ logger(Language.AutoCheckUpdate, "[ FCA-SUS ]");*/
966
+ //!---------- Auto Check, Update START -----------------!//
967
+ var Fetch = require('got');
968
+ var { readFileSync } = require('fs-extra');
969
+ const { execSync } = require('child_process');
970
+ Fetch('https://raw.githubusercontent.com/amogusdevlol/node-ainzfb/main/package.json').then(async(res) => {
971
+ const localbrand = JSON.parse(readFileSync('./node_modules/node-ainzfb-new/package.json')).version;
972
+ if (Number(localbrand.replace(/\./g, "")) < Number(JSON.parse(res.body.toString()).version.replace(/\./g, ""))) {
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));
974
+ log.warn("[ FCA-SUS ] •", Language.AutoUpdate);
975
+ try {
976
+ execSync('npm install node-ainzfb-new@latest', { stdio: 'inherit' });
977
+ logger(Language.UpdateSuccess, "[ FCA-SUS ]")
978
+ logger(Language.RestartAfterUpdate, '[ FCA-SUS ]');
979
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
980
+ console.clear();
981
+ process.exit(1);
982
+ } catch (err) {
983
+ log.warn('Error Update: ' + err);
984
+ logger(Language.UpdateFailed, "[ FCA-SUS ]");
985
+ try {
986
+ require.resolve('sus-support');
987
+ } catch (e) {
988
+ logger(Language.InstallSupportTool, "[ FCA-SUS ]");
989
+ execSync('npm install git+https://github.com/amogusdevlol/sus-support.git', { stdio: 'inherit' });
990
+ process.exit(1);
991
+ }
992
+ var fcasp = require('sus-support');
993
+ try {
994
+ fcasp.onError()
995
+ } catch (e) {
996
+ //logger(Language.NotiAfterUseToolFail, "[ Fca - Helper ]")
997
+ //logger("rmdir ./node_modules then enter npm i && npm start", "[ Fca - Helper ]");
998
+ process.exit(0);
999
+ }
1000
+
1001
+ }
1002
+ } else {
1003
+ /*logger(getText.gettext(Language.LocalVersion, localbrand), "[ FCA-SUS ]");
1004
+ logger(Language.WishMessage[Math.floor(Math.random() * Language.WishMessage.length)], "[ FCA-SUS ]");*/
1005
+ require('./Extra/ExtraUptimeRobot')()
1006
+ await new Promise(resolve => setTimeout(resolve, 5 * 1000));
1007
+ callback(null, api);
1008
+ }
1009
+ });
1010
+ }).catch(function(e) {
1011
+ log.error("login", e.error || e);
785
1012
  callback(e);
786
1013
  });
1014
+ //!---------- Auto Check, Update END -----------------!//
787
1015
  }
788
1016
 
789
1017
  function login(loginData, options, callback) {
790
- if (
791
- utils.getType(options) === "Function" ||
792
- utils.getType(options) === "AsyncFunction"
793
- ) {
1018
+ if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
794
1019
  callback = options;
795
1020
  options = {};
796
1021
  }
@@ -801,23 +1026,22 @@ function login(loginData, options, callback) {
801
1026
  listenTyping: false,
802
1027
  updatePresence: false,
803
1028
  forceLogin: false,
804
- autoMarkDelivery: true,
1029
+ autoMarkDelivery: false,
805
1030
  autoMarkRead: false,
806
1031
  autoReconnect: true,
807
- logRecordSize: defaultLogRecordSize,
808
- online: true,
1032
+ logRecordSize: 100,
1033
+ online: false,
809
1034
  emitReady: false,
810
- userAgent:
811
- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18",
1035
+ 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"
812
1036
  };
813
1037
 
814
- setOptions(globalOptions, options || {});
1038
+ //! bằng 1 cách nào đó tắt online sẽ đánh lừa được facebook :v
1039
+ //! phải có that có this chứ :v
1040
+
1041
+ setOptions(globalOptions, options);
815
1042
 
816
1043
  var prCallback = null;
817
- if (
818
- utils.getType(callback) !== "Function" &&
819
- utils.getType(callback) !== "AsyncFunction"
820
- ) {
1044
+ if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
821
1045
  var rejectFunc = null;
822
1046
  var resolveFunc = null;
823
1047
  var returnPromise = new Promise(function(resolve, reject) {
@@ -825,22 +1049,20 @@ function login(loginData, options, callback) {
825
1049
  rejectFunc = reject;
826
1050
  });
827
1051
  prCallback = function(error, api) {
828
- if (error) {
829
- return rejectFunc(error);
830
- }
1052
+ if (error) return rejectFunc(error);
831
1053
  return resolveFunc(api);
832
1054
  };
833
1055
  callback = prCallback;
834
1056
  }
835
- loginHelper(
836
- loginData.appState,
837
- loginData.email,
838
- loginData.password,
839
- globalOptions,
840
- callback,
841
- prCallback
842
- );
1057
+ loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
843
1058
  return returnPromise;
844
1059
  }
845
1060
 
846
- module.exports = login;
1061
+ module.exports = alice;
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+