fca-priyansh 19.0.1 → 20.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/.gitlab-ci.yml +22 -0
- package/CountTime.json +1 -0
- package/Extra/Balancer.js +49 -49
- package/Extra/BroadcastSystem.js +1 -0
- package/Extra/Bypass/956/index.js +233 -233
- package/Extra/Bypass/test/aaaa.json +169 -169
- package/Extra/Bypass/test/index.js +187 -187
- package/Extra/Database/index.js +468 -468
- package/Extra/ExtraAddons.js +82 -82
- package/Extra/ExtraFindUID.js +61 -61
- package/Extra/ExtraGetThread.js +365 -365
- package/Extra/ExtraScreenShot.js +430 -430
- package/Extra/ExtraUptimeRobot.js +142 -38
- package/Extra/Html/Classic/script.js +118 -118
- package/Extra/Html/Classic/style.css +7 -7
- package/Extra/Security/Base/Step_1.js +5 -5
- package/Extra/Security/Base/Step_2.js +22 -22
- package/Extra/Security/Base/Step_3.js +22 -22
- package/Extra/Security/Base/index.js +190 -190
- package/Extra/Security/Index.js +4 -4
- package/Extra/Security/Step_1.js +5 -5
- package/Extra/Security/Step_2.js +22 -22
- package/Extra/Security/Step_3.js +22 -22
- package/Extra/Src/Change_Environment.js +24 -24
- package/Extra/Src/Check_Update.js +66 -66
- package/Extra/Src/History.js +114 -114
- package/Extra/Src/Instant_Update.js +64 -64
- package/Extra/Src/Last-Run.js +64 -64
- package/Extra/Src/Premium.js +81 -81
- package/Extra/Src/Websocket.js +212 -212
- package/Extra/Src/uuid.js +137 -137
- package/Func/AcceptAgreement.js +31 -31
- package/Func/ClearCache.js +64 -64
- package/Func/ReportV1.js +54 -54
- package/LICENSE +21 -21
- package/Language/index.json +228 -228
- package/Main.js +1 -1290
- package/README.md +198 -198
- package/broadcast.js +1 -44
- package/errorHandler.js +151 -0
- package/index.js +1 -448
- package/logger.js +69 -66
- package/package.json +99 -98
- package/src/Dev_Horizon_Data.js +124 -124
- package/src/Dev_getThreadInfoOLD.js +421 -421
- package/src/Dev_shareTest2.js +68 -68
- package/src/Dev_shareTest3.js +71 -71
- package/src/Premium.js +24 -24
- package/src/Screenshot.js +82 -82
- package/src/addExternalModule.js +16 -16
- package/src/addUserToGroup.js +79 -79
- package/src/changeAdminStatus.js +79 -79
- package/src/changeArchivedStatus.js +41 -41
- package/src/changeAvt.js +84 -84
- package/src/changeBio.js +65 -65
- package/src/changeBlockedStatus.js +36 -36
- package/src/changeGroupImage.js +106 -106
- package/src/changeNickname.js +45 -45
- package/src/changeThreadColor.js +62 -62
- package/src/changeThreadEmoji.js +42 -42
- package/src/changeThreadTheme.js +263 -0
- package/src/comment.js +244 -0
- package/src/createNewGroup.js +70 -70
- package/src/createPoll.js +60 -60
- package/src/deleteMessage.js +45 -45
- package/src/deleteThread.js +43 -43
- package/src/editMessage.js +71 -71
- package/src/follow.js +119 -0
- package/src/forwardAttachment.js +48 -48
- package/src/friend.js +383 -0
- package/src/getAccessToken.js +27 -27
- package/src/getCurrentUserID.js +7 -7
- package/src/getEmojiUrl.js +27 -27
- package/src/getFriendsList.js +73 -73
- package/src/getMessage.js +102 -102
- package/src/getPendingFriendRequests.js +45 -0
- package/src/getThreadHistory.js +537 -537
- package/src/getThreadInfo.js +424 -423
- package/src/getThreadInfoOLD.js +421 -421
- package/src/getThreadList.js +213 -213
- package/src/getThreadMain.js +219 -219
- package/src/getThreadPictures.js +59 -59
- package/src/getUID.js +58 -58
- package/src/getUserID.js +62 -62
- package/src/getUserInfo.js +112 -112
- package/src/getUserInfoMain.js +64 -64
- package/src/getUserInfoV2.js +31 -31
- package/src/getUserInfoV3.js +62 -62
- package/src/getUserInfoV4.js +54 -54
- package/src/getUserInfoV5.js +60 -60
- package/src/handleFriendRequest.js +46 -46
- package/src/handleMessageRequest.js +49 -49
- package/src/httpGet.js +49 -49
- package/src/httpPost.js +48 -48
- package/src/httpPostFormData.js +40 -40
- package/src/listenMqtt.js +1 -956
- package/src/listenMqttV1.js +832 -846
- package/src/logout.js +68 -68
- package/src/markAsDelivered.js +48 -48
- package/src/markAsRead.js +70 -70
- package/src/markAsReadAll.js +42 -42
- package/src/markAsSeen.js +51 -51
- package/src/muteThread.js +47 -47
- package/src/notes.js +279 -0
- package/src/removeUserFromGroup.js +49 -49
- package/src/resolvePhotoUrl.js +37 -37
- package/src/searchForThread.js +43 -43
- package/src/sendMention.js +325 -0
- package/src/sendMessage.js +1 -386
- package/src/sendMqttMessage.js +70 -70
- package/src/sendTypingIndicator.js +79 -80
- package/src/setMessageReaction.js +109 -109
- package/src/setPostReaction.js +101 -101
- package/src/setTitle.js +74 -74
- package/src/share.js +98 -0
- package/src/shareContact.js +55 -55
- package/src/shareLink.js +58 -58
- package/src/stickers.js +525 -0
- package/src/story.js +267 -0
- package/src/threadColors.js +38 -38
- package/src/unfriend.js +43 -43
- package/src/unsendMessage.js +47 -47
- package/src/unsendMqttMessage.js +65 -65
- package/test/data/shareAttach.js +146 -146
- package/test/data/test.txt +7 -7
- package/test/example-config.json +18 -18
- package/test/test-page.js +140 -140
- package/test/test.js +385 -385
- package/test/testv2.js +2 -2
- package/userAgentManager.js +129 -0
- package/utils.js +1 -3077
- package/.github/workflows/publish.yml +0 -20
- package/Extra/Src/Release_Memory.js +0 -160
- package/Extra/Src/test.js +0 -28
- package/SECURITY.md +0 -17
package/src/follow.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Follow API Module
|
|
5
|
+
* Follow or unfollow users on Facebook
|
|
6
|
+
*
|
|
7
|
+
* @author Priyansh Rajput
|
|
8
|
+
* @github https://github.com/priyanshufsdev
|
|
9
|
+
* @license MIT
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
var utils = require("../utils");
|
|
13
|
+
var log = require("npmlog");
|
|
14
|
+
|
|
15
|
+
module.exports = function(defaultFuncs, api, ctx) {
|
|
16
|
+
/**
|
|
17
|
+
* Follow or unfollow a user on Facebook
|
|
18
|
+
*
|
|
19
|
+
* @param {string} userID - The ID of the user to follow/unfollow
|
|
20
|
+
* @param {boolean} shouldFollow - true to follow, false to unfollow
|
|
21
|
+
* @param {function} callback - Optional callback function
|
|
22
|
+
* @returns {Promise<object>}
|
|
23
|
+
*/
|
|
24
|
+
return function follow(userID, shouldFollow, callback) {
|
|
25
|
+
var resolveFunc = function() {};
|
|
26
|
+
var rejectFunc = function() {};
|
|
27
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
28
|
+
resolveFunc = resolve;
|
|
29
|
+
rejectFunc = reject;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (!callback) {
|
|
33
|
+
callback = function(err, data) {
|
|
34
|
+
if (err) return rejectFunc(err);
|
|
35
|
+
resolveFunc(data);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Validation
|
|
40
|
+
if (!userID || typeof userID !== 'string') {
|
|
41
|
+
var error = 'User ID is required and must be a string.';
|
|
42
|
+
log.error('follow', error);
|
|
43
|
+
return callback({ error: error });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (typeof shouldFollow !== 'boolean') {
|
|
47
|
+
var error2 = 'shouldFollow must be a boolean (true/false).';
|
|
48
|
+
log.error('follow', error2);
|
|
49
|
+
return callback({ error: error2 });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
var form;
|
|
53
|
+
|
|
54
|
+
if (shouldFollow) {
|
|
55
|
+
// Follow user
|
|
56
|
+
form = {
|
|
57
|
+
av: ctx.userID,
|
|
58
|
+
fb_api_req_friendly_name: "CometUserFollowMutation",
|
|
59
|
+
fb_api_caller_class: "RelayModern",
|
|
60
|
+
doc_id: "25472099855769847",
|
|
61
|
+
variables: JSON.stringify({
|
|
62
|
+
input: {
|
|
63
|
+
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start,1717249218695,723451,250100865708545,,",
|
|
64
|
+
is_tracking_encrypted: true,
|
|
65
|
+
subscribe_location: "PROFILE",
|
|
66
|
+
subscribee_id: userID,
|
|
67
|
+
tracking: null,
|
|
68
|
+
actor_id: ctx.userID,
|
|
69
|
+
client_mutation_id: "1"
|
|
70
|
+
},
|
|
71
|
+
scale: 1
|
|
72
|
+
})
|
|
73
|
+
};
|
|
74
|
+
} else {
|
|
75
|
+
// Unfollow user
|
|
76
|
+
form = {
|
|
77
|
+
av: ctx.userID,
|
|
78
|
+
fb_api_req_friendly_name: "CometUserUnfollowMutation",
|
|
79
|
+
fb_api_caller_class: "RelayModern",
|
|
80
|
+
doc_id: "25472099855769847",
|
|
81
|
+
variables: JSON.stringify({
|
|
82
|
+
action_render_location: "WWW_COMET_FRIEND_MENU",
|
|
83
|
+
input: {
|
|
84
|
+
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,tap_search_bar,1717294006136,602597,250100865708545,,",
|
|
85
|
+
is_tracking_encrypted: true,
|
|
86
|
+
subscribe_location: "PROFILE",
|
|
87
|
+
tracking: null,
|
|
88
|
+
unsubscribee_id: userID,
|
|
89
|
+
actor_id: ctx.userID,
|
|
90
|
+
client_mutation_id: "10"
|
|
91
|
+
},
|
|
92
|
+
scale: 1
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
defaultFuncs
|
|
98
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
99
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
100
|
+
.then(function(res) {
|
|
101
|
+
if (res.errors) {
|
|
102
|
+
throw res.errors[0];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
log.info('follow', (shouldFollow ? 'Followed' : 'Unfollowed') + ' user: ' + userID);
|
|
106
|
+
callback(null, {
|
|
107
|
+
success: true,
|
|
108
|
+
action: shouldFollow ? 'followed' : 'unfollowed',
|
|
109
|
+
userID: userID
|
|
110
|
+
});
|
|
111
|
+
})
|
|
112
|
+
.catch(function(err) {
|
|
113
|
+
log.error('follow', err);
|
|
114
|
+
callback(err);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return returnPromise;
|
|
118
|
+
};
|
|
119
|
+
};
|
package/src/forwardAttachment.js
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
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 forwardAttachment(attachmentID, userOrUsers, 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
|
-
if (!callback) {
|
|
15
|
-
callback = function (err) {
|
|
16
|
-
if (err) return rejectFunc(err);
|
|
17
|
-
resolveFunc();
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
var form = {
|
|
22
|
-
attachment_id: attachmentID
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
if (utils.getType(userOrUsers) !== "Array") userOrUsers = [userOrUsers];
|
|
26
|
-
|
|
27
|
-
var timestamp = Math.floor(Date.now() / 1000);
|
|
28
|
-
|
|
29
|
-
//That's good, the key of the array is really timestmap in seconds + index
|
|
30
|
-
//Probably time when the attachment will be sent?
|
|
31
|
-
for (var i = 0; i < userOrUsers.length; i++) form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
|
|
32
|
-
|
|
33
|
-
defaultFuncs
|
|
34
|
-
.post("https://www.facebook.com/mercury/attachments/forward/", ctx.jar, form)
|
|
35
|
-
.then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
|
|
36
|
-
.then(function (resData) {
|
|
37
|
-
if (resData.error) throw resData;
|
|
38
|
-
|
|
39
|
-
return callback();
|
|
40
|
-
})
|
|
41
|
-
.catch(function (err) {
|
|
42
|
-
log.error("forwardAttachment", err);
|
|
43
|
-
return callback(err);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
return returnPromise;
|
|
47
|
-
};
|
|
48
|
-
};
|
|
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 forwardAttachment(attachmentID, userOrUsers, 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
|
+
if (!callback) {
|
|
15
|
+
callback = function (err) {
|
|
16
|
+
if (err) return rejectFunc(err);
|
|
17
|
+
resolveFunc();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
var form = {
|
|
22
|
+
attachment_id: attachmentID
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
if (utils.getType(userOrUsers) !== "Array") userOrUsers = [userOrUsers];
|
|
26
|
+
|
|
27
|
+
var timestamp = Math.floor(Date.now() / 1000);
|
|
28
|
+
|
|
29
|
+
//That's good, the key of the array is really timestmap in seconds + index
|
|
30
|
+
//Probably time when the attachment will be sent?
|
|
31
|
+
for (var i = 0; i < userOrUsers.length; i++) form["recipient_map[" + (timestamp + i) + "]"] = userOrUsers[i];
|
|
32
|
+
|
|
33
|
+
defaultFuncs
|
|
34
|
+
.post("https://www.facebook.com/mercury/attachments/forward/", ctx.jar, form)
|
|
35
|
+
.then(utils.parseAndCheckLogin(ctx.jar, defaultFuncs))
|
|
36
|
+
.then(function (resData) {
|
|
37
|
+
if (resData.error) throw resData;
|
|
38
|
+
|
|
39
|
+
return callback();
|
|
40
|
+
})
|
|
41
|
+
.catch(function (err) {
|
|
42
|
+
log.error("forwardAttachment", err);
|
|
43
|
+
return callback(err);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return returnPromise;
|
|
47
|
+
};
|
|
48
|
+
};
|
package/src/friend.js
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Friend API Module
|
|
5
|
+
* Manage friend requests, friend list, and friend suggestions
|
|
6
|
+
*
|
|
7
|
+
* @author Priyansh Rajput
|
|
8
|
+
* @github https://github.com/priyanshufsdev
|
|
9
|
+
* @license MIT
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
var utils = require("../utils");
|
|
13
|
+
var log = require("npmlog");
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Format friends data from GraphQL response
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
function formatFriends(data, type) {
|
|
20
|
+
var viewer = data?.data?.viewer;
|
|
21
|
+
var edges;
|
|
22
|
+
|
|
23
|
+
if (type === 'requests' && viewer?.friend_requests?.edges) {
|
|
24
|
+
edges = viewer.friend_requests.edges;
|
|
25
|
+
} else if (type === 'suggestions' && viewer?.people_you_may_know?.edges) {
|
|
26
|
+
edges = viewer.people_you_may_know.edges;
|
|
27
|
+
} else if (type === 'list' && data?.data?.node?.all_collections?.nodes[0]?.style_renderer?.collection?.pageItems?.edges) {
|
|
28
|
+
edges = data.data.node.all_collections.nodes[0].style_renderer.collection.pageItems.edges;
|
|
29
|
+
} else {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return edges.map(function(edge) {
|
|
34
|
+
var node = edge.node;
|
|
35
|
+
return {
|
|
36
|
+
userID: node.id || node.node?.id,
|
|
37
|
+
name: node.name || node.title?.text,
|
|
38
|
+
profilePicture: node.profile_picture?.uri || node.image?.uri,
|
|
39
|
+
socialContext: node.social_context?.text || node.subtitle_text?.text,
|
|
40
|
+
url: node.url
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = function(defaultFuncs, api, ctx) {
|
|
46
|
+
|
|
47
|
+
var friendModule = {
|
|
48
|
+
/**
|
|
49
|
+
* Get pending friend requests
|
|
50
|
+
* @param {function} callback - Optional callback
|
|
51
|
+
* @returns {Promise<Array>}
|
|
52
|
+
*/
|
|
53
|
+
requests: function(callback) {
|
|
54
|
+
var resolveFunc = function() {};
|
|
55
|
+
var rejectFunc = function() {};
|
|
56
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
57
|
+
resolveFunc = resolve;
|
|
58
|
+
rejectFunc = reject;
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!callback) {
|
|
62
|
+
callback = function(err, data) {
|
|
63
|
+
if (err) return rejectFunc(err);
|
|
64
|
+
resolveFunc(data);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var form = {
|
|
69
|
+
av: ctx.userID,
|
|
70
|
+
__user: ctx.userID,
|
|
71
|
+
__a: "1",
|
|
72
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
73
|
+
jazoest: ctx.jazoest,
|
|
74
|
+
lsd: ctx.lsd,
|
|
75
|
+
fb_api_caller_class: "RelayModern",
|
|
76
|
+
fb_api_req_friendly_name: "FriendingCometRootContentQuery",
|
|
77
|
+
variables: JSON.stringify({ scale: 3 }),
|
|
78
|
+
doc_id: "9103543533085580"
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
defaultFuncs
|
|
82
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
|
|
83
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
84
|
+
.then(function(res) {
|
|
85
|
+
if (res.errors) throw new Error(JSON.stringify(res.errors));
|
|
86
|
+
var formatted = formatFriends(res, 'requests');
|
|
87
|
+
log.info('friend.requests', 'Found ' + formatted.length + ' friend requests');
|
|
88
|
+
callback(null, formatted);
|
|
89
|
+
})
|
|
90
|
+
.catch(function(err) {
|
|
91
|
+
log.error('friend.requests', err);
|
|
92
|
+
callback(err);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return returnPromise;
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Accept a friend request
|
|
100
|
+
* @param {string} identifier - User ID or name
|
|
101
|
+
* @param {function} callback - Optional callback
|
|
102
|
+
* @returns {Promise<object>}
|
|
103
|
+
*/
|
|
104
|
+
accept: function(identifier, callback) {
|
|
105
|
+
var resolveFunc = function() {};
|
|
106
|
+
var rejectFunc = function() {};
|
|
107
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
108
|
+
resolveFunc = resolve;
|
|
109
|
+
rejectFunc = reject;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
if (!callback) {
|
|
113
|
+
callback = function(err, data) {
|
|
114
|
+
if (err) return rejectFunc(err);
|
|
115
|
+
resolveFunc(data);
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (!identifier) {
|
|
120
|
+
return callback({ error: "A name or user ID is required." });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
var targetUserID = identifier;
|
|
124
|
+
|
|
125
|
+
// If identifier is not a number, search in requests
|
|
126
|
+
if (isNaN(identifier)) {
|
|
127
|
+
friendModule.requests(function(err, requests) {
|
|
128
|
+
if (err) return callback(err);
|
|
129
|
+
|
|
130
|
+
var found = requests.find(function(req) {
|
|
131
|
+
return req.name.toLowerCase().includes(identifier.toLowerCase());
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (!found) {
|
|
135
|
+
return callback({ error: 'Could not find any friend request matching "' + identifier + '".' });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
acceptRequest(found.userID, callback);
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
acceptRequest(targetUserID, callback);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function acceptRequest(userID, cb) {
|
|
145
|
+
var variables = {
|
|
146
|
+
input: {
|
|
147
|
+
friend_requester_id: userID,
|
|
148
|
+
friending_channel: "FRIENDS_HOME_MAIN",
|
|
149
|
+
actor_id: ctx.userID,
|
|
150
|
+
client_mutation_id: Math.floor(Math.random() * 10 + 1).toString()
|
|
151
|
+
},
|
|
152
|
+
scale: 3
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
var form = {
|
|
156
|
+
av: ctx.userID,
|
|
157
|
+
__user: ctx.userID,
|
|
158
|
+
__a: "1",
|
|
159
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
160
|
+
jazoest: ctx.jazoest,
|
|
161
|
+
lsd: ctx.lsd,
|
|
162
|
+
fb_api_caller_class: "RelayModern",
|
|
163
|
+
fb_api_req_friendly_name: "FriendingCometFriendRequestConfirmMutation",
|
|
164
|
+
variables: JSON.stringify(variables),
|
|
165
|
+
doc_id: "24630768433181357"
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
defaultFuncs
|
|
169
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
|
|
170
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
171
|
+
.then(function(res) {
|
|
172
|
+
if (res.errors) throw new Error(JSON.stringify(res.errors));
|
|
173
|
+
log.info('friend.accept', 'Accepted friend request from: ' + userID);
|
|
174
|
+
cb(null, res.data);
|
|
175
|
+
})
|
|
176
|
+
.catch(function(err) {
|
|
177
|
+
log.error('friend.accept', err);
|
|
178
|
+
cb(err);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return returnPromise;
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Get friend list
|
|
187
|
+
* @param {string} userID - Optional user ID (defaults to current user)
|
|
188
|
+
* @param {function} callback - Optional callback
|
|
189
|
+
* @returns {Promise<Array>}
|
|
190
|
+
*/
|
|
191
|
+
list: function(userID, callback) {
|
|
192
|
+
var resolveFunc = function() {};
|
|
193
|
+
var rejectFunc = function() {};
|
|
194
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
195
|
+
resolveFunc = resolve;
|
|
196
|
+
rejectFunc = reject;
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Handle optional userID parameter
|
|
200
|
+
if (typeof userID === 'function') {
|
|
201
|
+
callback = userID;
|
|
202
|
+
userID = ctx.userID;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
userID = userID || ctx.userID;
|
|
206
|
+
|
|
207
|
+
if (!callback) {
|
|
208
|
+
callback = function(err, data) {
|
|
209
|
+
if (err) return rejectFunc(err);
|
|
210
|
+
resolveFunc(data);
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
var sectionToken = Buffer.from('app_section:' + userID + ':2356318349').toString('base64');
|
|
215
|
+
var variables = {
|
|
216
|
+
collectionToken: null,
|
|
217
|
+
scale: 2,
|
|
218
|
+
sectionToken: sectionToken,
|
|
219
|
+
useDefaultActor: false,
|
|
220
|
+
userID: userID
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
var form = {
|
|
224
|
+
av: ctx.userID,
|
|
225
|
+
__user: ctx.userID,
|
|
226
|
+
__a: "1",
|
|
227
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
228
|
+
jazoest: ctx.jazoest,
|
|
229
|
+
lsd: ctx.lsd,
|
|
230
|
+
fb_api_caller_class: "RelayModern",
|
|
231
|
+
fb_api_req_friendly_name: "ProfileCometTopAppSectionQuery",
|
|
232
|
+
variables: JSON.stringify(variables),
|
|
233
|
+
doc_id: "24492266383698794"
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
defaultFuncs
|
|
237
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
|
|
238
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
239
|
+
.then(function(res) {
|
|
240
|
+
if (res.errors) throw new Error(JSON.stringify(res.errors));
|
|
241
|
+
var formatted = formatFriends(res, 'list');
|
|
242
|
+
log.info('friend.list', 'Found ' + formatted.length + ' friends for user: ' + userID);
|
|
243
|
+
callback(null, formatted);
|
|
244
|
+
})
|
|
245
|
+
.catch(function(err) {
|
|
246
|
+
log.error('friend.list', err);
|
|
247
|
+
callback(err);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
return returnPromise;
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Friend suggestions module
|
|
255
|
+
*/
|
|
256
|
+
suggest: {
|
|
257
|
+
/**
|
|
258
|
+
* Get friend suggestions (People You May Know)
|
|
259
|
+
* @param {number} limit - Max number of suggestions
|
|
260
|
+
* @param {function} callback - Optional callback
|
|
261
|
+
* @returns {Promise<Array>}
|
|
262
|
+
*/
|
|
263
|
+
list: function(limit, callback) {
|
|
264
|
+
var resolveFunc = function() {};
|
|
265
|
+
var rejectFunc = function() {};
|
|
266
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
267
|
+
resolveFunc = resolve;
|
|
268
|
+
rejectFunc = reject;
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Handle optional limit parameter
|
|
272
|
+
if (typeof limit === 'function') {
|
|
273
|
+
callback = limit;
|
|
274
|
+
limit = 30;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
limit = limit || 30;
|
|
278
|
+
|
|
279
|
+
if (!callback) {
|
|
280
|
+
callback = function(err, data) {
|
|
281
|
+
if (err) return rejectFunc(err);
|
|
282
|
+
resolveFunc(data);
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
var form = {
|
|
287
|
+
av: ctx.userID,
|
|
288
|
+
__user: ctx.userID,
|
|
289
|
+
__a: "1",
|
|
290
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
291
|
+
jazoest: ctx.jazoest,
|
|
292
|
+
lsd: ctx.lsd,
|
|
293
|
+
fb_api_caller_class: "RelayModern",
|
|
294
|
+
fb_api_req_friendly_name: "FriendingCometPYMKPanelPaginationQuery",
|
|
295
|
+
variables: JSON.stringify({ count: limit, cursor: null, scale: 3 }),
|
|
296
|
+
doc_id: "9917809191634193"
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
defaultFuncs
|
|
300
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
|
|
301
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
302
|
+
.then(function(res) {
|
|
303
|
+
if (res.errors) throw new Error(JSON.stringify(res.errors));
|
|
304
|
+
var formatted = formatFriends(res, 'suggestions');
|
|
305
|
+
log.info('friend.suggest.list', 'Found ' + formatted.length + ' suggestions');
|
|
306
|
+
callback(null, formatted);
|
|
307
|
+
})
|
|
308
|
+
.catch(function(err) {
|
|
309
|
+
log.error('friend.suggest.list', err);
|
|
310
|
+
callback(err);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
return returnPromise;
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Send friend request
|
|
318
|
+
* @param {string} userID - User ID to send request to
|
|
319
|
+
* @param {function} callback - Optional callback
|
|
320
|
+
* @returns {Promise<object>}
|
|
321
|
+
*/
|
|
322
|
+
request: function(userID, callback) {
|
|
323
|
+
var resolveFunc = function() {};
|
|
324
|
+
var rejectFunc = function() {};
|
|
325
|
+
var returnPromise = new Promise(function(resolve, reject) {
|
|
326
|
+
resolveFunc = resolve;
|
|
327
|
+
rejectFunc = reject;
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
if (!callback) {
|
|
331
|
+
callback = function(err, data) {
|
|
332
|
+
if (err) return rejectFunc(err);
|
|
333
|
+
resolveFunc(data);
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
if (!userID) {
|
|
338
|
+
return callback({ error: "userID is required." });
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
var variables = {
|
|
342
|
+
input: {
|
|
343
|
+
friend_requestee_ids: [userID],
|
|
344
|
+
friending_channel: "FRIENDS_HOME_MAIN",
|
|
345
|
+
actor_id: ctx.userID,
|
|
346
|
+
client_mutation_id: Math.floor(Math.random() * 10 + 1).toString()
|
|
347
|
+
},
|
|
348
|
+
scale: 3
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
var form = {
|
|
352
|
+
av: ctx.userID,
|
|
353
|
+
__user: ctx.userID,
|
|
354
|
+
__a: "1",
|
|
355
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
356
|
+
jazoest: ctx.jazoest,
|
|
357
|
+
lsd: ctx.lsd,
|
|
358
|
+
fb_api_caller_class: "RelayModern",
|
|
359
|
+
fb_api_req_friendly_name: "FriendingCometFriendRequestSendMutation",
|
|
360
|
+
variables: JSON.stringify(variables),
|
|
361
|
+
doc_id: "23982103144788355"
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
defaultFuncs
|
|
365
|
+
.post("https://www.facebook.com/api/graphql/", ctx.jar, form, {})
|
|
366
|
+
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
367
|
+
.then(function(res) {
|
|
368
|
+
if (res.errors) throw new Error(JSON.stringify(res.errors));
|
|
369
|
+
log.info('friend.suggest.request', 'Sent friend request to: ' + userID);
|
|
370
|
+
callback(null, res.data);
|
|
371
|
+
})
|
|
372
|
+
.catch(function(err) {
|
|
373
|
+
log.error('friend.suggest.request', err);
|
|
374
|
+
callback(err);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
return returnPromise;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
return friendModule;
|
|
383
|
+
};
|
package/src/getAccessToken.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
/* eslint-disable linebreak-style */
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
5
|
-
return function getAccessToken(callback) {
|
|
6
|
-
var resolveFunc = function () { };
|
|
7
|
-
var rejectFunc = function () { };
|
|
8
|
-
var returnPromise = new Promise(function (resolve, reject) {
|
|
9
|
-
resolveFunc = resolve;
|
|
10
|
-
rejectFunc = reject;
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
if (!callback) {
|
|
14
|
-
callback = function (err, userInfo) {
|
|
15
|
-
if (err) return rejectFunc(err);
|
|
16
|
-
resolveFunc(userInfo);
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
var { getAccessToken } = require('../Extra/ExtraAddons');
|
|
21
|
-
getAccessToken(ctx.jar,ctx,defaultFuncs).then(data => callback(null,data));
|
|
22
|
-
}
|
|
23
|
-
catch (e) {
|
|
24
|
-
callback(null, e);
|
|
25
|
-
}
|
|
26
|
-
return returnPromise;
|
|
27
|
-
};
|
|
1
|
+
/* eslint-disable linebreak-style */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
5
|
+
return function getAccessToken(callback) {
|
|
6
|
+
var resolveFunc = function () { };
|
|
7
|
+
var rejectFunc = function () { };
|
|
8
|
+
var returnPromise = new Promise(function (resolve, reject) {
|
|
9
|
+
resolveFunc = resolve;
|
|
10
|
+
rejectFunc = reject;
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
if (!callback) {
|
|
14
|
+
callback = function (err, userInfo) {
|
|
15
|
+
if (err) return rejectFunc(err);
|
|
16
|
+
resolveFunc(userInfo);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
var { getAccessToken } = require('../Extra/ExtraAddons');
|
|
21
|
+
getAccessToken(ctx.jar,ctx,defaultFuncs).then(data => callback(null,data));
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
callback(null, e);
|
|
25
|
+
}
|
|
26
|
+
return returnPromise;
|
|
27
|
+
};
|
|
28
28
|
};
|
package/src/getCurrentUserID.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
4
|
-
return function getCurrentUserID() {
|
|
5
|
-
return ctx.userID;
|
|
6
|
-
};
|
|
7
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
module.exports = function (defaultFuncs, api, ctx) {
|
|
4
|
+
return function getCurrentUserID() {
|
|
5
|
+
return ctx.userID;
|
|
6
|
+
};
|
|
7
|
+
};
|