@cexy/hoonfca 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.travis.yml +6 -0
- package/LICENSE-MIT +21 -0
- package/index.d.ts +620 -0
- package/index.js +745 -433
- package/package.json +45 -6
- package/src/addExternalModule.js +14 -16
- package/src/addUserToGroup.js +45 -30
- package/src/changeAdminStatus.js +39 -42
- package/src/changeApprovalMode.js +79 -0
- package/src/changeArchivedStatus.js +19 -15
- package/src/changeBio.js +18 -16
- package/src/changeBlockedStatus.js +14 -12
- package/src/changeBlockedStatusMqtt.js +38 -17
- package/src/changeGroupImage.js +100 -77
- package/src/changeNickname.js +12 -11
- package/src/changeThreadColor.js +25 -16
- package/src/changeThreadEmoji.js +11 -10
- package/src/createNewGroup.js +21 -14
- package/src/createPoll.js +87 -21
- package/src/deleteMessage.js +18 -17
- package/src/deleteThread.js +18 -17
- package/src/editMessage.js +28 -31
- package/src/forwardAttachment.js +22 -19
- package/src/forwardMessage.js +63 -0
- package/src/getCurrentUserID.js +4 -2
- package/src/getEmojiUrl.js +20 -9
- package/src/getFriendsList.js +21 -18
- package/src/getGroupsList.js +83 -0
- package/src/getMarketplace.js +84 -0
- package/src/getNotifications.js +86 -0
- package/src/getPagesList.js +83 -0
- package/src/getStories.js +88 -0
- package/src/getThreadHistory.js +277 -126
- package/src/getThreadInfo.js +143 -115
- package/src/getThreadList.js +216 -143
- package/src/getThreadPictures.js +26 -32
- package/src/getUserID.js +13 -14
- package/src/getUserInfo.js +107 -68
- package/src/handleFriendRequest.js +16 -15
- package/src/handleMessageRequest.js +15 -15
- package/src/httpGet.js +36 -31
- package/src/httpPost.js +36 -31
- package/src/listenMqtt.js +705 -370
- package/src/logout.js +26 -28
- package/src/markAsDelivered.js +22 -17
- package/src/markAsRead.js +63 -49
- package/src/markAsReadAll.js +17 -13
- package/src/markAsSeen.js +23 -19
- package/src/muteThread.js +17 -14
- package/src/pinMessage.js +23 -22
- package/src/removeUserFromGroup.js +42 -22
- package/src/resolvePhotoUrl.js +15 -17
- package/src/searchForThread.js +18 -20
- package/src/searchUsers.js +89 -0
- package/src/sendComment.js +161 -0
- package/src/sendMessage.js +65 -52
- package/src/sendTypingIndicator.js +173 -48
- package/src/setBio.js +86 -0
- package/src/setMessageReaction.js +76 -16
- package/src/setPostReaction.js +29 -61
- package/src/setTheme.js +313 -0
- package/src/setTitle.js +27 -37
- package/src/shareContact.js +34 -82
- package/src/shareLink.js +56 -99
- package/src/threadColors.js +35 -97
- package/src/unfriend.js +15 -20
- package/src/unsendMessage.js +71 -18
- package/utils.js +1000 -472
- package/README.md +0 -83
- package/replit.nix +0 -3
- package/src/changeAvatar.js +0 -89
- package/src/changeCover.js +0 -92
- package/src/changeName.js +0 -106
- package/src/changeUsername.js +0 -80
- package/src/createCommentPost.js +0 -196
- package/src/createPost.js +0 -285
- package/src/data/getThreadInfo.json +0 -1
- package/src/follow.js +0 -71
- package/src/getAccess.js +0 -130
- package/src/getAvatarUser.js +0 -88
- package/src/getBotInitialData.js +0 -59
- package/src/getCtx.js +0 -5
- package/src/getMessage.js +0 -827
- package/src/getOptions.js +0 -5
- package/src/getRegion.js +0 -7
- package/src/getThreadHistoryDeprecated.js +0 -95
- package/src/getThreadInfoDeprecated.js +0 -77
- package/src/getThreadListDeprecated.js +0 -86
- package/src/httpPostFormData.js +0 -58
- package/src/listenNotification.js +0 -96
- package/src/refreshFb_dtsg.js +0 -75
- package/src/searchStickers.js +0 -59
- package/src/sendMessageMqtt.js +0 -326
- package/src/setMessageReactionMqtt.js +0 -74
- package/src/setProfileGuard.js +0 -66
- package/src/setStoryReaction.js +0 -97
- package/src/stopListenMqtt.js +0 -47
- package/src/uploadAttachment.js +0 -98
package/src/createPost.js
DELETED
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
|
|
7
|
-
// মিডিয়া বা ইমেজ আপলোড হ্যান্ডেল করার ফাংশন
|
|
8
|
-
function handleUpload(msg, form) {
|
|
9
|
-
let cb;
|
|
10
|
-
const rt = new Promise((resolve, reject) => {
|
|
11
|
-
cb = error => error ? reject(error) : resolve();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
if (!msg.attachment) {
|
|
15
|
-
cb();
|
|
16
|
-
} else {
|
|
17
|
-
msg.attachment = Array.isArray(msg.attachment) ? msg.attachment : [msg.attachment];
|
|
18
|
-
const uploads = [];
|
|
19
|
-
|
|
20
|
-
for (const attachment of msg.attachment) {
|
|
21
|
-
if (!utils.isReadableStream(attachment)) {
|
|
22
|
-
cb("Attachment should be a readable stream, not " + utils.getType(attachment)); // বাগ ফিক্স
|
|
23
|
-
return rt;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const vari = {
|
|
27
|
-
source: 8,
|
|
28
|
-
profile_id: ctx.userID,
|
|
29
|
-
waterfallxapp: "comet",
|
|
30
|
-
farr: attachment,
|
|
31
|
-
upload_id: "jsc_c_6"
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const main = defaultFuncs
|
|
35
|
-
.postFormData("https://upload.facebook.com/ajax/react_composer/attachments/photo/upload", ctx.jar, vari)
|
|
36
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
37
|
-
.then(res => {
|
|
38
|
-
if (res.error || res.errors) throw res;
|
|
39
|
-
return res.payload;
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
uploads.push(main);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
Promise.all(uploads)
|
|
46
|
-
.then(res => {
|
|
47
|
-
for (const payload of res) {
|
|
48
|
-
if (!payload) break;
|
|
49
|
-
form.input.attachments.push({
|
|
50
|
-
photo: { id: payload.photoID }
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return cb();
|
|
54
|
-
})
|
|
55
|
-
.catch(cb);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return rt;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// URL লিংক প্রিভিউ হ্যান্ডেল করার ফাংশน
|
|
62
|
-
function handleUrl(msg, form) {
|
|
63
|
-
let cb;
|
|
64
|
-
const rt = new Promise((resolve, reject) => {
|
|
65
|
-
cb = error => error ? reject(error) : resolve();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
if (!msg.url) {
|
|
69
|
-
cb();
|
|
70
|
-
} else {
|
|
71
|
-
const vari = {
|
|
72
|
-
feedLocation: "FEED_COMPOSER",
|
|
73
|
-
focusCommentID: null,
|
|
74
|
-
goodwillCampaignId: "",
|
|
75
|
-
goodwillCampaignMediaIds: [],
|
|
76
|
-
goodwillContentType: null,
|
|
77
|
-
params: { url: msg.url },
|
|
78
|
-
privacySelectorRenderLocation: "COMET_COMPOSER",
|
|
79
|
-
renderLocation: "composer_preview",
|
|
80
|
-
parentStoryID: null,
|
|
81
|
-
scale: 1,
|
|
82
|
-
useDefaultActor: false,
|
|
83
|
-
shouldIncludeStoryAttachment: false,
|
|
84
|
-
__relay_internal__pv__IsWorkUserrelayprovider: false,
|
|
85
|
-
__relay_internal__pv__IsMergQAPollsrelayprovider: false
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
defaultFuncs
|
|
89
|
-
.post("https://www.facebook.com/api/graphql/", ctx.jar, {
|
|
90
|
-
fb_api_req_friendly_name: "ComposerLinkAttachmentPreviewQuery",
|
|
91
|
-
variables: JSON.stringify(vari),
|
|
92
|
-
server_timestamps: true,
|
|
93
|
-
doc_id: 6549975235094234
|
|
94
|
-
})
|
|
95
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
96
|
-
.then(res => {
|
|
97
|
-
const resData = (res[0] || res).data.link_preview;
|
|
98
|
-
if (JSON.parse(resData.share_scrape_data).share_type === 400) {
|
|
99
|
-
throw { error: "url is not accepted" };
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
form.input.attachments.push({
|
|
103
|
-
link: { share_scrape_data: resData.share_scrape_data }
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
return cb();
|
|
107
|
-
})
|
|
108
|
-
.catch(cb);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return rt;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// মেনশন হ্যান্ডেল করার ফাংশন (বাগ ফিক্স করা হয়েছে)
|
|
115
|
-
function handleMention(msg, form) {
|
|
116
|
-
if (!msg.mentions) return Promise.resolve();
|
|
117
|
-
|
|
118
|
-
msg.mentions = Array.isArray(msg.mentions) ? msg.mentions : [msg.mentions];
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
for (const mention of msg.mentions) {
|
|
122
|
-
const { id, tag, fromIndex } = mention;
|
|
123
|
-
|
|
124
|
-
if (typeof tag !== "string") throw new Error("Mention tag must be string");
|
|
125
|
-
if (!id) throw new Error("id must be string");
|
|
126
|
-
|
|
127
|
-
const offset = msg.body.indexOf(tag, fromIndex || 0);
|
|
128
|
-
if (offset < 0) throw new Error(`Mention for "${tag}" not found in message string.`);
|
|
129
|
-
|
|
130
|
-
form.input.message.ranges.push({
|
|
131
|
-
entity: { id },
|
|
132
|
-
length: tag.length,
|
|
133
|
-
offset
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
return Promise.resolve();
|
|
137
|
-
} catch (err) {
|
|
138
|
-
return Promise.reject(err);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// পোস্ট সাবমিট করার গ্রাফকিউএল ফাংশন
|
|
143
|
-
function createContent(vari) {
|
|
144
|
-
let cb;
|
|
145
|
-
const rt = new Promise((resolve, reject) => {
|
|
146
|
-
cb = (error, postData) => error ? reject(error) : resolve(postData);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const form = {
|
|
150
|
-
fb_api_req_friendly_name: "ComposerStoryCreateMutation",
|
|
151
|
-
variables: JSON.stringify(vari),
|
|
152
|
-
server_timestamps: true,
|
|
153
|
-
doc_id: 6255089511280268
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
defaultFuncs
|
|
157
|
-
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
158
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
159
|
-
.then(res => cb(null, res))
|
|
160
|
-
.catch(cb);
|
|
161
|
-
|
|
162
|
-
return rt;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return function createPost(msg, callback) {
|
|
166
|
-
let cb;
|
|
167
|
-
const rt = new Promise((resolve, reject) => {
|
|
168
|
-
cb = (error, url) => url ? resolve(url) : reject(error);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
if (typeof msg === "function") {
|
|
172
|
-
const error = "Msg must be a string or object and not function";
|
|
173
|
-
utils.error("createPost", error);
|
|
174
|
-
msg(error);
|
|
175
|
-
return rt;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (typeof callback === "function") {
|
|
179
|
-
cb = callback;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const typeMsg = utils.getType(msg);
|
|
183
|
-
if (!["Object", "String"].includes(typeMsg)) {
|
|
184
|
-
const error = "Msg must be a string or object and not " + typeMsg;
|
|
185
|
-
utils.error("createPost", error);
|
|
186
|
-
cb(error);
|
|
187
|
-
return rt;
|
|
188
|
-
} else if (typeMsg === "String") {
|
|
189
|
-
msg = { body: msg };
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
msg.allowUserID = msg.allowUserID ? (!Array.isArray(msg.allowUserID) ? [msg.allowUserID] : msg.allowUserID) : null;
|
|
193
|
-
|
|
194
|
-
const sessionID = utils.getGUID();
|
|
195
|
-
const base = ["EVERYONE", "FRIENDS", "SELF"];
|
|
196
|
-
|
|
197
|
-
// মেইন ফর্ম কনফিগারেশন
|
|
198
|
-
const form = {
|
|
199
|
-
input: {
|
|
200
|
-
composer_entry_point: !msg.groupID && msg.url ? "share_modal" : "inline_composer",
|
|
201
|
-
composer_source_surface: !msg.groupID && msg.url ? "feed_story" : msg.groupID ? "group" : "timeline",
|
|
202
|
-
composer_type: !msg.groupID && msg.url ? "share" : msg.groupID ? "group" : "timeline",
|
|
203
|
-
idempotence_token: sessionID + "_FEED",
|
|
204
|
-
source: "WWW",
|
|
205
|
-
attachments: [],
|
|
206
|
-
audience: msg.groupID ? { to_id: msg.groupID } : {
|
|
207
|
-
privacy: {
|
|
208
|
-
allow: msg.allowUserID ? msg.allowUserID : [],
|
|
209
|
-
base_state: msg.allowUserID && msg.allowUserID.length > 0 ? base[2] : (base[msg.baseState - 1] || base[0]),
|
|
210
|
-
deny: [],
|
|
211
|
-
tag_expansion_state: "UNSPECIFIED"
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
message: {
|
|
215
|
-
ranges: [],
|
|
216
|
-
text: msg.body ? (typeof msg.body === "object" ? JSON.stringify(msg.body, null, 2) : msg.body) : ""
|
|
217
|
-
},
|
|
218
|
-
with_tags_ids: [],
|
|
219
|
-
inline_activities: [],
|
|
220
|
-
explicit_place_id: 0,
|
|
221
|
-
text_format_preset_id: 0,
|
|
222
|
-
logging: { composer_session_id: sessionID },
|
|
223
|
-
navigation_data: {
|
|
224
|
-
attribution_id_v2: msg.groupID
|
|
225
|
-
? "CometGroupDiscussionRoot.react,comet.group,tap_search_bar," + Date.now() + ",909538,2361831622,"
|
|
226
|
-
: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start," + Date.now() + ",796829,190055527696468,"
|
|
227
|
-
},
|
|
228
|
-
is_tracking_encrypted: !!msg.url,
|
|
229
|
-
tracking: [],
|
|
230
|
-
event_share_metadata: { surface: "newsfeed" },
|
|
231
|
-
actor_id: ctx.globalOptions.pageID || ctx.userID,
|
|
232
|
-
client_mutation_id: Math.round(Math.random() * 19).toString()
|
|
233
|
-
},
|
|
234
|
-
displayCommentsFeedbackContext: null,
|
|
235
|
-
displayCommentsContextEnableComment: null,
|
|
236
|
-
displayCommentsContextIsAdPreview: null,
|
|
237
|
-
displayCommentsContextIsAggregatedShare: null,
|
|
238
|
-
displayCommentsContextIsStorySet: null,
|
|
239
|
-
feedLocation: msg.groupID ? "GROUP" : "TIMELINE",
|
|
240
|
-
feedbackSource: 0,
|
|
241
|
-
focusCommentID: null,
|
|
242
|
-
gridMediaWidth: 230,
|
|
243
|
-
groupID: null,
|
|
244
|
-
scale: 1,
|
|
245
|
-
privacySelectorRenderLocation: "COMET_STREAM",
|
|
246
|
-
renderLocation: msg.groupID ? "group" : "timeline",
|
|
247
|
-
useDefaultActor: false,
|
|
248
|
-
inviteShortLinkKey: null,
|
|
249
|
-
isFeed: false,
|
|
250
|
-
isFundraiser: false,
|
|
251
|
-
isFunFactPost: false,
|
|
252
|
-
isGroup: !!msg.groupID,
|
|
253
|
-
isEvent: false,
|
|
254
|
-
isTimeline: !msg.groupID,
|
|
255
|
-
isSocialLearning: false,
|
|
256
|
-
isPageNewsFeed: !!ctx.globalOptions.pageID,
|
|
257
|
-
isProfileReviews: false,
|
|
258
|
-
isWorkSharedDraft: false,
|
|
259
|
-
UFI2CommentsProvider_commentsKey: msg.groupID ? "CometGroupDiscussionRootSuccessQuery" : "ProfileCometTimelineRoute",
|
|
260
|
-
hashtag: null,
|
|
261
|
-
canUserManageOffers: false,
|
|
262
|
-
__relay_internal__pv__CometUFIIsRTAEnabledrelayprovider: false,
|
|
263
|
-
__relay_internal__pv__IsWorkUserrelayprovider: false,
|
|
264
|
-
__relay_internal__pv__IsMergQAPollsrelayprovider: false,
|
|
265
|
-
__relay_internal__pv__StoriesArmadilloReplyEnabledrelayprovider: false,
|
|
266
|
-
__relay_internal__pv__StoriesRingrelayprovider: false
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
// প্রমিজ চেইনিংয়ের মাধ্যমে পোস্ট প্রসেস সম্পন্ন করা হচ্ছে
|
|
270
|
-
handleUpload(msg, form)
|
|
271
|
-
.then(() => handleUrl(msg, form))
|
|
272
|
-
.then(() => handleMention(msg, form))
|
|
273
|
-
.then(() => createContent(form))
|
|
274
|
-
.then(res => {
|
|
275
|
-
if (res.error || res.errors) throw res;
|
|
276
|
-
return cb(null, (res[0] || res).data.story_create.story.url);
|
|
277
|
-
})
|
|
278
|
-
.catch(err => {
|
|
279
|
-
utils.error("createPost", err);
|
|
280
|
-
return cb(err);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
return rt;
|
|
284
|
-
};
|
|
285
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
package/src/follow.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
return function follow(senderID, boolean, callback) {
|
|
7
|
-
let resolveFunc = () => {};
|
|
8
|
-
let rejectFunc = () => {};
|
|
9
|
-
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
-
resolveFunc = resolve;
|
|
11
|
-
rejectFunc = reject;
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
// কলব্যাক না থাকলে প্রমিজ রিজেক্ট/রিসলভ সেট করা
|
|
15
|
-
if (typeof callback !== "function") {
|
|
16
|
-
callback = (err, data) => {
|
|
17
|
-
if (err) return rejectFunc(err);
|
|
18
|
-
resolveFunc(data);
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// ভেরিয়েবল নির্ধারণ (ফলো বনাম আনফলো লজিক)
|
|
23
|
-
const friendlyName = boolean ? "CometUserFollowMutation" : "CometUserUnfollowMutation";
|
|
24
|
-
const inputPayload = boolean
|
|
25
|
-
? {
|
|
26
|
-
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,via_cold_start,1717249218695,723451,250100865708545,,",
|
|
27
|
-
is_tracking_encrypted: true,
|
|
28
|
-
subscribe_location: "PROFILE",
|
|
29
|
-
subscribee_id: senderID,
|
|
30
|
-
tracking: null,
|
|
31
|
-
actor_id: ctx.userID,
|
|
32
|
-
client_mutation_id: "1",
|
|
33
|
-
}
|
|
34
|
-
: {
|
|
35
|
-
attribution_id_v2: "ProfileCometTimelineListViewRoot.react,comet.profile.timeline.list,tap_search_bar,1717294006136,602597,250100865708545,,",
|
|
36
|
-
is_tracking_encrypted: true,
|
|
37
|
-
subscribe_location: "PROFILE",
|
|
38
|
-
tracking: null,
|
|
39
|
-
unsubscribee_id: senderID,
|
|
40
|
-
actor_id: ctx.userID,
|
|
41
|
-
client_mutation_id: "10",
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const variablesPayload = boolean
|
|
45
|
-
? { input: inputPayload, scale: 1 }
|
|
46
|
-
: { action_render_location: "WWW_COMET_FRIEND_MENU", input: inputPayload, scale: 1 };
|
|
47
|
-
|
|
48
|
-
const form = {
|
|
49
|
-
av: ctx.userID,
|
|
50
|
-
fb_api_req_friendly_name: friendlyName,
|
|
51
|
-
fb_api_caller_class: "RelayModern",
|
|
52
|
-
doc_id: "25472099855769847",
|
|
53
|
-
variables: JSON.stringify(variablesPayload),
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// প্রপার সেশন জারের সাথে ফেসবুক গ্রাফকিউএল-এ রিকোয়েস্ট পাঠানো হচ্ছে
|
|
57
|
-
defaultFuncs
|
|
58
|
-
.post("https://www.facebook.com/api/graphql/", ctx.jar, form)
|
|
59
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
60
|
-
.then((resData) => {
|
|
61
|
-
if (resData.errors) throw resData;
|
|
62
|
-
return callback(null, resData);
|
|
63
|
-
})
|
|
64
|
-
.catch((err) => {
|
|
65
|
-
utils.error("follow", err);
|
|
66
|
-
return callback(err);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
return returnPromise;
|
|
70
|
-
};
|
|
71
|
-
};
|
package/src/getAccess.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
return function getAccess(authCode = "", callback) {
|
|
7
|
-
let cb;
|
|
8
|
-
const url = "https://business.facebook.com/";
|
|
9
|
-
const Referer = url + "security/twofactor/reauth/?twofac_next=" + encodeURIComponent(url + "content_management") + "&type=avoid_bypass&app_id=0&save_device=0";
|
|
10
|
-
|
|
11
|
-
const rt = new Promise((resolve, reject) => {
|
|
12
|
-
cb = (error, token) => (token ? resolve(token) : reject(error));
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
// ইনপুট ওভারলোড হ্যান্ডেল করা হচ্ছে
|
|
16
|
-
if (typeof authCode === "function") {
|
|
17
|
-
callback = authCode;
|
|
18
|
-
authCode = "";
|
|
19
|
-
}
|
|
20
|
-
if (typeof callback === "function") {
|
|
21
|
-
cb = callback;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// অলরেডি টোকেন থাকলে নতুন করে রিকোয়েস্ট না পাঠিয়ে সরাসরি রিটার্ন করা হচ্ছে
|
|
25
|
-
if (ctx.access_token) {
|
|
26
|
-
cb(null, ctx.access_token);
|
|
27
|
-
return rt;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
utils
|
|
31
|
-
.get(url + "content_management", ctx.jar, null, ctx.globalOptions, null, {
|
|
32
|
-
noRef: true,
|
|
33
|
-
Origin: url,
|
|
34
|
-
})
|
|
35
|
-
.then((res) => {
|
|
36
|
-
const html = res.body;
|
|
37
|
-
return utils.getFrom(html, '["LSD",[],{"token":"', '"}');
|
|
38
|
-
})
|
|
39
|
-
.then((lsd) => {
|
|
40
|
-
|
|
41
|
-
// ২FA কোড সাবমিট করার ইন্টারনাল হেল্পার ফাংশন
|
|
42
|
-
function submitCode(code) {
|
|
43
|
-
let pCb;
|
|
44
|
-
const rtPromise = new Promise((resolve) => {
|
|
45
|
-
pCb = (error, token) => resolve(cb(error, token));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
if (typeof code !== "string") {
|
|
49
|
-
pCb({
|
|
50
|
-
error: "submitCode",
|
|
51
|
-
lerror: "code must be string",
|
|
52
|
-
continue: submitCode,
|
|
53
|
-
});
|
|
54
|
-
return rtPromise;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
defaultFuncs
|
|
58
|
-
.post(
|
|
59
|
-
url + "security/twofactor/reauth/enter/",
|
|
60
|
-
ctx.jar,
|
|
61
|
-
{
|
|
62
|
-
approvals_code: code,
|
|
63
|
-
save_device: true,
|
|
64
|
-
lsd,
|
|
65
|
-
},
|
|
66
|
-
ctx.globalOptions,
|
|
67
|
-
null,
|
|
68
|
-
{ Referer, Origin: url }
|
|
69
|
-
)
|
|
70
|
-
.then((res) => {
|
|
71
|
-
const responseText = res.body.split(";").pop() || "{}";
|
|
72
|
-
const { payload } = JSON.parse(responseText);
|
|
73
|
-
|
|
74
|
-
if (payload && !payload.codeConfirmed) {
|
|
75
|
-
throw {
|
|
76
|
-
error: "submitCode",
|
|
77
|
-
lerror: payload.message,
|
|
78
|
-
continue: submitCode,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
return;
|
|
82
|
-
})
|
|
83
|
-
.then(() => {
|
|
84
|
-
return utils.get(url + "content_management", ctx.jar, null, ctx.globalOptions, null, { noRef: true });
|
|
85
|
-
})
|
|
86
|
-
.then((res) => {
|
|
87
|
-
const html = res.body;
|
|
88
|
-
const tokenExec = /"accessToken":"(\S+)","clientID":/g.exec(html);
|
|
89
|
-
return [html, tokenExec];
|
|
90
|
-
})
|
|
91
|
-
.then((res) => {
|
|
92
|
-
if (!res[1]) {
|
|
93
|
-
throw {
|
|
94
|
-
error: "token-undefined",
|
|
95
|
-
htmlData: res[0],
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
ctx.access_token = res[1][1];
|
|
99
|
-
return pCb(null, res[1][1]);
|
|
100
|
-
})
|
|
101
|
-
.catch((err) => {
|
|
102
|
-
utils.error("getAccess", err.error || err);
|
|
103
|
-
return pCb(err);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
return rtPromise;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const codeStr = authCode.toString();
|
|
110
|
-
if (codeStr.length === 6 && !isNaN(codeStr)) {
|
|
111
|
-
submitCode(codeStr);
|
|
112
|
-
} else if (typeof callback === "function") {
|
|
113
|
-
throw {
|
|
114
|
-
error: "submitCode",
|
|
115
|
-
continue: submitCode,
|
|
116
|
-
};
|
|
117
|
-
} else {
|
|
118
|
-
throw {
|
|
119
|
-
error: "authentication code must be string or number or callback must be a function to continue",
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
})
|
|
123
|
-
.catch((err) => {
|
|
124
|
-
utils.error("getAccess", typeof callback === "function" ? err.error || err : err);
|
|
125
|
-
return cb(err);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
return rt;
|
|
129
|
-
};
|
|
130
|
-
};
|
package/src/getAvatarUser.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = function (defaultFuncs, api, ctx) {
|
|
6
|
-
|
|
7
|
-
// ইন্টারনাল হেল্পার ফাংশন: ইউজারের অ্যাভাটার ইউআরএল ফেচ করা
|
|
8
|
-
function handleAvatar(userIDs, height, width) {
|
|
9
|
-
let cb;
|
|
10
|
-
const rtPromise = new Promise((resolve, reject) => {
|
|
11
|
-
cb = (error, data) => (data ? resolve(data) : reject(error));
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
// map() ব্যবহার করে প্রতিটি ইউজারের জন্য গ্রাফ এপিআই রিকোয়েস্ট প্রমিজ তৈরি করা হচ্ছে
|
|
15
|
-
const uploads = userIDs.map((v) => {
|
|
16
|
-
return defaultFuncs
|
|
17
|
-
.get(`https://graph.facebook.com/${v}/picture?height=${height}&width=${width}&redirect=false&access_token=${ctx.access_token}`, ctx.jar)
|
|
18
|
-
.then(utils.parseAndCheckLogin(ctx, defaultFuncs))
|
|
19
|
-
.then((res) => ({
|
|
20
|
-
userID: v,
|
|
21
|
-
url: res?.data?.url || null
|
|
22
|
-
}))
|
|
23
|
-
.catch((err) => {
|
|
24
|
-
// বাগ ফিক্স: কোনো নির্দিষ্ট আইডি এরর খেলে সম্পূর্ণ চেইন ব্রেক না করে নাল রিটার্ন করবে
|
|
25
|
-
utils.error("getAvatarUser [Internal]", `Failed to fetch avatar for ${v}: ${err.message || err}`);
|
|
26
|
-
return { userID: v, url: null };
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Promise.all এর মাধ্যমে সব রিকোয়েস্ট একসাথে এক্সিকিউট করা হচ্ছে
|
|
31
|
-
Promise.all(uploads)
|
|
32
|
-
.then((res) => {
|
|
33
|
-
const resultObj = res.reduce((Obj, { userID, url }) => {
|
|
34
|
-
if (url) Obj[userID] = url; // শুধু ভ্যালিড ইউআরএলগুলো অবজেক্টে যোগ হবে
|
|
35
|
-
return Obj;
|
|
36
|
-
}, {});
|
|
37
|
-
return cb(null, resultObj);
|
|
38
|
-
})
|
|
39
|
-
.catch((err) => cb(err));
|
|
40
|
-
|
|
41
|
-
return rtPromise;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return function getAvatarUser(userIDs, size = [1500, 1500], callback) {
|
|
45
|
-
let cb;
|
|
46
|
-
const rtPromise = new Promise((resolve, reject) => {
|
|
47
|
-
cb = (err, res) => (res ? resolve(res) : reject(err));
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// সাইজ প্যারামিটার ফরম্যাটিং ও ভ্যালিডেশন
|
|
51
|
-
if (typeof size === "string" || typeof size === "number") {
|
|
52
|
-
size = [size, size];
|
|
53
|
-
} else if (Array.isArray(size) && size.length === 1) {
|
|
54
|
-
size = [size[0], size[0]];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (typeof size === "function") {
|
|
58
|
-
callback = size;
|
|
59
|
-
size = [1500, 1500];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (typeof callback === "function") {
|
|
63
|
-
cb = callback;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!Array.isArray(userIDs)) {
|
|
67
|
-
userIDs = [userIDs];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const [height, width] = size;
|
|
71
|
-
|
|
72
|
-
// অ্যাক্সেস টোকেন চেক (EAAB টোকেন ছাড়া গ্রাফ এপিআই কাজ করবে না)
|
|
73
|
-
if (!ctx.access_token) {
|
|
74
|
-
utils.error("getAvatarUser", "Cant get access_token");
|
|
75
|
-
cb("Cant get access_token");
|
|
76
|
-
return rtPromise;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
handleAvatar(userIDs, height, width)
|
|
80
|
-
.then((res) => cb(null, res))
|
|
81
|
-
.catch((err) => {
|
|
82
|
-
utils.error("getAvatarUser", err);
|
|
83
|
-
return cb(err);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
return rtPromise;
|
|
87
|
-
};
|
|
88
|
-
};
|
package/src/getBotInitialData.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const utils = require("../utils");
|
|
4
|
-
|
|
5
|
-
module.exports = (defaultFuncs, api, ctx) => {
|
|
6
|
-
return function getAccountInfo(callback) {
|
|
7
|
-
let resolveFunc = () => {};
|
|
8
|
-
let rejectFunc = () => {};
|
|
9
|
-
const returnPromise = new Promise((resolve, reject) => {
|
|
10
|
-
resolveFunc = resolve;
|
|
11
|
-
rejectFunc = reject;
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
if (!callback) {
|
|
15
|
-
callback = (err, data) => {
|
|
16
|
-
if (err) return rejectFunc(err);
|
|
17
|
-
resolveFunc(data);
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
utils.log("Fetching account info...");
|
|
22
|
-
|
|
23
|
-
// ফেসবুক প্রোফাইল পেজ থেকে সোর্স কোড নিয়ে আসা হচ্ছে
|
|
24
|
-
api.httpGet(`https://www.facebook.com/profile.php?id=${ctx.userID}`, null, {
|
|
25
|
-
customUserAgent: utils.windowsUserAgent
|
|
26
|
-
}, (err, data) => {
|
|
27
|
-
// বাগ ফিক্স: অ্যাসিনক্রোনাস ব্লকে সরাসরি throw করার বদলে কলব্যাকে এরর পাঠানো হচ্ছে
|
|
28
|
-
if (err) {
|
|
29
|
-
return callback(err);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// সোর্স কোড থেকে CurrentUserInitialData ম্যাচ করা হচ্ছে
|
|
33
|
-
const profileMatch = data.match(/"CurrentUserInitialData",\[\],\{(.*?)\},(.*?)\]/);
|
|
34
|
-
|
|
35
|
-
if (profileMatch && profileMatch[1]) {
|
|
36
|
-
try {
|
|
37
|
-
const accountJson = JSON.parse(`{${profileMatch[1]}}`);
|
|
38
|
-
|
|
39
|
-
// প্রপার্টি ফরম্যাটিং
|
|
40
|
-
accountJson.name = accountJson.NAME;
|
|
41
|
-
accountJson.uid = accountJson.USER_ID;
|
|
42
|
-
|
|
43
|
-
delete accountJson.NAME;
|
|
44
|
-
delete accountJson.USER_ID;
|
|
45
|
-
|
|
46
|
-
return callback(null, { ...accountJson });
|
|
47
|
-
} catch (parseError) {
|
|
48
|
-
return callback(parseError);
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
return callback(null, {
|
|
52
|
-
error: "Something went wrong. Maybe its possible that it has a limitation due to spam requests. You can try again later."
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}, true);
|
|
56
|
-
|
|
57
|
-
return returnPromise;
|
|
58
|
-
};
|
|
59
|
-
};
|