alicezetion 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cache/replit/__replit_disk_meta.json +1 -1
- package/.cache/replit/nix/env.json +1 -1
- package/.travis.yml +6 -0
- package/index.js +182 -495
- package/package.json +10 -8
- package/replit.nix +4 -6
- package/src/addExternalModule.js +15 -0
- package/{leiamnash → src}/addUserToGroup.js +16 -52
- package/src/changeAdminStatus.js +47 -0
- package/src/changeArchivedStatus.js +41 -0
- package/{leiamnash → src}/changeBio.js +6 -19
- package/{leiamnash → src}/changeBlockedStatus.js +3 -14
- package/{leiamnash → src}/changeGroupImage.js +16 -40
- package/src/changeNickname.js +43 -0
- package/{leiamnash → src}/changeThreadColor.js +10 -20
- package/src/changeThreadEmoji.js +41 -0
- package/src/chat.js +315 -0
- package/{leiamnash → src}/createNewGroup.js +12 -28
- package/{leiamnash → src}/createPoll.js +13 -25
- package/src/deleteMessage.js +44 -0
- package/src/deleteThread.js +42 -0
- package/src/forwardAttachment.js +47 -0
- package/src/forwardMessage.js +0 -0
- package/{leiamnash → src}/getCurrentUserID.js +1 -1
- package/{leiamnash → src}/getEmojiUrl.js +2 -4
- package/{leiamnash → src}/getFriendsList.js +10 -21
- package/{leiamnash → src}/getThreadHistory.js +58 -166
- package/{leiamnash → src}/getThreadHistoryDeprecated.js +20 -42
- package/src/getThreadInfo.js +171 -0
- package/src/getThreadInfoDeprecated.js +56 -0
- package/{leiamnash → src}/getThreadList.js +41 -66
- package/src/getThreadListDeprecated.js +46 -0
- package/src/getThreadPictures.js +59 -0
- package/{leiamnash → src}/getUserID.js +9 -14
- package/{leiamnash → src}/getUserInfo.js +12 -18
- package/src/handleFriendRequest.js +46 -0
- package/src/handleMessageRequest.js +47 -0
- package/{leiamnash → src}/httpGet.js +12 -17
- package/{leiamnash → src}/httpPost.js +12 -17
- package/src/listen.js +553 -0
- package/src/listenMqtt-Test.js +687 -0
- package/src/listenMqtt.js +677 -0
- package/{leiamnash → src}/logout.js +13 -20
- package/{leiamnash → src}/markAsDelivered.js +11 -22
- package/{leiamnash → src}/markAsRead.js +11 -21
- package/{leiamnash → src}/markAsReadAll.js +10 -20
- package/{leiamnash → src}/markAsSeen.js +7 -18
- package/{leiamnash → src}/muteThread.js +11 -18
- package/src/removeUserFromGroup.js +45 -0
- package/{leiamnash → src}/resolvePhotoUrl.js +8 -17
- package/{leiamnash → src}/searchForThread.js +10 -21
- package/src/sendMessage.js +315 -0
- package/{leiamnash → src}/sendTypingIndicator.js +14 -47
- package/{leiamnash → src}/setMessageReaction.js +12 -26
- package/{leiamnash → src}/setPostReaction.js +13 -26
- package/{leiamnash → src}/setTitle.js +13 -29
- package/src/threadColors.js +41 -0
- package/{leiamnash → src}/unfriend.js +9 -19
- package/{leiamnash → src}/unsendMessage.js +9 -19
- package/test/data/shareAttach.js +146 -0
- package/test/data/something.mov +0 -0
- package/test/data/test.png +0 -0
- package/test/data/test.txt +7 -0
- package/test/example-config.json +18 -0
- package/test/test-page.js +140 -0
- package/test/test.js +385 -0
- package/utils.js +1021 -1238
- package/leiamnash/addExternalModule.js +0 -19
- package/leiamnash/changeAdminStatus.js +0 -79
- package/leiamnash/changeApprovalMode.js +0 -80
- package/leiamnash/changeArchivedStatus.js +0 -55
- package/leiamnash/changeNickname.js +0 -59
- package/leiamnash/changeThreadEmoji.js +0 -55
- package/leiamnash/chat.js +0 -447
- package/leiamnash/deleteMessage.js +0 -56
- package/leiamnash/deleteThread.js +0 -56
- package/leiamnash/forwardAttachment.js +0 -60
- package/leiamnash/getThreadInfo.js +0 -212
- package/leiamnash/getThreadInfoDeprecated.js +0 -80
- package/leiamnash/getThreadListDeprecated.js +0 -75
- package/leiamnash/getThreadPictures.js +0 -79
- package/leiamnash/handleFriendRequest.js +0 -61
- package/leiamnash/handleMessageRequest.js +0 -65
- package/leiamnash/listenMqtt.js +0 -1129
- package/leiamnash/removeUserFromGroup.js +0 -79
- package/leiamnash/threadColors.js +0 -57
package/index.js
CHANGED
@@ -12,50 +12,48 @@ log.maxRecordSize = defaultLogRecordSize;
|
|
12
12
|
function setOptions(globalOptions, options) {
|
13
13
|
Object.keys(options).map(function(key) {
|
14
14
|
switch (key) {
|
15
|
-
case
|
15
|
+
case 'pauseLog':
|
16
16
|
if (options.pauseLog) log.pause();
|
17
17
|
break;
|
18
|
-
case
|
18
|
+
case 'online':
|
19
19
|
globalOptions.online = Boolean(options.online);
|
20
20
|
break;
|
21
|
-
case
|
21
|
+
case 'logLevel':
|
22
22
|
log.level = options.logLevel;
|
23
23
|
globalOptions.logLevel = options.logLevel;
|
24
24
|
break;
|
25
|
-
case
|
25
|
+
case 'logRecordSize':
|
26
26
|
log.maxRecordSize = options.logRecordSize;
|
27
27
|
globalOptions.logRecordSize = options.logRecordSize;
|
28
28
|
break;
|
29
|
-
case
|
29
|
+
case 'selfListen':
|
30
30
|
globalOptions.selfListen = Boolean(options.selfListen);
|
31
31
|
break;
|
32
|
-
case
|
32
|
+
case 'listenEvents':
|
33
33
|
globalOptions.listenEvents = Boolean(options.listenEvents);
|
34
34
|
break;
|
35
|
-
case
|
35
|
+
case 'pageID':
|
36
36
|
globalOptions.pageID = options.pageID.toString();
|
37
37
|
break;
|
38
|
-
case
|
38
|
+
case 'updatePresence':
|
39
39
|
globalOptions.updatePresence = Boolean(options.updatePresence);
|
40
40
|
break;
|
41
|
-
case
|
41
|
+
case 'forceLogin':
|
42
42
|
globalOptions.forceLogin = Boolean(options.forceLogin);
|
43
43
|
break;
|
44
|
-
case
|
44
|
+
case 'userAgent':
|
45
45
|
globalOptions.userAgent = options.userAgent;
|
46
46
|
break;
|
47
|
-
case
|
48
|
-
globalOptions.autoMarkDelivery = Boolean(
|
49
|
-
options.autoMarkDelivery
|
50
|
-
);
|
47
|
+
case 'autoMarkDelivery':
|
48
|
+
globalOptions.autoMarkDelivery = Boolean(options.autoMarkDelivery);
|
51
49
|
break;
|
52
|
-
case
|
50
|
+
case 'autoMarkRead':
|
53
51
|
globalOptions.autoMarkRead = Boolean(options.autoMarkRead);
|
54
52
|
break;
|
55
|
-
case
|
53
|
+
case 'listenTyping':
|
56
54
|
globalOptions.listenTyping = Boolean(options.listenTyping);
|
57
55
|
break;
|
58
|
-
case
|
56
|
+
case 'proxy':
|
59
57
|
if (typeof options.proxy != "string") {
|
60
58
|
delete globalOptions.proxy;
|
61
59
|
utils.setProxy();
|
@@ -64,58 +62,38 @@ function setOptions(globalOptions, options) {
|
|
64
62
|
utils.setProxy(globalOptions.proxy);
|
65
63
|
}
|
66
64
|
break;
|
67
|
-
case
|
65
|
+
case 'autoReconnect':
|
68
66
|
globalOptions.autoReconnect = Boolean(options.autoReconnect);
|
69
67
|
break;
|
70
|
-
case
|
68
|
+
case 'emitReady':
|
71
69
|
globalOptions.emitReady = Boolean(options.emitReady);
|
72
70
|
break;
|
73
71
|
default:
|
74
|
-
log.warn(
|
75
|
-
"setOptions",
|
76
|
-
"Unrecognized option given to setOptions: " + key
|
77
|
-
);
|
72
|
+
log.warn("setOptions", "Unrecognized option given to setOptions: " + key);
|
78
73
|
break;
|
79
74
|
}
|
80
75
|
});
|
81
76
|
}
|
82
77
|
|
83
78
|
function buildAPI(globalOptions, html, jar) {
|
84
|
-
var maybeCookie = jar
|
85
|
-
.
|
86
|
-
|
87
|
-
return val.cookieString().split("=")[0] === "c_user";
|
88
|
-
});
|
79
|
+
var maybeCookie = jar.getCookies("https://www.facebook.com").filter(function(val) {
|
80
|
+
return val.cookieString().split("=")[0] === "c_user";
|
81
|
+
});
|
89
82
|
|
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
|
-
}
|
83
|
+
if (maybeCookie.length === 0) throw { error: "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." };
|
96
84
|
|
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
|
-
}
|
85
|
+
if (html.indexOf("/checkpoint/block/?next") > -1) log.warn("login", "Checkpoint detected. Please log in with a browser to verify.");
|
103
86
|
|
104
|
-
var userID = maybeCookie[0]
|
105
|
-
.cookieString()
|
106
|
-
.split("=")[1]
|
107
|
-
.toString();
|
87
|
+
var userID = maybeCookie[0].cookieString().split("=")[1].toString();
|
108
88
|
//log.info("login", `Logged in as ${userID}`);
|
109
89
|
|
110
90
|
try {
|
111
91
|
clearInterval(checkVerified);
|
112
92
|
} catch (_) {}
|
113
93
|
|
114
|
-
var clientID = (
|
94
|
+
var clientID = (Math.random() * 2147483648 | 0).toString(16);
|
115
95
|
|
116
|
-
let oldFBMQTTMatch = html.match(
|
117
|
-
/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/
|
118
|
-
);
|
96
|
+
let oldFBMQTTMatch = html.match(/irisSeqID:"(.+?)",appID:219994525426954,endpoint:"(.+?)"/);
|
119
97
|
let mqttEndpoint = null;
|
120
98
|
let region = null;
|
121
99
|
let irisSeqID = null;
|
@@ -125,42 +103,27 @@ function buildAPI(globalOptions, html, jar) {
|
|
125
103
|
irisSeqID = oldFBMQTTMatch[1];
|
126
104
|
mqttEndpoint = oldFBMQTTMatch[2];
|
127
105
|
region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
|
128
|
-
|
106
|
+
//log.info("login", `Got this account's message region: ${region}`);
|
129
107
|
} else {
|
130
|
-
let newFBMQTTMatch = html.match(
|
131
|
-
/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/
|
132
|
-
);
|
108
|
+
let newFBMQTTMatch = html.match(/{"app_id":"219994525426954","endpoint":"(.+?)","iris_seq_id":"(.+?)"}/);
|
133
109
|
if (newFBMQTTMatch) {
|
134
110
|
irisSeqID = newFBMQTTMatch[2];
|
135
111
|
mqttEndpoint = newFBMQTTMatch[1].replace(/\\\//g, "/");
|
136
|
-
region = new URL(mqttEndpoint).searchParams
|
137
|
-
|
138
|
-
.toUpperCase();
|
139
|
-
// log.info("login", `Got this account's message region: ${region}`);
|
112
|
+
region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
|
113
|
+
// log.info("login", `Got this account's message region: ${region}`);
|
140
114
|
} else {
|
141
|
-
let legacyFBMQTTMatch = html.match(
|
142
|
-
/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/
|
143
|
-
);
|
115
|
+
let legacyFBMQTTMatch = html.match(/(\["MqttWebConfig",\[\],{fbid:")(.+?)(",appID:219994525426954,endpoint:")(.+?)(",pollingEndpoint:")(.+?)(3790])/);
|
144
116
|
if (legacyFBMQTTMatch) {
|
145
117
|
mqttEndpoint = legacyFBMQTTMatch[4];
|
146
|
-
region = new URL(mqttEndpoint).searchParams
|
147
|
-
|
148
|
-
|
149
|
-
|
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
|
-
);*/
|
118
|
+
region = new URL(mqttEndpoint).searchParams.get("region").toUpperCase();
|
119
|
+
/* log.warn("login", `Cannot get sequence ID with new RegExp. Fallback to old RegExp (without seqID)...`);
|
120
|
+
log.info("login", `Got this account's message region: ${region}`);
|
121
|
+
log.info("login", `[Unused] Polling endpoint: ${legacyFBMQTTMatch[6]}`);*/
|
161
122
|
} else {
|
162
|
-
|
123
|
+
/*log.warn("login", "» Cannot get MQTT region & sequence ID.");
|
124
|
+
log.error("login", "» Please try closing and reopening your browser window or get new fbstate.");*/
|
163
125
|
noMqttData = html;
|
126
|
+
process.exit();
|
164
127
|
}
|
165
128
|
}
|
166
129
|
}
|
@@ -172,92 +135,85 @@ function buildAPI(globalOptions, html, jar) {
|
|
172
135
|
clientID: clientID,
|
173
136
|
globalOptions: globalOptions,
|
174
137
|
loggedIn: true,
|
175
|
-
access_token:
|
138
|
+
access_token: 'NONE',
|
176
139
|
clientMutationId: 0,
|
177
140
|
mqttClient: undefined,
|
178
141
|
lastSeqId: irisSeqID,
|
179
142
|
syncToken: undefined,
|
180
143
|
mqttEndpoint,
|
181
144
|
region,
|
182
|
-
firstListen: true
|
145
|
+
firstListen: true
|
183
146
|
};
|
184
147
|
|
185
148
|
var api = {
|
186
149
|
setOptions: setOptions.bind(null, globalOptions),
|
187
150
|
getAppState: function getAppState() {
|
188
151
|
return utils.getAppState(jar);
|
189
|
-
}
|
152
|
+
}
|
190
153
|
};
|
191
154
|
|
192
|
-
if (noMqttData)
|
193
|
-
api["htmlData"] = noMqttData;
|
194
|
-
}
|
155
|
+
if (noMqttData) api["htmlData"] = noMqttData;
|
195
156
|
|
196
157
|
const apiFuncNames = [
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
158
|
+
'addExternalModule',
|
159
|
+
'addUserToGroup',
|
160
|
+
'changeAdminStatus',
|
161
|
+
'changeArchivedStatus',
|
162
|
+
'changeBio',
|
163
|
+
'changeBlockedStatus',
|
164
|
+
'changeGroupImage',
|
165
|
+
'changeNickname',
|
166
|
+
'chat',
|
167
|
+
'changeThreadColor',
|
168
|
+
'changeThreadEmoji',
|
169
|
+
'createNewGroup',
|
170
|
+
'createPoll',
|
171
|
+
'deleteMessage',
|
172
|
+
'deleteThread',
|
173
|
+
'forwardAttachment',
|
174
|
+
'getCurrentUserID',
|
175
|
+
'getEmojiUrl',
|
176
|
+
'getFriendsList',
|
177
|
+
'getThreadHistory',
|
178
|
+
'getThreadInfo',
|
179
|
+
'getThreadList',
|
180
|
+
'getThreadPictures',
|
181
|
+
'getUserID',
|
182
|
+
'getUserInfo',
|
183
|
+
'handleFriendRequest',
|
184
|
+
'handleMessageRequest',
|
185
|
+
'listenMqtt',
|
186
|
+
'logout',
|
187
|
+
'markAsDelivered',
|
188
|
+
'markAsRead',
|
189
|
+
'markAsReadAll',
|
190
|
+
'markAsSeen',
|
191
|
+
'muteThread',
|
192
|
+
'removeUserFromGroup',
|
193
|
+
'resolvePhotoUrl',
|
194
|
+
'searchForThread',
|
195
|
+
'sendMessage',
|
196
|
+
'sendTypingIndicator',
|
197
|
+
'setMessageReaction',
|
198
|
+
'setTitle',
|
199
|
+
'threadColors',
|
200
|
+
'unsendMessage',
|
201
|
+
'unfriend',
|
240
202
|
|
241
203
|
// HTTP
|
242
|
-
|
243
|
-
|
204
|
+
'httpGet',
|
205
|
+
'httpPost',
|
244
206
|
|
245
207
|
// Deprecated features
|
246
208
|
"getThreadListDeprecated",
|
247
|
-
|
248
|
-
|
209
|
+
'getThreadHistoryDeprecated',
|
210
|
+
'getThreadInfoDeprecated',
|
249
211
|
];
|
250
212
|
|
251
213
|
var defaultFuncs = utils.makeDefaults(html, userID, ctx);
|
252
214
|
|
253
215
|
// Load all api functions in a loop
|
254
|
-
apiFuncNames.map(
|
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;
|
216
|
+
apiFuncNames.map(v => api[v] = require('./src/' + v)(defaultFuncs, api, ctx));
|
261
217
|
|
262
218
|
return [ctx, defaultFuncs, api];
|
263
219
|
}
|
@@ -269,27 +225,24 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
269
225
|
var arr = [];
|
270
226
|
|
271
227
|
// This will be empty, but just to be sure we leave it
|
272
|
-
$("#login_form input").map(
|
273
|
-
arr.push({ val: $(v).val(), name: $(v).attr("name") });
|
274
|
-
});
|
228
|
+
$("#login_form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
|
275
229
|
|
276
230
|
arr = arr.filter(function(v) {
|
277
231
|
return v.val && v.val.length;
|
278
232
|
});
|
279
233
|
|
280
234
|
var form = utils.arrToForm(arr);
|
281
|
-
form.lsd = utils.getFrom(html,
|
282
|
-
form.lgndim = Buffer.from(
|
283
|
-
'{"w":1440,"h":900,"aw":1440,"ah":834,"c":24}'
|
284
|
-
).toString("base64");
|
235
|
+
form.lsd = utils.getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}");
|
236
|
+
form.lgndim = Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64');
|
285
237
|
form.email = email;
|
286
238
|
form.pass = password;
|
287
|
-
form.default_persistent =
|
288
|
-
form.lgnrnd = utils.getFrom(html,
|
289
|
-
form.locale =
|
290
|
-
form.timezone =
|
239
|
+
form.default_persistent = '0';
|
240
|
+
form.lgnrnd = utils.getFrom(html, "name=\"lgnrnd\" value=\"", "\"");
|
241
|
+
form.locale = 'en_US';
|
242
|
+
form.timezone = '240';
|
291
243
|
form.lgnjs = ~~(Date.now() / 1000);
|
292
244
|
|
245
|
+
|
293
246
|
// Getting cookies from the HTML page... (kill me now plz)
|
294
247
|
// we used to get a bunch of cookies in the headers of the response of the
|
295
248
|
// request, but FB changed and they now send those cookies inside the JS.
|
@@ -299,42 +252,25 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
299
252
|
// variable name.
|
300
253
|
//
|
301
254
|
// ---------- Very Hacky Part Starts -----------------
|
302
|
-
var willBeCookies = html.split(
|
255
|
+
var willBeCookies = html.split("\"_js_");
|
303
256
|
willBeCookies.slice(1).map(function(val) {
|
304
|
-
var cookieData = JSON.parse(
|
305
|
-
|
306
|
-
);
|
307
|
-
jar.setCookie(
|
308
|
-
utils.formatCookie(cookieData, "facebook"),
|
309
|
-
"https://www.facebook.com"
|
310
|
-
);
|
257
|
+
var cookieData = JSON.parse("[\"" + utils.getFrom(val, "", "]") + "]");
|
258
|
+
jar.setCookie(utils.formatCookie(cookieData, "facebook"), "https://www.facebook.com");
|
311
259
|
});
|
312
260
|
// ---------- Very Hacky Part Ends -----------------
|
313
261
|
|
314
|
-
|
262
|
+
//log.info("login", "Logging in...");
|
315
263
|
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
|
-
)
|
264
|
+
.post("https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=110", jar, form, loginOptions)
|
322
265
|
.then(utils.saveCookies(jar))
|
323
266
|
.then(function(res) {
|
324
267
|
var headers = res.headers;
|
325
|
-
if (!headers.location) {
|
326
|
-
throw { error: "Wrong username/password." };
|
327
|
-
}
|
268
|
+
if (!headers.location) throw { error: "Wrong username/password." };
|
328
269
|
|
329
270
|
// This means the account has login approvals turned on.
|
330
|
-
if (
|
331
|
-
headers.location.indexOf(
|
332
|
-
"https://www.facebook.com/checkpoint/"
|
333
|
-
) > -1
|
334
|
-
) {
|
271
|
+
if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) {
|
335
272
|
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";
|
273
|
+
var nextURL = 'https://www.facebook.com/checkpoint/?next=https%3A%2F%2Fwww.facebook.com%2Fhome.php';
|
338
274
|
|
339
275
|
return utils
|
340
276
|
.get(headers.location, jar, null, loginOptions)
|
@@ -344,12 +280,7 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
344
280
|
// Make the form in advance which will contain the fb_dtsg and nh
|
345
281
|
var $ = cheerio.load(html);
|
346
282
|
var arr = [];
|
347
|
-
$("form input").map(
|
348
|
-
arr.push({
|
349
|
-
val: $(v).val(),
|
350
|
-
name: $(v).attr("name"),
|
351
|
-
});
|
352
|
-
});
|
283
|
+
$("form input").map((i, v) => arr.push({ val: $(v).val(), name: $(v).attr("name") }));
|
353
284
|
|
354
285
|
arr = arr.filter(function(v) {
|
355
286
|
return v.val && v.val.length;
|
@@ -358,76 +289,36 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
358
289
|
var form = utils.arrToForm(arr);
|
359
290
|
if (html.indexOf("checkpoint/?next") > -1) {
|
360
291
|
setTimeout(() => {
|
361
|
-
checkVerified = setInterval(
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
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
|
-
);
|
292
|
+
checkVerified = setInterval((_form) => {}, 5000, {
|
293
|
+
fb_dtsg: form.fb_dtsg,
|
294
|
+
jazoest: form.jazoest,
|
295
|
+
dpr: 1
|
296
|
+
});
|
388
297
|
}, 2500);
|
389
298
|
throw {
|
390
|
-
error:
|
299
|
+
error: 'login-approval',
|
391
300
|
continue: function submit2FA(code) {
|
392
301
|
form.approvals_code = code;
|
393
|
-
form[
|
394
|
-
"#checkpointSubmitButton"
|
395
|
-
).html(); //'Continue';
|
302
|
+
form['submit[Continue]'] = $("#checkpointSubmitButton").html(); //'Continue';
|
396
303
|
var prResolve = null;
|
397
304
|
var prReject = null;
|
398
|
-
var rtPromise = new Promise(function(
|
399
|
-
resolve,
|
400
|
-
reject
|
401
|
-
) {
|
305
|
+
var rtPromise = new Promise(function(resolve, reject) {
|
402
306
|
prResolve = resolve;
|
403
307
|
prReject = reject;
|
404
308
|
});
|
405
309
|
if (typeof code == "string") {
|
406
310
|
utils
|
407
|
-
.post(
|
408
|
-
nextURL,
|
409
|
-
jar,
|
410
|
-
form,
|
411
|
-
loginOptions
|
412
|
-
)
|
311
|
+
.post(nextURL, jar, form, loginOptions)
|
413
312
|
.then(utils.saveCookies(jar))
|
414
313
|
.then(function(res) {
|
415
|
-
var $ = cheerio.load(
|
416
|
-
|
417
|
-
);
|
418
|
-
var error = $(
|
419
|
-
"#approvals_code"
|
420
|
-
)
|
421
|
-
.parent()
|
422
|
-
.attr("data-xui-error");
|
314
|
+
var $ = cheerio.load(res.body);
|
315
|
+
var error = $("#approvals_code").parent().attr("data-xui-error");
|
423
316
|
if (error) {
|
424
317
|
throw {
|
425
|
-
error:
|
426
|
-
|
427
|
-
errordesc:
|
428
|
-
"Invalid 2FA code.",
|
318
|
+
error: 'login-approval',
|
319
|
+
errordesc: "Invalid 2FA code.",
|
429
320
|
lerror: error,
|
430
|
-
continue: submit2FA
|
321
|
+
continue: submit2FA
|
431
322
|
};
|
432
323
|
}
|
433
324
|
})
|
@@ -435,235 +326,98 @@ function makeLogin(jar, email, password, loginOptions, callback, prCallback) {
|
|
435
326
|
// Use the same form (safe I hope)
|
436
327
|
delete form.no_fido;
|
437
328
|
delete form.approvals_code;
|
438
|
-
form.name_action_selected =
|
439
|
-
|
440
|
-
|
441
|
-
return utils
|
442
|
-
.post(
|
443
|
-
nextURL,
|
444
|
-
jar,
|
445
|
-
form,
|
446
|
-
loginOptions
|
447
|
-
)
|
448
|
-
.then(
|
449
|
-
utils.saveCookies(
|
450
|
-
jar
|
451
|
-
)
|
452
|
-
);
|
329
|
+
form.name_action_selected = 'dont_save'; //'save_device';
|
330
|
+
|
331
|
+
return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
|
453
332
|
})
|
454
333
|
.then(function(res) {
|
455
334
|
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
|
-
}
|
335
|
+
if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with login approvals." };
|
467
336
|
|
468
|
-
var appState = utils.getAppState(
|
469
|
-
|
470
|
-
)
|
471
|
-
|
472
|
-
|
473
|
-
|
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
|
-
);
|
337
|
+
var appState = utils.getAppState(jar);
|
338
|
+
|
339
|
+
if (callback === prCallback) {
|
340
|
+
callback = function(err, api) {
|
341
|
+
if (err) return prReject(err);
|
342
|
+
return prResolve(api);
|
487
343
|
};
|
488
344
|
}
|
489
345
|
|
490
346
|
// Simply call loginHelper because all it needs is the jar
|
491
347
|
// and will then complete the login process
|
492
|
-
return loginHelper(
|
493
|
-
appState,
|
494
|
-
email,
|
495
|
-
password,
|
496
|
-
loginOptions,
|
497
|
-
callback
|
498
|
-
);
|
348
|
+
return loginHelper(appState, email, password, loginOptions, callback);
|
499
349
|
})
|
500
350
|
.catch(function(err) {
|
501
351
|
// Check if using Promise instead of callback
|
502
|
-
if (
|
503
|
-
|
504
|
-
) {
|
505
|
-
prReject(err);
|
506
|
-
} else {
|
507
|
-
callback(err);
|
508
|
-
}
|
352
|
+
if (callback === prCallback) prReject(err);
|
353
|
+
else callback(err);
|
509
354
|
});
|
510
355
|
} else {
|
511
356
|
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
|
-
)
|
357
|
+
.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
358
|
.then(utils.saveCookies(jar))
|
524
|
-
.then(
|
359
|
+
.then(res => {
|
525
360
|
try {
|
526
|
-
JSON.parse(
|
527
|
-
res.body.replace(
|
528
|
-
/for\s*\(\s*;\s*;\s*\)\s*;\s*/,
|
529
|
-
""
|
530
|
-
)
|
531
|
-
);
|
361
|
+
JSON.parse(res.body.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, ""));
|
532
362
|
} catch (ex) {
|
533
|
-
clearInterval(
|
534
|
-
|
535
|
-
)
|
536
|
-
|
537
|
-
|
538
|
-
|
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
|
-
);
|
363
|
+
clearInterval(checkVerified);
|
364
|
+
log.info("login", "Verified from browser. Logging in...");
|
365
|
+
if (callback === prCallback) {
|
366
|
+
callback = function(err, api) {
|
367
|
+
if (err) return prReject(err);
|
368
|
+
return prResolve(api);
|
556
369
|
};
|
557
370
|
}
|
558
|
-
return loginHelper(
|
559
|
-
utils.getAppState(
|
560
|
-
jar
|
561
|
-
),
|
562
|
-
email,
|
563
|
-
password,
|
564
|
-
loginOptions,
|
565
|
-
callback
|
566
|
-
);
|
371
|
+
return loginHelper(utils.getAppState(jar), email, password, loginOptions, callback);
|
567
372
|
}
|
568
373
|
})
|
569
|
-
.catch(
|
374
|
+
.catch(ex => {
|
570
375
|
log.error("login", ex);
|
571
|
-
if (
|
572
|
-
|
573
|
-
) {
|
574
|
-
prReject(ex);
|
575
|
-
} else {
|
576
|
-
callback(ex);
|
577
|
-
}
|
376
|
+
if (callback === prCallback) prReject(ex);
|
377
|
+
else callback(ex);
|
578
378
|
});
|
579
379
|
}
|
580
380
|
return rtPromise;
|
581
|
-
}
|
381
|
+
}
|
582
382
|
};
|
583
383
|
} else {
|
584
|
-
if (!loginOptions.forceLogin) {
|
585
|
-
|
586
|
-
|
587
|
-
|
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
|
-
}
|
384
|
+
if (!loginOptions.forceLogin) throw { error: "Couldn't login. Facebook might have blocked this account. Please login with a browser or enable the option 'forceLogin' and try again." };
|
385
|
+
|
386
|
+
if (html.indexOf("Suspicious Login Attempt") > -1) form['submit[This was me]'] = "This was me";
|
387
|
+
else form['submit[This Is Okay]'] = "This Is Okay";
|
599
388
|
|
600
389
|
return utils
|
601
390
|
.post(nextURL, jar, form, loginOptions)
|
602
391
|
.then(utils.saveCookies(jar))
|
603
392
|
.then(function() {
|
604
393
|
// Use the same form (safe I hope)
|
605
|
-
form.name_action_selected =
|
606
|
-
|
607
|
-
|
608
|
-
return utils
|
609
|
-
.post(
|
610
|
-
nextURL,
|
611
|
-
jar,
|
612
|
-
form,
|
613
|
-
loginOptions
|
614
|
-
)
|
615
|
-
.then(utils.saveCookies(jar));
|
394
|
+
form.name_action_selected = 'save_device';
|
395
|
+
|
396
|
+
return utils.post(nextURL, jar, form, loginOptions).then(utils.saveCookies(jar));
|
616
397
|
})
|
617
398
|
.then(function(res) {
|
618
399
|
var headers = res.headers;
|
619
400
|
|
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
|
-
}
|
401
|
+
if (!headers.location && res.body.indexOf('Review Recent Login') > -1) throw { error: "Something went wrong with review recent login." };
|
631
402
|
|
632
403
|
var appState = utils.getAppState(jar);
|
633
404
|
|
634
405
|
// Simply call loginHelper because all it needs is the jar
|
635
406
|
// and will then complete the login process
|
636
|
-
return loginHelper(
|
637
|
-
appState,
|
638
|
-
email,
|
639
|
-
password,
|
640
|
-
loginOptions,
|
641
|
-
callback
|
642
|
-
);
|
407
|
+
return loginHelper(appState, email, password, loginOptions, callback);
|
643
408
|
})
|
644
|
-
.catch(
|
645
|
-
callback(e);
|
646
|
-
});
|
409
|
+
.catch(e => callback(e));
|
647
410
|
}
|
648
411
|
});
|
649
412
|
}
|
650
413
|
|
651
|
-
return utils
|
652
|
-
.get("https://www.facebook.com/", jar, null, loginOptions)
|
653
|
-
.then(utils.saveCookies(jar));
|
414
|
+
return utils.get('https://www.facebook.com/', jar, null, loginOptions).then(utils.saveCookies(jar));
|
654
415
|
});
|
655
416
|
};
|
656
417
|
}
|
657
418
|
|
658
419
|
// Helps the login
|
659
|
-
function loginHelper(
|
660
|
-
appState,
|
661
|
-
email,
|
662
|
-
password,
|
663
|
-
globalOptions,
|
664
|
-
callback,
|
665
|
-
prCallback
|
666
|
-
) {
|
420
|
+
function loginHelper(appState, email, password, globalOptions, callback, prCallback) {
|
667
421
|
var mainPromise = null;
|
668
422
|
var jar = utils.getJar();
|
669
423
|
|
@@ -671,48 +425,21 @@ function loginHelper(
|
|
671
425
|
// back into the jar.
|
672
426
|
if (appState) {
|
673
427
|
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
|
-
";";
|
428
|
+
var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";";
|
685
429
|
jar.setCookie(str, "http://" + c.domain);
|
686
430
|
});
|
687
431
|
|
688
432
|
// 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));
|
433
|
+
mainPromise = utils.get('https://www.facebook.com/', jar, null, globalOptions, { noRef: true }).then(utils.saveCookies(jar));
|
694
434
|
} else {
|
695
435
|
// Open the main page, then we login with the given credentials and finally
|
696
436
|
// load the main page again (it'll give us some IDs that we need)
|
697
437
|
mainPromise = utils
|
698
|
-
.get("https://www.facebook.com/", null, null, globalOptions, {
|
699
|
-
noRef: true,
|
700
|
-
})
|
438
|
+
.get("https://www.facebook.com/", null, null, globalOptions, { noRef: true })
|
701
439
|
.then(utils.saveCookies(jar))
|
702
|
-
.then(
|
703
|
-
makeLogin(
|
704
|
-
jar,
|
705
|
-
email,
|
706
|
-
password,
|
707
|
-
globalOptions,
|
708
|
-
callback,
|
709
|
-
prCallback
|
710
|
-
)
|
711
|
-
)
|
440
|
+
.then(makeLogin(jar, email, password, globalOptions, callback, prCallback))
|
712
441
|
.then(function() {
|
713
|
-
return utils
|
714
|
-
.get("https://www.facebook.com/", jar, null, globalOptions)
|
715
|
-
.then(utils.saveCookies(jar));
|
442
|
+
return utils.get('https://www.facebook.com/', jar, null, globalOptions).then(utils.saveCookies(jar));
|
716
443
|
});
|
717
444
|
}
|
718
445
|
|
@@ -725,11 +452,7 @@ function loginHelper(
|
|
725
452
|
// Hacky check for the redirection that happens on some ISPs, which doesn't return statusCode 3xx
|
726
453
|
var reg = /<meta http-equiv="refresh" content="0;url=([^"]+)[^>]+>/;
|
727
454
|
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
|
-
}
|
455
|
+
if (redirect && redirect[1]) return utils.get(redirect[1], jar, null, globalOptions).then(utils.saveCookies(jar));
|
733
456
|
return res;
|
734
457
|
})
|
735
458
|
.then(function(res) {
|
@@ -745,52 +468,29 @@ function loginHelper(
|
|
745
468
|
if (globalOptions.pageID) {
|
746
469
|
mainPromise = mainPromise
|
747
470
|
.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
|
-
);
|
471
|
+
return utils.get('https://www.facebook.com/' + ctx.globalOptions.pageID + '/messages/?section=messages&subsection=inbox', ctx.jar, null, globalOptions);
|
756
472
|
})
|
757
473
|
.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("");
|
474
|
+
var url = utils.getFrom(resData.body, 'window.location.replace("https:\\/\\/www.facebook.com\\', '");').split('\\').join('');
|
766
475
|
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
|
-
);
|
476
|
+
return utils.get('https://www.facebook.com' + url, ctx.jar, null, globalOptions);
|
774
477
|
});
|
775
478
|
}
|
776
479
|
|
777
480
|
// At the end we call the callback or catch an exception
|
778
481
|
mainPromise
|
779
482
|
.then(function() {
|
780
|
-
|
483
|
+
//log.info("login", 'Done logging in.');
|
781
484
|
return callback(null, api);
|
782
485
|
})
|
783
486
|
.catch(function(e) {
|
784
|
-
|
487
|
+
log.error("login", e.error || e);
|
785
488
|
callback(e);
|
786
489
|
});
|
787
490
|
}
|
788
491
|
|
789
492
|
function login(loginData, options, callback) {
|
790
|
-
if (
|
791
|
-
utils.getType(options) === "Function" ||
|
792
|
-
utils.getType(options) === "AsyncFunction"
|
793
|
-
) {
|
493
|
+
if (utils.getType(options) === 'Function' || utils.getType(options) === 'AsyncFunction') {
|
794
494
|
callback = options;
|
795
495
|
options = {};
|
796
496
|
}
|
@@ -801,23 +501,19 @@ function login(loginData, options, callback) {
|
|
801
501
|
listenTyping: false,
|
802
502
|
updatePresence: false,
|
803
503
|
forceLogin: false,
|
804
|
-
autoMarkDelivery:
|
805
|
-
autoMarkRead:
|
504
|
+
autoMarkDelivery: false,
|
505
|
+
autoMarkRead: true,
|
806
506
|
autoReconnect: true,
|
807
507
|
logRecordSize: defaultLogRecordSize,
|
808
|
-
online:
|
508
|
+
online: false,
|
809
509
|
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",
|
510
|
+
userAgent: "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"
|
812
511
|
};
|
813
512
|
|
814
|
-
setOptions(globalOptions, options
|
513
|
+
setOptions(globalOptions, options);
|
815
514
|
|
816
515
|
var prCallback = null;
|
817
|
-
if (
|
818
|
-
utils.getType(callback) !== "Function" &&
|
819
|
-
utils.getType(callback) !== "AsyncFunction"
|
820
|
-
) {
|
516
|
+
if (utils.getType(callback) !== "Function" && utils.getType(callback) !== "AsyncFunction") {
|
821
517
|
var rejectFunc = null;
|
822
518
|
var resolveFunc = null;
|
823
519
|
var returnPromise = new Promise(function(resolve, reject) {
|
@@ -825,22 +521,13 @@ function login(loginData, options, callback) {
|
|
825
521
|
rejectFunc = reject;
|
826
522
|
});
|
827
523
|
prCallback = function(error, api) {
|
828
|
-
if (error)
|
829
|
-
return rejectFunc(error);
|
830
|
-
}
|
524
|
+
if (error) return rejectFunc(error);
|
831
525
|
return resolveFunc(api);
|
832
526
|
};
|
833
527
|
callback = prCallback;
|
834
528
|
}
|
835
|
-
loginHelper(
|
836
|
-
loginData.appState,
|
837
|
-
loginData.email,
|
838
|
-
loginData.password,
|
839
|
-
globalOptions,
|
840
|
-
callback,
|
841
|
-
prCallback
|
842
|
-
);
|
529
|
+
loginHelper(loginData.appState, loginData.email, loginData.password, globalOptions, callback, prCallback);
|
843
530
|
return returnPromise;
|
844
531
|
}
|
845
532
|
|
846
|
-
module.exports = login;
|
533
|
+
module.exports = login;
|