@cexy/hoonfca 1.0.4 → 1.0.6
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/CHANGELOG.md +181 -0
- package/DOCS.md +2636 -0
- package/LICENSE-MIT +21 -21
- package/README.md +632 -0
- package/func/checkUpdate.js +231 -0
- package/func/logger.js +48 -0
- package/index.d.ts +731 -605
- package/index.js +6 -774
- package/module/config.js +67 -0
- package/module/login.js +154 -0
- package/module/loginHelper.js +1034 -0
- package/module/options.js +54 -0
- package/package.json +54 -19
- package/src/api/action/addExternalModule.js +25 -0
- package/src/api/action/changeAvatar.js +137 -0
- package/src/{changeBio.js → api/action/changeBio.js} +75 -76
- package/src/api/action/enableAutoSaveAppState.js +73 -0
- package/src/{getCurrentUserID.js → api/action/getCurrentUserID.js} +7 -7
- package/src/{handleFriendRequest.js → api/action/handleFriendRequest.js} +57 -57
- package/src/api/action/logout.js +76 -0
- package/src/api/action/refreshFb_dtsg.js +48 -0
- package/src/api/action/setPostReaction.js +106 -0
- package/src/api/action/unfriend.js +54 -0
- package/src/api/http/httpGet.js +46 -0
- package/src/api/http/httpPost.js +52 -0
- package/src/api/http/postFormData.js +47 -0
- package/src/api/messaging/addUserToGroup.js +68 -0
- package/src/api/messaging/changeAdminStatus.js +122 -0
- package/src/api/messaging/changeArchivedStatus.js +55 -0
- package/src/api/messaging/changeBlockedStatus.js +48 -0
- package/src/api/messaging/changeGroupImage.js +90 -0
- package/src/api/messaging/changeNickname.js +70 -0
- package/src/api/messaging/changeThreadColor.js +79 -0
- package/src/api/messaging/changeThreadEmoji.js +106 -0
- package/src/{createNewGroup.js → api/messaging/createNewGroup.js} +88 -88
- package/src/api/messaging/createPoll.js +43 -0
- package/src/api/messaging/createThemeAI.js +98 -0
- package/src/{deleteMessage.js → api/messaging/deleteMessage.js} +56 -56
- package/src/{deleteThread.js → api/messaging/deleteThread.js} +56 -56
- package/src/api/messaging/editMessage.js +68 -0
- package/src/api/messaging/forwardAttachment.js +51 -0
- package/src/{getEmojiUrl.js → api/messaging/getEmojiUrl.js} +8 -8
- package/src/{getFriendsList.js → api/messaging/getFriendsList.js} +82 -84
- package/src/api/messaging/getMessage.js +829 -0
- package/src/api/messaging/getThemePictures.js +62 -0
- package/src/api/messaging/handleMessageRequest.js +65 -0
- package/src/{markAsDelivered.js → api/messaging/markAsDelivered.js} +57 -58
- package/src/{markAsRead.js → api/messaging/markAsRead.js} +88 -88
- package/src/{markAsReadAll.js → api/messaging/markAsReadAll.js} +49 -50
- package/src/api/messaging/markAsSeen.js +61 -0
- package/src/{muteThread.js → api/messaging/muteThread.js} +50 -52
- package/src/api/messaging/removeUserFromGroup.js +106 -0
- package/src/{resolvePhotoUrl.js → api/messaging/resolvePhotoUrl.js} +43 -45
- package/src/api/messaging/scheduler.js +264 -0
- package/src/{searchForThread.js → api/messaging/searchForThread.js} +52 -53
- package/src/api/messaging/sendMessage.js +272 -0
- package/src/api/messaging/sendTypingIndicator.js +67 -0
- package/src/api/messaging/setMessageReaction.js +76 -0
- package/src/api/messaging/setTitle.js +119 -0
- package/src/{shareContact.js → api/messaging/shareContact.js} +49 -53
- package/src/api/messaging/threadColors.js +128 -0
- package/src/api/messaging/unsendMessage.js +81 -0
- package/src/api/messaging/uploadAttachment.js +94 -0
- package/src/api/socket/core/connectMqtt.js +255 -0
- package/src/api/socket/core/emitAuth.js +106 -0
- package/src/api/socket/core/getSeqID.js +40 -0
- package/src/api/socket/core/getTaskResponseData.js +22 -0
- package/src/api/socket/core/markDelivery.js +12 -0
- package/src/api/socket/core/parseDelta.js +391 -0
- package/src/api/socket/detail/buildStream.js +208 -0
- package/src/api/socket/detail/constants.js +24 -0
- package/src/api/socket/listenMqtt.js +364 -0
- package/src/api/socket/middleware/index.js +216 -0
- package/src/{getThreadHistory.js → api/threads/getThreadHistory.js} +664 -647
- package/src/api/threads/getThreadInfo.js +438 -0
- package/src/{getThreadList.js → api/threads/getThreadList.js} +293 -292
- package/src/{getThreadPictures.js → api/threads/getThreadPictures.js} +78 -79
- package/src/{getUserID.js → api/users/getUserID.js} +65 -66
- package/src/api/users/getUserInfo.js +327 -0
- package/src/api/users/getUserInfoV2.js +134 -0
- package/src/core/sendReqMqtt.js +96 -0
- package/src/database/models/index.js +87 -0
- package/src/database/models/thread.js +45 -0
- package/src/database/models/user.js +46 -0
- package/src/database/threadData.js +98 -0
- package/src/database/userData.js +89 -0
- package/src/utils/client.js +320 -0
- package/src/utils/constants.js +23 -0
- package/{utils.js → src/utils/format.js} +1115 -1447
- package/src/utils/headers.js +115 -0
- package/src/utils/request.js +305 -0
- package/.travis.yml +0 -6
- package/src/addExternalModule.js +0 -23
- package/src/addUserToGroup.js +0 -113
- package/src/changeAdminStatus.js +0 -95
- package/src/changeApprovalMode.js +0 -79
- package/src/changeArchivedStatus.js +0 -55
- package/src/changeBlockedStatus.js +0 -47
- package/src/changeBlockedStatusMqtt.js +0 -86
- package/src/changeGroupImage.js +0 -133
- package/src/changeNickname.js +0 -59
- package/src/changeThreadColor.js +0 -71
- package/src/changeThreadEmoji.js +0 -55
- package/src/createPoll.js +0 -130
- package/src/editMessage.js +0 -63
- package/src/forwardAttachment.js +0 -60
- package/src/forwardMessage.js +0 -63
- package/src/getGroupsList.js +0 -83
- package/src/getMarketplace.js +0 -84
- package/src/getNotifications.js +0 -86
- package/src/getPagesList.js +0 -83
- package/src/getStories.js +0 -88
- package/src/getThreadInfo.js +0 -222
- package/src/getUserInfo.js +0 -128
- package/src/handleMessageRequest.js +0 -65
- package/src/httpGet.js +0 -58
- package/src/httpPost.js +0 -58
- package/src/listenMqtt.js +0 -1018
- package/src/logout.js +0 -75
- package/src/markAsSeen.js +0 -61
- package/src/pinMessage.js +0 -61
- package/src/removeUserFromGroup.js +0 -79
- package/src/searchUsers.js +0 -89
- package/src/sendComment.js +0 -161
- package/src/sendMessage.js +0 -457
- package/src/sendTypingIndicator.js +0 -179
- package/src/setBio.js +0 -86
- package/src/setMessageReaction.js +0 -186
- package/src/setPostReaction.js +0 -71
- package/src/setTheme.js +0 -313
- package/src/setTitle.js +0 -90
- package/src/shareLink.js +0 -62
- package/src/threadColors.js +0 -57
- package/src/unfriend.js +0 -53
- package/src/unsendMessage.js +0 -104
package/src/logout.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var utils = require("../utils");
|
|
4
|
-
var log = require("npmlog");
|
|
5
|
-
|
|
6
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
7
|
-
return function logout(callback) {
|
|
8
|
-
var resolveFunc = function () {};
|
|
9
|
-
var rejectFunc = function () {};
|
|
10
|
-
var returnPromise = new Promise(function (resolve, reject) {
|
|
11
|
-
resolveFunc = resolve;
|
|
12
|
-
rejectFunc = reject;
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
if (!callback) {
|
|
16
|
-
callback = function (err, friendList) {
|
|
17
|
-
if (err) {
|
|
18
|
-
return rejectFunc(err);
|
|
19
|
-
}
|
|
20
|
-
resolveFunc(friendList);
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var form = {
|
|
25
|
-
pmid: "0",
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
defaultFuncs
|
|
29
|
-
.post(
|
|
30
|
-
"https://www.facebook.com/bluebar/modern_settings_menu/?help_type=364455653583099&show_contextual_help=1",
|
|
31
|
-
ctx.jar,
|
|
32
|
-
form,
|
|
33
|
-
)
|
|
34
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
35
|
-
.then(function (resData) {
|
|
36
|
-
var elem = resData.jsmods.instances[0][2][0].filter(function (v) {
|
|
37
|
-
return v.value === "logout";
|
|
38
|
-
})[0];
|
|
39
|
-
|
|
40
|
-
var html = resData.jsmods.markup.filter(function (v) {
|
|
41
|
-
return v[0] === elem.markup.__m;
|
|
42
|
-
})[0][1].__html;
|
|
43
|
-
|
|
44
|
-
var form = {
|
|
45
|
-
fb_dtsg: utils.getFrom(html, '"fb_dtsg" value="', '"'),
|
|
46
|
-
ref: utils.getFrom(html, '"ref" value="', '"'),
|
|
47
|
-
h: utils.getFrom(html, '"h" value="', '"'),
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
return defaultFuncs
|
|
51
|
-
.post("https://www.facebook.com/logout.php", ctx.jar, form)
|
|
52
|
-
.then(utils.saveCookies(ctx.jar));
|
|
53
|
-
})
|
|
54
|
-
.then(function (res) {
|
|
55
|
-
if (!res.headers) {
|
|
56
|
-
throw { error: "An error occurred when logging out." };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
return defaultFuncs
|
|
60
|
-
.get(res.headers.location, ctx.jar)
|
|
61
|
-
.then(utils.saveCookies(ctx.jar));
|
|
62
|
-
})
|
|
63
|
-
.then(function () {
|
|
64
|
-
ctx.loggedIn = false;
|
|
65
|
-
log.info("logout", "Logged out successfully.");
|
|
66
|
-
callback();
|
|
67
|
-
})
|
|
68
|
-
.catch(function (err) {
|
|
69
|
-
log.error("logout", err);
|
|
70
|
-
return callback(err);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
return returnPromise;
|
|
74
|
-
};
|
|
75
|
-
};
|
package/src/markAsSeen.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var utils = require("../utils");
|
|
4
|
-
var log = require("npmlog");
|
|
5
|
-
|
|
6
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
7
|
-
return function markAsRead(seen_timestamp, callback) {
|
|
8
|
-
if (
|
|
9
|
-
utils.getType(seen_timestamp) == "Function" ||
|
|
10
|
-
utils.getType(seen_timestamp) == "AsyncFunction"
|
|
11
|
-
) {
|
|
12
|
-
callback = seen_timestamp;
|
|
13
|
-
seen_timestamp = Date.now();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
var resolveFunc = function () {};
|
|
17
|
-
var rejectFunc = function () {};
|
|
18
|
-
var returnPromise = new Promise(function (resolve, reject) {
|
|
19
|
-
resolveFunc = resolve;
|
|
20
|
-
rejectFunc = reject;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
if (!callback) {
|
|
24
|
-
callback = function (err, friendList) {
|
|
25
|
-
if (err) {
|
|
26
|
-
return rejectFunc(err);
|
|
27
|
-
}
|
|
28
|
-
resolveFunc(friendList);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
var form = {
|
|
33
|
-
seen_timestamp: seen_timestamp,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
defaultFuncs
|
|
37
|
-
.post(
|
|
38
|
-
"https://www.facebook.com/ajax/mercury/mark_seen.php",
|
|
39
|
-
ctx.jar,
|
|
40
|
-
form,
|
|
41
|
-
)
|
|
42
|
-
.then(utils.saveCookies(ctx.jar))
|
|
43
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
44
|
-
.then(function (resData) {
|
|
45
|
-
if (resData.error) {
|
|
46
|
-
throw resData;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return callback();
|
|
50
|
-
})
|
|
51
|
-
.catch(function (err) {
|
|
52
|
-
log.error("markAsSeen", err);
|
|
53
|
-
if (utils.getType(err) == "Object" && err.error === "Not logged in.") {
|
|
54
|
-
ctx.loggedIn = false;
|
|
55
|
-
}
|
|
56
|
-
return callback(err);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
return returnPromise;
|
|
60
|
-
};
|
|
61
|
-
};
|
package/src/pinMessage.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const { generateOfflineThreadingID, getCurrentTimestamp } = require("../utils");
|
|
4
|
-
|
|
5
|
-
function isCallable(func) {
|
|
6
|
-
try {
|
|
7
|
-
Reflect.apply(func, null, []);
|
|
8
|
-
return true;
|
|
9
|
-
} catch (error) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
15
|
-
return function pinMessage(pinMode, messageID, threadID, callback) {
|
|
16
|
-
if (!ctx.mqttClient) {
|
|
17
|
-
throw new Error("Not connected to MQTT");
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
ctx.wsReqNumber += 1;
|
|
21
|
-
ctx.wsTaskNumber += 1;
|
|
22
|
-
|
|
23
|
-
const taskLabel = pinMode ? "430" : "431";
|
|
24
|
-
const queueNamePrefix = pinMode ? "pin_msg_v2_" : "unpin_msg_v2_";
|
|
25
|
-
|
|
26
|
-
const taskPayload = {
|
|
27
|
-
thread_key: threadID,
|
|
28
|
-
message_id: messageID,
|
|
29
|
-
timestamp_ms: getCurrentTimestamp(),
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const task = {
|
|
33
|
-
failure_count: null,
|
|
34
|
-
label: taskLabel,
|
|
35
|
-
payload: JSON.stringify(taskPayload),
|
|
36
|
-
queue_name: `${queueNamePrefix}${threadID}`,
|
|
37
|
-
task_id: ctx.wsTaskNumber,
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const content = {
|
|
41
|
-
app_id: "2220391788200892",
|
|
42
|
-
payload: JSON.stringify({
|
|
43
|
-
data_trace_id: null,
|
|
44
|
-
epoch_id: parseInt(generateOfflineThreadingID()),
|
|
45
|
-
tasks: [task],
|
|
46
|
-
version_id: "25095469420099952",
|
|
47
|
-
}),
|
|
48
|
-
request_id: ctx.wsReqNumber,
|
|
49
|
-
type: 3,
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
if (isCallable(callback)) {
|
|
53
|
-
// to be implemented
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
ctx.mqttClient.publish("/ls_req", JSON.stringify(content), {
|
|
57
|
-
qos: 1,
|
|
58
|
-
retain: false,
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var utils = require("../utils");
|
|
4
|
-
var log = require("npmlog");
|
|
5
|
-
|
|
6
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
7
|
-
return function removeUserFromGroup(userID, threadID, callback) {
|
|
8
|
-
if (
|
|
9
|
-
!callback &&
|
|
10
|
-
(utils.getType(threadID) === "Function" ||
|
|
11
|
-
utils.getType(threadID) === "AsyncFunction")
|
|
12
|
-
) {
|
|
13
|
-
throw { error: "please pass a threadID as a second argument." };
|
|
14
|
-
}
|
|
15
|
-
if (
|
|
16
|
-
utils.getType(threadID) !== "Number" &&
|
|
17
|
-
utils.getType(threadID) !== "String"
|
|
18
|
-
) {
|
|
19
|
-
throw {
|
|
20
|
-
error:
|
|
21
|
-
"threadID should be of type Number or String and not " +
|
|
22
|
-
utils.getType(threadID) +
|
|
23
|
-
".",
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
if (
|
|
27
|
-
utils.getType(userID) !== "Number" &&
|
|
28
|
-
utils.getType(userID) !== "String"
|
|
29
|
-
) {
|
|
30
|
-
throw {
|
|
31
|
-
error:
|
|
32
|
-
"userID should be of type Number or String and not " +
|
|
33
|
-
utils.getType(userID) +
|
|
34
|
-
".",
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
var resolveFunc = function () {};
|
|
39
|
-
var rejectFunc = function () {};
|
|
40
|
-
var returnPromise = new Promise(function (resolve, reject) {
|
|
41
|
-
resolveFunc = resolve;
|
|
42
|
-
rejectFunc = reject;
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
if (!callback) {
|
|
46
|
-
callback = function (err, friendList) {
|
|
47
|
-
if (err) {
|
|
48
|
-
return rejectFunc(err);
|
|
49
|
-
}
|
|
50
|
-
resolveFunc(friendList);
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
var form = {
|
|
55
|
-
uid: userID,
|
|
56
|
-
tid: threadID,
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
defaultFuncs
|
|
60
|
-
.post("https://www.facebook.com/chat/remove_participants", ctx.jar, form)
|
|
61
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
62
|
-
.then(function (resData) {
|
|
63
|
-
if (!resData) {
|
|
64
|
-
throw { error: "Remove from group failed." };
|
|
65
|
-
}
|
|
66
|
-
if (resData.error) {
|
|
67
|
-
throw resData;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return callback();
|
|
71
|
-
})
|
|
72
|
-
.catch(function (err) {
|
|
73
|
-
log.error("removeUserFromGroup", err);
|
|
74
|
-
return callback(err);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
return returnPromise;
|
|
78
|
-
};
|
|
79
|
-
};
|
package/src/searchUsers.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var utils = require("../utils");
|
|
4
|
-
var log = require("npmlog");
|
|
5
|
-
|
|
6
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
7
|
-
/**
|
|
8
|
-
* Search for users by name
|
|
9
|
-
* @param {string} query - Search query
|
|
10
|
-
* @param {number} limit - Number of results to return
|
|
11
|
-
* @param {function} callback - Callback function
|
|
12
|
-
*/
|
|
13
|
-
return function searchUsers(query, limit, callback) {
|
|
14
|
-
var resolveFunc = function () {};
|
|
15
|
-
var rejectFunc = function () {};
|
|
16
|
-
var returnPromise = new Promise(function (resolve, reject) {
|
|
17
|
-
resolveFunc = resolve;
|
|
18
|
-
rejectFunc = reject;
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
if (!callback) {
|
|
22
|
-
if (utils.getType(limit) == "Function") {
|
|
23
|
-
callback = limit;
|
|
24
|
-
limit = 10;
|
|
25
|
-
} else {
|
|
26
|
-
callback = function (err, data) {
|
|
27
|
-
if (err) {
|
|
28
|
-
return rejectFunc(err);
|
|
29
|
-
}
|
|
30
|
-
resolveFunc(data);
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (utils.getType(limit) != "Number") {
|
|
36
|
-
limit = 10;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (utils.getType(query) != "String") {
|
|
40
|
-
return callback({ error: "Query must be a string" });
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
var form = {
|
|
44
|
-
av: ctx.userID,
|
|
45
|
-
fb_api_caller_class: "RelayModern",
|
|
46
|
-
fb_api_req_friendly_name: "SearchTypeaheadQuery",
|
|
47
|
-
doc_id: "24585299697835063",
|
|
48
|
-
variables: JSON.stringify({
|
|
49
|
-
query: query,
|
|
50
|
-
first: limit,
|
|
51
|
-
}),
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
defaultFuncs
|
|
55
|
-
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
56
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
57
|
-
.then(function (resData) {
|
|
58
|
-
if (resData.errors) {
|
|
59
|
-
throw resData;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
var users = [];
|
|
63
|
-
if (
|
|
64
|
-
resData.data &&
|
|
65
|
-
resData.data.users &&
|
|
66
|
-
resData.data.users.edges
|
|
67
|
-
) {
|
|
68
|
-
users = resData.data.users.edges.map(function (edge) {
|
|
69
|
-
return {
|
|
70
|
-
id: edge.node.id,
|
|
71
|
-
name: edge.node.name,
|
|
72
|
-
profileUrl: edge.node.profile_url,
|
|
73
|
-
thumbSrc: edge.node.thumb_src,
|
|
74
|
-
isFriend: edge.node.is_friend,
|
|
75
|
-
};
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
log.info("searchUsers", "Found " + users.length + " users");
|
|
80
|
-
return callback(null, users);
|
|
81
|
-
})
|
|
82
|
-
.catch(function (err) {
|
|
83
|
-
log.error("searchUsers", err);
|
|
84
|
-
return callback(err);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return returnPromise;
|
|
88
|
-
};
|
|
89
|
-
};
|
package/src/sendComment.js
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var utils = require("../utils");
|
|
4
|
-
var log = require("npmlog");
|
|
5
|
-
var bluebird = require("bluebird");
|
|
6
|
-
|
|
7
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
8
|
-
function getGUID() {
|
|
9
|
-
let _0x161e32 = Date.now(),
|
|
10
|
-
_0x4ec135 = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
|
|
11
|
-
/[xy]/g,
|
|
12
|
-
function (_0x32f946) {
|
|
13
|
-
let _0x141041 = Math.floor((_0x161e32 + Math.random() * 16) % 16);
|
|
14
|
-
_0x161e32 = Math.floor(_0x161e32 / 16);
|
|
15
|
-
let _0x31fcdd = (
|
|
16
|
-
_0x32f946 == "x" ? _0x141041 : (_0x141041 & 0x3) | 0x8
|
|
17
|
-
).toString(16);
|
|
18
|
-
return _0x31fcdd;
|
|
19
|
-
},
|
|
20
|
-
);
|
|
21
|
-
return _0x4ec135;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function uploadAttachment(attachment, callback) {
|
|
25
|
-
var uploads = [];
|
|
26
|
-
|
|
27
|
-
// create an array of promises
|
|
28
|
-
if (!utils.isReadableStream(attachment)) {
|
|
29
|
-
throw {
|
|
30
|
-
error:
|
|
31
|
-
"Attachment should be a readable stream and not " +
|
|
32
|
-
utils.getType(attachment) +
|
|
33
|
-
".",
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
var form = {
|
|
38
|
-
file: attachment,
|
|
39
|
-
av: api.getCurrentUserID(),
|
|
40
|
-
profile_id: api.getCurrentUserID(),
|
|
41
|
-
source: "19",
|
|
42
|
-
target_id: api.getCurrentUserID(),
|
|
43
|
-
__user: api.getCurrentUserID(),
|
|
44
|
-
__a: "1",
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
uploads.push(
|
|
48
|
-
defaultFuncs
|
|
49
|
-
.postFormData(
|
|
50
|
-
"https://www.facebook.com/ajax/ufi/upload",
|
|
51
|
-
ctx.jar,
|
|
52
|
-
form,
|
|
53
|
-
{},
|
|
54
|
-
)
|
|
55
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
56
|
-
.then(function (resData) {
|
|
57
|
-
if (resData.error) {
|
|
58
|
-
throw resData;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// We have to return the data unformatted unless we want to change it
|
|
62
|
-
// back in sendMessage.
|
|
63
|
-
return resData.payload;
|
|
64
|
-
}),
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
// resolve all promises
|
|
68
|
-
bluebird
|
|
69
|
-
.all(uploads)
|
|
70
|
-
.then(function (resData) {
|
|
71
|
-
callback(null, resData);
|
|
72
|
-
})
|
|
73
|
-
.catch(function (err) {
|
|
74
|
-
log.error("uploadAttachment", err);
|
|
75
|
-
return callback(err);
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function sendCommentToFb(postId, text, fileID) {
|
|
80
|
-
const feedback_id = Buffer.from("feedback:" + postId).toString("base64");
|
|
81
|
-
|
|
82
|
-
const ss1 = getGUID();
|
|
83
|
-
const ss2 = getGUID();
|
|
84
|
-
|
|
85
|
-
const form = {
|
|
86
|
-
av: api.getCurrentUserID(),
|
|
87
|
-
fb_api_req_friendly_name: "CometUFICreateCommentMutation",
|
|
88
|
-
fb_api_caller_class: "RelayModern",
|
|
89
|
-
doc_id: "4744517358977326",
|
|
90
|
-
variables: JSON.stringify({
|
|
91
|
-
displayCommentsFeedbackContext: null,
|
|
92
|
-
displayCommentsContextEnableComment: null,
|
|
93
|
-
displayCommentsContextIsAdPreview: null,
|
|
94
|
-
displayCommentsContextIsAggregatedShare: null,
|
|
95
|
-
displayCommentsContextIsStorySet: null,
|
|
96
|
-
feedLocation: "TIMELINE",
|
|
97
|
-
feedbackSource: 0,
|
|
98
|
-
focusCommentID: null,
|
|
99
|
-
includeNestedComments: false,
|
|
100
|
-
input: {
|
|
101
|
-
attachments: fileID ? [{ media: { id: fileID } }] : null,
|
|
102
|
-
feedback_id: feedback_id,
|
|
103
|
-
formatting_style: null,
|
|
104
|
-
message: {
|
|
105
|
-
ranges: [],
|
|
106
|
-
text: text,
|
|
107
|
-
},
|
|
108
|
-
is_tracking_encrypted: true,
|
|
109
|
-
tracking: [],
|
|
110
|
-
feedback_source: "PROFILE",
|
|
111
|
-
idempotence_token: "client:" + ss1,
|
|
112
|
-
session_id: ss2,
|
|
113
|
-
actor_id: api.getCurrentUserID(),
|
|
114
|
-
client_mutation_id: Math.round(Math.random() * 19),
|
|
115
|
-
},
|
|
116
|
-
scale: 3,
|
|
117
|
-
useDefaultActor: false,
|
|
118
|
-
UFI2CommentsProvider_commentsKey: "ProfileCometTimelineRoute",
|
|
119
|
-
}),
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const res = JSON.parse(
|
|
123
|
-
await api.httpPost("https://www.facebook.com/api/graphql/", form),
|
|
124
|
-
);
|
|
125
|
-
return res;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return async function sendComment(content, postId, callback) {
|
|
129
|
-
if (typeof content === "object") {
|
|
130
|
-
var text = content.body || "";
|
|
131
|
-
if (content.attachment) {
|
|
132
|
-
if (!utils.isReadableStream(content.attachment)) {
|
|
133
|
-
throw new Error("Attachment must be a ReadableStream");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
uploadAttachment(content.attachment, async function (err, files) {
|
|
137
|
-
if (err) {
|
|
138
|
-
return callback(err);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
await sendCommentToFb(postId, text, files[0].fbid)
|
|
142
|
-
.then((res) => {
|
|
143
|
-
return callback(null, res);
|
|
144
|
-
})
|
|
145
|
-
.catch((err) => {
|
|
146
|
-
return callback(err);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
} else if (typeof content === "string") {
|
|
151
|
-
var text = content;
|
|
152
|
-
await sendCommentToFb(postId, text, null)
|
|
153
|
-
.then((res) => {
|
|
154
|
-
return callback(null, res);
|
|
155
|
-
})
|
|
156
|
-
.catch((err) => {
|
|
157
|
-
return callback(err);
|
|
158
|
-
});
|
|
159
|
-
} else throw new Error("Invalid content");
|
|
160
|
-
};
|
|
161
|
-
};
|