ayman-fca 1.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.
- package/README.md +81 -0
- package/func/checkUpdate.js +13 -0
- package/func/logAdapter.js +30 -0
- package/func/logger.js +66 -0
- package/index.d.ts +751 -0
- package/index.js +15 -0
- package/module/config.js +38 -0
- package/module/login.js +111 -0
- package/module/loginHelper.js +1296 -0
- package/module/options.js +37 -0
- package/package.json +78 -0
- package/src/api/action/addExternalModule.js +19 -0
- package/src/api/action/changeAvatar.js +137 -0
- package/src/api/action/changeBio.js +48 -0
- package/src/api/action/enableAutoSaveAppState.js +72 -0
- package/src/api/action/getCurrentUserID.js +11 -0
- package/src/api/action/handleFriendRequest.js +33 -0
- package/src/api/action/logout.js +76 -0
- package/src/api/action/refreshFb_dtsg.js +62 -0
- package/src/api/action/setPostReaction.js +106 -0
- package/src/api/action/story.js +118 -0
- package/src/api/action/unfriend.js +30 -0
- package/src/api/http/httpGet.js +28 -0
- package/src/api/http/httpPost.js +32 -0
- package/src/api/http/postFormData.js +23 -0
- package/src/api/messaging/J +1 -0
- package/src/api/messaging/addUserToGroup.js +70 -0
- package/src/api/messaging/changeAdminStatus.js +72 -0
- package/src/api/messaging/changeArchivedStatus.js +31 -0
- package/src/api/messaging/changeBlockedStatus.js +27 -0
- package/src/api/messaging/changeGroupImage.js +91 -0
- package/src/api/messaging/changeNickname.js +70 -0
- package/src/api/messaging/changeThreadColor.js +44 -0
- package/src/api/messaging/changeThreadEmoji.js +111 -0
- package/src/api/messaging/createNewGroup.js +50 -0
- package/src/api/messaging/createPoll.js +52 -0
- package/src/api/messaging/createThemeAI.js +98 -0
- package/src/api/messaging/deleteMessage.js +73 -0
- package/src/api/messaging/deleteThread.js +29 -0
- package/src/api/messaging/editMessage.js +67 -0
- package/src/api/messaging/forwardAttachment.js +55 -0
- package/src/api/messaging/forwardMessage.js +73 -0
- package/src/api/messaging/getEmojiUrl.js +29 -0
- package/src/api/messaging/getFriendsList.js +82 -0
- package/src/api/messaging/getMessage.js +829 -0
- package/src/api/messaging/getThemePictures.js +62 -0
- package/src/api/messaging/groupActions.js +119 -0
- package/src/api/messaging/handleMessageRequest.js +31 -0
- package/src/api/messaging/markAsDelivered.js +31 -0
- package/src/api/messaging/markAsRead.js +88 -0
- package/src/api/messaging/markAsReadAll.js +28 -0
- package/src/api/messaging/markAsSeen.js +30 -0
- package/src/api/messaging/muteThread.js +27 -0
- package/src/api/messaging/notes.js +101 -0
- package/src/api/messaging/removeUserFromGroup.js +51 -0
- package/src/api/messaging/resolvePhotoUrl.js +29 -0
- package/src/api/messaging/scheduler.js +100 -0
- package/src/api/messaging/searchForThread.js +32 -0
- package/src/api/messaging/sendMessage.js +270 -0
- package/src/api/messaging/sendTypingIndicator.js +62 -0
- package/src/api/messaging/setMessageReaction.js +91 -0
- package/src/api/messaging/setTitle.js +86 -0
- package/src/api/messaging/shareContact.js +47 -0
- package/src/api/messaging/threadColors.js +128 -0
- package/src/api/messaging/unsendMessage.js +73 -0
- package/src/api/messaging/uploadAttachment.js +492 -0
- package/src/api/socket/core/connectMqtt.js +259 -0
- package/src/api/socket/core/emitAuth.js +79 -0
- package/src/api/socket/core/getSeqID.js +170 -0
- package/src/api/socket/core/getTaskResponseData.js +27 -0
- package/src/api/socket/core/parseDelta.js +377 -0
- package/src/api/socket/detail/buildStream.js +215 -0
- package/src/api/socket/detail/constants.js +29 -0
- package/src/api/socket/listenMqtt.js +377 -0
- package/src/api/socket/middleware/index.js +80 -0
- package/src/api/threads/getThreadHistory.js +664 -0
- package/src/api/threads/getThreadInfo.js +296 -0
- package/src/api/threads/getThreadList.js +293 -0
- package/src/api/threads/getThreadPictures.js +43 -0
- package/src/api/user/J +1 -0
- package/src/api/user/getUserID.js +48 -0
- package/src/api/user/getUserInfo.js +402 -0
- package/src/api/user/getUserInfoV2.js +134 -0
- package/src/core/sendReqMqtt.js +69 -0
- package/src/database/helpers.js +36 -0
- package/src/database/models/index.js +55 -0
- package/src/database/models/thread.js +44 -0
- package/src/database/models/user.js +39 -0
- package/src/database/threadData.js +92 -0
- package/src/database/userData.js +88 -0
- package/src/remote/remoteClient.js +71 -0
- package/src/utils/broadcast.js +62 -0
- package/src/utils/client.js +10 -0
- package/src/utils/constants.js +53 -0
- package/src/utils/cookies.js +73 -0
- package/src/utils/format/attachment.js +357 -0
- package/src/utils/format/cookie.js +9 -0
- package/src/utils/format/date.js +50 -0
- package/src/utils/format/decode.js +44 -0
- package/src/utils/format/delta.js +194 -0
- package/src/utils/format/ids.js +64 -0
- package/src/utils/format/index.js +64 -0
- package/src/utils/format/message.js +88 -0
- package/src/utils/format/presence.js +132 -0
- package/src/utils/format/readTyp.js +44 -0
- package/src/utils/format/thread.js +42 -0
- package/src/utils/format/utils.js +141 -0
- package/src/utils/headers.js +96 -0
- package/src/utils/loginParser/autoLogin.js +125 -0
- package/src/utils/loginParser/helpers.js +43 -0
- package/src/utils/loginParser/index.js +10 -0
- package/src/utils/loginParser/parseAndCheckLogin.js +220 -0
- package/src/utils/loginParser/textUtils.js +28 -0
- package/src/utils/request/H +1 -0
- package/src/utils/request/client.js +33 -0
- package/src/utils/request/config.js +25 -0
- package/src/utils/request/defaults.js +40 -0
- package/src/utils/request/helpers.js +31 -0
- package/src/utils/request/index.js +12 -0
- package/src/utils/request/methods.js +92 -0
- package/src/utils/request/proxy.js +23 -0
- package/src/utils/request/retry.js +87 -0
- package/src/utils/request/sanitize.js +41 -0
- package/src/utils/sessionKeeper.js +275 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { padZeros } = require("./utils");
|
|
4
|
+
|
|
5
|
+
function binaryToDecimal(data) {
|
|
6
|
+
var ret = "";
|
|
7
|
+
while (data !== "0") {
|
|
8
|
+
var end = 0;
|
|
9
|
+
var fullName = "";
|
|
10
|
+
var i = 0;
|
|
11
|
+
for (; i < data.length; i++) {
|
|
12
|
+
end = 2 * end + parseInt(data[i], 10);
|
|
13
|
+
if (end >= 10) {
|
|
14
|
+
fullName += "1";
|
|
15
|
+
end -= 10;
|
|
16
|
+
} else fullName += "0";
|
|
17
|
+
}
|
|
18
|
+
ret = end.toString() + ret;
|
|
19
|
+
data = fullName.slice(fullName.indexOf("1"));
|
|
20
|
+
}
|
|
21
|
+
return ret;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function generateOfflineThreadingID() {
|
|
25
|
+
var ret = Date.now();
|
|
26
|
+
var value = Math.floor(Math.random() * 4294967295);
|
|
27
|
+
var str = ("0000000000000000000000" + value.toString(2)).slice(-22);
|
|
28
|
+
var msgs = ret.toString(2) + str;
|
|
29
|
+
return binaryToDecimal(msgs);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function generateThreadingID(clientID) {
|
|
33
|
+
var k = Date.now();
|
|
34
|
+
var l = Math.floor(Math.random() * 4294967295);
|
|
35
|
+
var m = clientID;
|
|
36
|
+
return "<" + k + ":" + l + "-" + m + "@mail.projektitan.com>";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getGUID() {
|
|
40
|
+
var sectionLength = Date.now();
|
|
41
|
+
var id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
|
|
42
|
+
/[xy]/g,
|
|
43
|
+
function (c) {
|
|
44
|
+
var r = Math.floor((sectionLength + Math.random() * 16) % 16);
|
|
45
|
+
sectionLength = Math.floor(sectionLength / 16);
|
|
46
|
+
var _guid = (c == "x" ? r : (r & 7) | 8).toString(16);
|
|
47
|
+
return _guid;
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
return id;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function generateTimestampRelative() {
|
|
54
|
+
var d = new Date();
|
|
55
|
+
return d.getHours() + ":" + padZeros(d.getMinutes());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = {
|
|
59
|
+
binaryToDecimal,
|
|
60
|
+
generateOfflineThreadingID,
|
|
61
|
+
generateThreadingID,
|
|
62
|
+
getGUID,
|
|
63
|
+
generateTimestampRelative,
|
|
64
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const utils = require("./utils");
|
|
4
|
+
const ids = require("./ids");
|
|
5
|
+
const date = require("./date");
|
|
6
|
+
const presence = require("./presence");
|
|
7
|
+
const attachment = require("./attachment");
|
|
8
|
+
const delta = require("./delta");
|
|
9
|
+
const message = require("./message");
|
|
10
|
+
const readTyp = require("./readTyp");
|
|
11
|
+
const thread = require("./thread");
|
|
12
|
+
const decode = require("./decode");
|
|
13
|
+
const cookie = require("./cookie");
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
getType: utils.getType,
|
|
17
|
+
formatID: utils.formatID,
|
|
18
|
+
padZeros: utils.padZeros,
|
|
19
|
+
arrayToObject: utils.arrayToObject,
|
|
20
|
+
arrToForm: utils.arrToForm,
|
|
21
|
+
getData_Path: utils.getData_Path,
|
|
22
|
+
setData_Path: utils.setData_Path,
|
|
23
|
+
getPaths: utils.getPaths,
|
|
24
|
+
cleanHTML: utils.cleanHTML,
|
|
25
|
+
getCurrentTimestamp: utils.getCurrentTimestamp,
|
|
26
|
+
getSignatureID: utils.getSignatureID,
|
|
27
|
+
|
|
28
|
+
generateOfflineThreadingID: ids.generateOfflineThreadingID,
|
|
29
|
+
generateThreadingID: ids.generateThreadingID,
|
|
30
|
+
getGUID: ids.getGUID,
|
|
31
|
+
generateTimestampRelative: ids.generateTimestampRelative,
|
|
32
|
+
|
|
33
|
+
formatDate: date.formatDate,
|
|
34
|
+
|
|
35
|
+
presenceEncode: presence.presenceEncode,
|
|
36
|
+
presenceDecode: presence.presenceDecode,
|
|
37
|
+
generatePresence: presence.generatePresence,
|
|
38
|
+
generateAccessiblityCookie: presence.generateAccessiblityCookie,
|
|
39
|
+
formatProxyPresence: presence.formatProxyPresence,
|
|
40
|
+
formatPresence: presence.formatPresence,
|
|
41
|
+
|
|
42
|
+
_formatAttachment: attachment._formatAttachment,
|
|
43
|
+
formatAttachment: attachment.formatAttachment,
|
|
44
|
+
|
|
45
|
+
getAdminTextMessageType: delta.getAdminTextMessageType,
|
|
46
|
+
formatDeltaEvent: delta.formatDeltaEvent,
|
|
47
|
+
formatDeltaMessage: delta.formatDeltaMessage,
|
|
48
|
+
getMentionsFromDeltaMessage: delta.getMentionsFromDeltaMessage,
|
|
49
|
+
formatDeltaReadReceipt: delta.formatDeltaReadReceipt,
|
|
50
|
+
|
|
51
|
+
formatMessage: message.formatMessage,
|
|
52
|
+
formatEvent: message.formatEvent,
|
|
53
|
+
formatHistoryMessage: message.formatHistoryMessage,
|
|
54
|
+
|
|
55
|
+
formatReadReceipt: readTyp.formatReadReceipt,
|
|
56
|
+
formatRead: readTyp.formatRead,
|
|
57
|
+
formatTyp: readTyp.formatTyp,
|
|
58
|
+
|
|
59
|
+
formatThread: thread.formatThread,
|
|
60
|
+
|
|
61
|
+
decodeClientPayload: decode.decodeClientPayload,
|
|
62
|
+
|
|
63
|
+
formatCookie: cookie.formatCookie,
|
|
64
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { formatID } = require("./utils");
|
|
4
|
+
const { formatAttachment } = require("./attachment");
|
|
5
|
+
const { getAdminTextMessageType } = require("./delta");
|
|
6
|
+
|
|
7
|
+
function formatMessage(m) {
|
|
8
|
+
var originalMessage = m.message ? m.message : m;
|
|
9
|
+
var body = originalMessage.body || "";
|
|
10
|
+
var args = body == "" ? [] : body.trim().split(/\s+/);
|
|
11
|
+
var obj = {
|
|
12
|
+
type: "message",
|
|
13
|
+
senderName: originalMessage.sender_name,
|
|
14
|
+
senderID: formatID(originalMessage.sender_fbid.toString()),
|
|
15
|
+
participantNames: originalMessage.group_thread_info
|
|
16
|
+
? originalMessage.group_thread_info.participant_names
|
|
17
|
+
: [originalMessage.sender_name.split(" ")[0]],
|
|
18
|
+
participantIDs: originalMessage.group_thread_info
|
|
19
|
+
? originalMessage.group_thread_info.participant_ids.map(function (v) {
|
|
20
|
+
return formatID(v.toString());
|
|
21
|
+
})
|
|
22
|
+
: [formatID(originalMessage.sender_fbid)],
|
|
23
|
+
body: body,
|
|
24
|
+
args: args,
|
|
25
|
+
threadID: formatID(
|
|
26
|
+
(
|
|
27
|
+
originalMessage.thread_fbid || originalMessage.other_user_fbid
|
|
28
|
+
).toString(),
|
|
29
|
+
),
|
|
30
|
+
threadName: originalMessage.group_thread_info
|
|
31
|
+
? originalMessage.group_thread_info.name
|
|
32
|
+
: originalMessage.sender_name,
|
|
33
|
+
location: originalMessage.coordinates ? originalMessage.coordinates : null,
|
|
34
|
+
messageID: originalMessage.mid
|
|
35
|
+
? originalMessage.mid.toString()
|
|
36
|
+
: originalMessage.message_id,
|
|
37
|
+
attachments: formatAttachment(
|
|
38
|
+
originalMessage.attachments,
|
|
39
|
+
originalMessage.attachmentIds,
|
|
40
|
+
originalMessage.attachment_map,
|
|
41
|
+
originalMessage.share_map,
|
|
42
|
+
),
|
|
43
|
+
timestamp: originalMessage.timestamp,
|
|
44
|
+
timestampAbsolute: originalMessage.timestamp_absolute,
|
|
45
|
+
timestampRelative: originalMessage.timestamp_relative,
|
|
46
|
+
timestampDatetime: originalMessage.timestamp_datetime,
|
|
47
|
+
tags: originalMessage.tags,
|
|
48
|
+
reactions: originalMessage.reactions ? originalMessage.reactions : [],
|
|
49
|
+
isUnread: originalMessage.is_unread,
|
|
50
|
+
};
|
|
51
|
+
if (m.type === "pages_messaging")
|
|
52
|
+
obj.pageID = m.realtime_viewer_fbid.toString();
|
|
53
|
+
obj.isGroup = obj.participantIDs.length > 2;
|
|
54
|
+
return obj;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function formatEvent(m) {
|
|
58
|
+
var originalMessage = m.message ? m.message : m;
|
|
59
|
+
var logMessageType = originalMessage.log_message_type;
|
|
60
|
+
var logMessageData;
|
|
61
|
+
if (logMessageType === "log:generic-admin-text") {
|
|
62
|
+
logMessageData = originalMessage.log_message_data.untypedData;
|
|
63
|
+
logMessageType = getAdminTextMessageType(
|
|
64
|
+
originalMessage.log_message_data.message_type,
|
|
65
|
+
);
|
|
66
|
+
} else logMessageData = originalMessage.log_message_data;
|
|
67
|
+
return Object.assign(formatMessage(originalMessage), {
|
|
68
|
+
type: "event",
|
|
69
|
+
logMessageType: logMessageType,
|
|
70
|
+
logMessageData: logMessageData,
|
|
71
|
+
logMessageBody: originalMessage.log_message_body,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function formatHistoryMessage(m) {
|
|
76
|
+
switch (m.action_type) {
|
|
77
|
+
case "ma-type:log-message":
|
|
78
|
+
return formatEvent(m);
|
|
79
|
+
default:
|
|
80
|
+
return formatMessage(m);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = {
|
|
85
|
+
formatMessage,
|
|
86
|
+
formatEvent,
|
|
87
|
+
formatHistoryMessage,
|
|
88
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var PRESENCE_MAP = {
|
|
4
|
+
_: "%",
|
|
5
|
+
A: "%2",
|
|
6
|
+
B: "000",
|
|
7
|
+
C: "%7d",
|
|
8
|
+
D: "%7b%22",
|
|
9
|
+
E: "%2c%22",
|
|
10
|
+
F: "%22%3a",
|
|
11
|
+
G: "%2c%22ut%22%3a1",
|
|
12
|
+
H: "%2c%22bls%22%3a",
|
|
13
|
+
I: "%2c%22n%22%3a%22%",
|
|
14
|
+
J: "%22%3a%7b%22i%22%3a0%7d",
|
|
15
|
+
K: "%2c%22pt%22%3a0%2c%22vis%22%3a",
|
|
16
|
+
L: "%2c%22ch%22%3a%7b%22h%22%3a%22",
|
|
17
|
+
M: "%7b%22v%22%3a2%2c%22time%22%3a1",
|
|
18
|
+
N: ".channel%22%2c%22sub%22%3a%5b",
|
|
19
|
+
O: "%2c%22sb%22%3a1%2c%22t%22%3a%5b",
|
|
20
|
+
P: "%2c%22ud%22%3a100%2c%22lc%22%3a0",
|
|
21
|
+
Q: "%5d%2c%22f%22%3anull%2c%22uct%22%3a",
|
|
22
|
+
R: ".channel%22%2c%22sub%22%3a%5b1%5d",
|
|
23
|
+
S: "%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a",
|
|
24
|
+
T: "%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
25
|
+
U: "%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
26
|
+
V: "%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a",
|
|
27
|
+
W: "%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a",
|
|
28
|
+
X: "%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1",
|
|
29
|
+
Y: "%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
30
|
+
Z: "%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a",
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
var PRESENCE_REVERSE = {};
|
|
34
|
+
var PRESENCE_REGEX;
|
|
35
|
+
(function () {
|
|
36
|
+
var l = [];
|
|
37
|
+
for (var m in PRESENCE_MAP) {
|
|
38
|
+
PRESENCE_REVERSE[PRESENCE_MAP[m]] = m;
|
|
39
|
+
l.push(PRESENCE_MAP[m]);
|
|
40
|
+
}
|
|
41
|
+
l.reverse();
|
|
42
|
+
PRESENCE_REGEX = new RegExp(l.join("|"), "g");
|
|
43
|
+
})();
|
|
44
|
+
|
|
45
|
+
function presenceEncode(str) {
|
|
46
|
+
return encodeURIComponent(str)
|
|
47
|
+
.replace(/([_A-Z])|%../g, function (m, n) {
|
|
48
|
+
return n ? "%" + n.charCodeAt(0).toString(16) : m;
|
|
49
|
+
})
|
|
50
|
+
.toLowerCase()
|
|
51
|
+
.replace(PRESENCE_REGEX, function (m) {
|
|
52
|
+
return PRESENCE_REVERSE[m];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function presenceDecode(str) {
|
|
57
|
+
return decodeURIComponent(
|
|
58
|
+
str.replace(/[_A-Z]/g, function (m) {
|
|
59
|
+
return PRESENCE_MAP[m];
|
|
60
|
+
}),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function generatePresence(userID) {
|
|
65
|
+
var time = Date.now();
|
|
66
|
+
return (
|
|
67
|
+
"E" +
|
|
68
|
+
presenceEncode(
|
|
69
|
+
JSON.stringify({
|
|
70
|
+
v: 3,
|
|
71
|
+
time: parseInt(time / 1000, 10),
|
|
72
|
+
user: userID,
|
|
73
|
+
state: {
|
|
74
|
+
ut: 0,
|
|
75
|
+
t2: [],
|
|
76
|
+
lm2: null,
|
|
77
|
+
uct2: time,
|
|
78
|
+
tr: null,
|
|
79
|
+
tw: Math.floor(Math.random() * 4294967295) + 1,
|
|
80
|
+
at: time,
|
|
81
|
+
},
|
|
82
|
+
ch: {
|
|
83
|
+
["p_" + userID]: 0,
|
|
84
|
+
},
|
|
85
|
+
}),
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function generateAccessiblityCookie() {
|
|
91
|
+
var time = Date.now();
|
|
92
|
+
return encodeURIComponent(
|
|
93
|
+
JSON.stringify({
|
|
94
|
+
sr: 0,
|
|
95
|
+
"sr-ts": time,
|
|
96
|
+
jk: 0,
|
|
97
|
+
"jk-ts": time,
|
|
98
|
+
kb: 0,
|
|
99
|
+
"kb-ts": time,
|
|
100
|
+
hcm: 0,
|
|
101
|
+
"hcm-ts": time,
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function formatProxyPresence(presence, userID) {
|
|
107
|
+
if (presence.lat === undefined || presence.p === undefined) return null;
|
|
108
|
+
return {
|
|
109
|
+
type: "presence",
|
|
110
|
+
timestamp: presence.lat * 1000,
|
|
111
|
+
userID: userID || "",
|
|
112
|
+
statuses: presence.p,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function formatPresence(presence, userID) {
|
|
117
|
+
return {
|
|
118
|
+
type: "presence",
|
|
119
|
+
timestamp: presence.la * 1000,
|
|
120
|
+
userID: userID || "",
|
|
121
|
+
statuses: presence.a,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = {
|
|
126
|
+
presenceEncode,
|
|
127
|
+
presenceDecode,
|
|
128
|
+
generatePresence,
|
|
129
|
+
generateAccessiblityCookie,
|
|
130
|
+
formatProxyPresence,
|
|
131
|
+
formatPresence,
|
|
132
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { formatID } = require("./utils");
|
|
4
|
+
|
|
5
|
+
function formatReadReceipt(event) {
|
|
6
|
+
return {
|
|
7
|
+
reader: event.reader.toString(),
|
|
8
|
+
time: event.time,
|
|
9
|
+
threadID: formatID((event.thread_fbid || event.reader).toString()),
|
|
10
|
+
type: "read_receipt",
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function formatRead(event) {
|
|
15
|
+
return {
|
|
16
|
+
threadID: formatID(
|
|
17
|
+
(
|
|
18
|
+
(event.chat_ids && event.chat_ids[0]) ||
|
|
19
|
+
(event.thread_fbids && event.thread_fbids[0])
|
|
20
|
+
).toString(),
|
|
21
|
+
),
|
|
22
|
+
time: event.timestamp,
|
|
23
|
+
type: "read",
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function formatTyp(event) {
|
|
28
|
+
return {
|
|
29
|
+
isTyping: !!event.st,
|
|
30
|
+
from: event.from.toString(),
|
|
31
|
+
threadID: formatID(
|
|
32
|
+
(event.to || event.thread_fbid || event.from).toString(),
|
|
33
|
+
),
|
|
34
|
+
fromMobile: event.hasOwnProperty("from_mobile") ? event.from_mobile : true,
|
|
35
|
+
userID: (event.realtime_viewer_fbid || event.from).toString(),
|
|
36
|
+
type: "typ",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
formatReadReceipt,
|
|
42
|
+
formatRead,
|
|
43
|
+
formatTyp,
|
|
44
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { formatID } = require("./utils");
|
|
4
|
+
|
|
5
|
+
function formatThread(data) {
|
|
6
|
+
return {
|
|
7
|
+
threadID: formatID(data.thread_fbid.toString()),
|
|
8
|
+
participants: data.participants.map(formatID),
|
|
9
|
+
participantIDs: data.participants.map(formatID),
|
|
10
|
+
name: data.name,
|
|
11
|
+
nicknames: data.custom_nickname,
|
|
12
|
+
snippet: data.snippet,
|
|
13
|
+
snippetAttachments: data.snippet_attachments,
|
|
14
|
+
snippetSender: formatID((data.snippet_sender || "").toString()),
|
|
15
|
+
unreadCount: data.unread_count,
|
|
16
|
+
messageCount: data.message_count,
|
|
17
|
+
imageSrc: data.image_src,
|
|
18
|
+
timestamp: data.timestamp,
|
|
19
|
+
muteUntil: data.mute_until,
|
|
20
|
+
isCanonicalUser: data.is_canonical_user,
|
|
21
|
+
isCanonical: data.is_canonical,
|
|
22
|
+
isSubscribed: data.is_subscribed,
|
|
23
|
+
folder: data.folder,
|
|
24
|
+
isArchived: data.is_archived,
|
|
25
|
+
recipientsLoadable: data.recipients_loadable,
|
|
26
|
+
hasEmailParticipant: data.has_email_participant,
|
|
27
|
+
readOnly: data.read_only,
|
|
28
|
+
canReply: data.can_reply,
|
|
29
|
+
cannotReplyReason: data.cannot_reply_reason,
|
|
30
|
+
lastMessageTimestamp: data.last_message_timestamp,
|
|
31
|
+
lastReadTimestamp: data.last_read_timestamp,
|
|
32
|
+
lastMessageType: data.last_message_type,
|
|
33
|
+
emoji: data.custom_like_icon,
|
|
34
|
+
color: data.custom_color,
|
|
35
|
+
adminIDs: data.admin_ids,
|
|
36
|
+
threadType: data.thread_type,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = {
|
|
41
|
+
formatThread,
|
|
42
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function getType(obj) {
|
|
4
|
+
return Object.prototype.toString.call(obj).slice(8, -1);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function formatID(id) {
|
|
8
|
+
if (id != undefined && id != null) return id.replace(/(fb)?id[:.]/, "");
|
|
9
|
+
else return id;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function padZeros(val, len) {
|
|
13
|
+
val = String(val);
|
|
14
|
+
len = len || 2;
|
|
15
|
+
while (val.length < len) val = "0" + val;
|
|
16
|
+
return val;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function arrayToObject(arr, getKey, getValue) {
|
|
20
|
+
return arr.reduce(function (acc, val) {
|
|
21
|
+
acc[getKey(val)] = getValue(val);
|
|
22
|
+
return acc;
|
|
23
|
+
}, {});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function arrToForm(form) {
|
|
27
|
+
return arrayToObject(
|
|
28
|
+
form,
|
|
29
|
+
function (v) {
|
|
30
|
+
return v.name;
|
|
31
|
+
},
|
|
32
|
+
function (v) {
|
|
33
|
+
return v.val;
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function getData_Path(Obj, Arr, Stt) {
|
|
39
|
+
if (Arr.length === 0 && Obj != undefined) {
|
|
40
|
+
return Obj;
|
|
41
|
+
} else if (Obj == undefined) {
|
|
42
|
+
return Stt;
|
|
43
|
+
}
|
|
44
|
+
const head = Arr[0];
|
|
45
|
+
if (head == undefined) {
|
|
46
|
+
return Stt;
|
|
47
|
+
}
|
|
48
|
+
const tail = Arr.slice(1);
|
|
49
|
+
return getData_Path(Obj[head], tail, Stt++);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function setData_Path(obj, path, value) {
|
|
53
|
+
if (!path.length) {
|
|
54
|
+
return obj;
|
|
55
|
+
}
|
|
56
|
+
const currentKey = path[0];
|
|
57
|
+
let currentObj = obj[currentKey];
|
|
58
|
+
|
|
59
|
+
if (!currentObj) {
|
|
60
|
+
obj[currentKey] = value;
|
|
61
|
+
currentObj = obj[currentKey];
|
|
62
|
+
}
|
|
63
|
+
path.shift();
|
|
64
|
+
if (!path.length) {
|
|
65
|
+
currentObj = value;
|
|
66
|
+
} else {
|
|
67
|
+
currentObj = setData_Path(currentObj, path, value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return obj;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getPaths(obj, parentPath = []) {
|
|
74
|
+
let paths = [];
|
|
75
|
+
for (let prop in obj) {
|
|
76
|
+
if (typeof obj[prop] === "object") {
|
|
77
|
+
paths = paths.concat(getPaths(obj[prop], [...parentPath, prop]));
|
|
78
|
+
} else {
|
|
79
|
+
paths.push([...parentPath, prop]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return paths;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function cleanHTML(text) {
|
|
86
|
+
text = text.replace(
|
|
87
|
+
/(<br>)|(<\/?i>)|(<\/?em>)|(<\/?b>)|(!?~)|(&)|(')|(<)|(>)|(")/g,
|
|
88
|
+
(match) => {
|
|
89
|
+
switch (match) {
|
|
90
|
+
case "<br>":
|
|
91
|
+
return "\n";
|
|
92
|
+
case "<i>":
|
|
93
|
+
case "<em>":
|
|
94
|
+
case "</i>":
|
|
95
|
+
case "</em>":
|
|
96
|
+
return "*";
|
|
97
|
+
case "<b>":
|
|
98
|
+
case "</b>":
|
|
99
|
+
return "**";
|
|
100
|
+
case "~!":
|
|
101
|
+
case "!~":
|
|
102
|
+
return "||";
|
|
103
|
+
case "&":
|
|
104
|
+
return "&";
|
|
105
|
+
case "'":
|
|
106
|
+
return "'";
|
|
107
|
+
case "<":
|
|
108
|
+
return "<";
|
|
109
|
+
case ">":
|
|
110
|
+
return ">";
|
|
111
|
+
case """:
|
|
112
|
+
return '"';
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
return text;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function getCurrentTimestamp() {
|
|
120
|
+
const date = new Date();
|
|
121
|
+
const unixTime = date.getTime();
|
|
122
|
+
return unixTime;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function getSignatureID() {
|
|
126
|
+
return Math.floor(Math.random() * 2147483648).toString(16);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
getType,
|
|
131
|
+
formatID,
|
|
132
|
+
padZeros,
|
|
133
|
+
arrayToObject,
|
|
134
|
+
arrToForm,
|
|
135
|
+
getData_Path,
|
|
136
|
+
setData_Path,
|
|
137
|
+
getPaths,
|
|
138
|
+
cleanHTML,
|
|
139
|
+
getCurrentTimestamp,
|
|
140
|
+
getSignatureID,
|
|
141
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// AYMAN-FCA v2.0 — Smart Headers + Random User-Agent
|
|
3
|
+
// © 2025 Ayman. All Rights Reserved.
|
|
4
|
+
// مستوحى من: ws3-fca | مطوَّر بالكامل بواسطة أيمن
|
|
5
|
+
//
|
|
6
|
+
// السر الأول لاستمرارية الجلسة:
|
|
7
|
+
// كل request يستخدم User-Agent مختلف لتجنب كشف البوت
|
|
8
|
+
// ============================================================
|
|
9
|
+
"use strict";
|
|
10
|
+
|
|
11
|
+
// ✅ قائمة Chrome versions حقيقية لتغيير عشوائي
|
|
12
|
+
const CHROME_VERSIONS = [
|
|
13
|
+
"120.0.0.0","121.0.0.0","122.0.0.0","123.0.0.0",
|
|
14
|
+
"124.0.0.0","125.0.0.0","126.0.0.0","127.0.0.0"
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const PLATFORMS = [
|
|
18
|
+
{ os: "Windows NT 10.0; Win64; x64", platform: "Windows", version: '"15.0.0"' },
|
|
19
|
+
{ os: "Macintosh; Intel Mac OS X 10_15_7", platform: "macOS", version: '"13.6.0"' },
|
|
20
|
+
{ os: "X11; Linux x86_64", platform: "Linux", version: '"6.1.0"' }
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
function getRandom(arr) {
|
|
24
|
+
return arr[Math.floor(Math.random() * arr.length)];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ✅ يُولّد User-Agent + Sec-CH headers حقيقية عشوائية
|
|
28
|
+
function randomUserAgent() {
|
|
29
|
+
const platform = getRandom(PLATFORMS);
|
|
30
|
+
const version = getRandom(CHROME_VERSIONS);
|
|
31
|
+
const major = version.split(".")[0];
|
|
32
|
+
|
|
33
|
+
const userAgent = `Mozilla/5.0 (${platform.os}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version} Safari/537.36`;
|
|
34
|
+
|
|
35
|
+
const secChUa = `"Not/A)Brand";v="8", "Chromium";v="${major}", "Google Chrome";v="${major}"`;
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
userAgent,
|
|
39
|
+
secChUa,
|
|
40
|
+
secChUaPlatform: `"${platform.platform}"`,
|
|
41
|
+
secChUaPlatformVersion: platform.version,
|
|
42
|
+
secChUaMobile: "?0"
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ✅ Headers شاملة تُحاكي المتصفح الحقيقي
|
|
47
|
+
function getHeaders(url, options, ctx, customHeader) {
|
|
48
|
+
let host;
|
|
49
|
+
try { host = new URL(url).hostname; } catch { host = "www.facebook.com"; }
|
|
50
|
+
|
|
51
|
+
const { userAgent, secChUa, secChUaPlatform, secChUaPlatformVersion, secChUaMobile }
|
|
52
|
+
= randomUserAgent();
|
|
53
|
+
|
|
54
|
+
const ua = options?.userAgent || ctx?.globalOptions?.userAgent || userAgent;
|
|
55
|
+
|
|
56
|
+
const headers = {
|
|
57
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
|
|
58
|
+
"Accept-Encoding": "gzip, deflate, br",
|
|
59
|
+
"Accept-Language": "ar,en-US;q=0.9,en;q=0.8",
|
|
60
|
+
"Cache-Control": "max-age=0",
|
|
61
|
+
"Connection": "keep-alive",
|
|
62
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
63
|
+
"Host": host,
|
|
64
|
+
"Origin": `https://${host}`,
|
|
65
|
+
"Referer": `https://${host}/`,
|
|
66
|
+
"Sec-Ch-Ua": secChUa,
|
|
67
|
+
"Sec-Ch-Ua-Mobile": secChUaMobile,
|
|
68
|
+
"Sec-Ch-Ua-Platform": secChUaPlatform,
|
|
69
|
+
"Sec-Ch-Ua-Platform-Version": secChUaPlatformVersion,
|
|
70
|
+
"Sec-Fetch-Dest": "document",
|
|
71
|
+
"Sec-Fetch-Mode": "navigate",
|
|
72
|
+
"Sec-Fetch-Site": "same-origin",
|
|
73
|
+
"Sec-Fetch-User": "?1",
|
|
74
|
+
"Upgrade-Insecure-Requests": "1",
|
|
75
|
+
"User-Agent": ua,
|
|
76
|
+
"Viewport-Width": "1920",
|
|
77
|
+
"Dpr": "1"
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ✅ إضافة رؤوس المنطقة لتسريع الاتصال
|
|
81
|
+
if (ctx?.region) {
|
|
82
|
+
headers["X-MSGR-Region"] = ctx.region;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ✅ merge custom headers
|
|
86
|
+
if (customHeader && typeof customHeader === "object") {
|
|
87
|
+
for (const [k, v] of Object.entries(customHeader)) {
|
|
88
|
+
if (k !== "noRef") headers[k] = v;
|
|
89
|
+
}
|
|
90
|
+
if (customHeader.noRef) delete headers["Referer"];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return headers;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
module.exports = { getHeaders, randomUserAgent };
|