bb-fca 2.0.4 → 2.0.7
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/dist/deltas/apis/create.js +22 -0
- package/dist/deltas/apis/create.js.map +1 -1
- package/dist/deltas/apis/posting/group.js +607 -0
- package/dist/deltas/apis/posting/group.js.map +1 -0
- package/dist/deltas/apis/posting/post.js +346 -1
- package/dist/deltas/apis/posting/post.js.map +1 -1
- package/dist/deltas/apis/posting/story.js +147 -0
- package/dist/deltas/apis/posting/story.js.map +1 -1
- package/dist/deltas/apis/threads/searchGroup.js +159 -0
- package/dist/deltas/apis/threads/searchGroup.js.map +1 -0
- package/dist/deltas/apis/users/searchGroups.js +221 -0
- package/dist/deltas/apis/users/searchGroups.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/types/deltas/apis/create.d.ts +22 -0
- package/dist/types/deltas/apis/posting/group.d.ts +90 -0
- package/dist/types/deltas/apis/posting/post.d.ts +7 -0
- package/dist/types/deltas/apis/posting/story.d.ts +21 -0
- package/dist/types/deltas/apis/threads/searchGroup.d.ts +15 -0
- package/dist/types/deltas/apis/users/searchGroups.d.ts +17 -0
- package/dist/types/utils/axios.d.ts +1 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/utils/axios.js +12 -0
- package/dist/utils/axios.js.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/request.txt +60 -0
- package/src/deltas/apis/create.ts +25 -0
- package/src/deltas/apis/posting/group.ts +754 -0
- package/src/deltas/apis/posting/post.ts +439 -1
- package/src/deltas/apis/posting/story.ts +147 -0
- package/src/types/index.d.ts +66 -0
- package/src/utils/axios.ts +19 -0
- package/src/utils/index.ts +1 -0
- package/LICENSE-MIT +0 -21
- package/examples/post.example.js +0 -149
- package/friend.html +0 -534
- package/proflie.html +0 -527
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.default = default_1;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const utils = require("../../../utils");
|
|
4
39
|
const url_1 = require("url");
|
|
5
40
|
/**
|
|
6
41
|
* @namespace api.story
|
|
@@ -148,6 +183,106 @@ function default_1(defaultFuncs, api, ctx) {
|
|
|
148
183
|
throw error;
|
|
149
184
|
}
|
|
150
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Uploads a photo for story usage.
|
|
188
|
+
* Uses waterfallxapp=comet_stories to target the stories upload endpoint.
|
|
189
|
+
* @param {string} photoPath Absolute path to the photo file.
|
|
190
|
+
* @returns {Promise<{success: boolean, photoID: string, photoId: string, imageSrc: string, data: object}>}
|
|
191
|
+
*/
|
|
192
|
+
async function uploadStoryPhoto(photoPath) {
|
|
193
|
+
if (!photoPath) {
|
|
194
|
+
throw new Error('Photo path is required.');
|
|
195
|
+
}
|
|
196
|
+
if (typeof photoPath !== 'string') {
|
|
197
|
+
throw new Error('Photo path must be a string.');
|
|
198
|
+
}
|
|
199
|
+
if (!fs.existsSync(photoPath)) {
|
|
200
|
+
throw new Error(`Photo file not found: ${photoPath}`);
|
|
201
|
+
}
|
|
202
|
+
const photoStream = fs.createReadStream(photoPath);
|
|
203
|
+
const url = new url_1.URL('https://upload.facebook.com/ajax/react_composer/attachments/photo/upload');
|
|
204
|
+
url.searchParams.append('av', ctx.userID);
|
|
205
|
+
url.searchParams.append('__aaid', '0');
|
|
206
|
+
url.searchParams.append('__user', ctx.userID);
|
|
207
|
+
url.searchParams.append('__a', '1');
|
|
208
|
+
url.searchParams.append('dpr', '1');
|
|
209
|
+
url.searchParams.append('__ccg', 'EXCELLENT');
|
|
210
|
+
url.searchParams.append('__comet_req', '15');
|
|
211
|
+
url.searchParams.append('fb_dtsg', ctx.fb_dtsg);
|
|
212
|
+
url.searchParams.append('jazoest', ctx.jazoest);
|
|
213
|
+
url.searchParams.append('lsd', ctx.fb_dtsg);
|
|
214
|
+
const form = {
|
|
215
|
+
source: '8',
|
|
216
|
+
profile_id: ctx.userID,
|
|
217
|
+
waterfallxapp: 'comet_stories',
|
|
218
|
+
farr: photoStream,
|
|
219
|
+
};
|
|
220
|
+
const uploadResponse = await utils.postFormData(url.toString(), ctx.jar, form, ctx.globalOptions, ctx);
|
|
221
|
+
const uploadResult = JSON.parse(uploadResponse.body.toString().replace(/^for \(;;\);/, ''));
|
|
222
|
+
if (uploadResult.error || uploadResult.errors) {
|
|
223
|
+
throw new Error(JSON.stringify(uploadResult.error || uploadResult.errors));
|
|
224
|
+
}
|
|
225
|
+
const photoID = uploadResult.payload?.photoID || uploadResult.payload?.fbid || null;
|
|
226
|
+
if (!photoID) {
|
|
227
|
+
throw new Error('Could not extract photoID from upload response.');
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
success: true,
|
|
231
|
+
photoID: String(photoID),
|
|
232
|
+
photoId: String(photoID),
|
|
233
|
+
imageSrc: uploadResult.payload?.imageSrc || null,
|
|
234
|
+
data: uploadResult.payload,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Creates a new image-based story.
|
|
239
|
+
* @param {string} photoPath Absolute path to the photo file.
|
|
240
|
+
* @returns {Promise<{success: boolean, storyID: string}>} A promise that resolves with the new story's ID.
|
|
241
|
+
*/
|
|
242
|
+
async function createImageStory(photoPath) {
|
|
243
|
+
// Step 1: Upload photo for story
|
|
244
|
+
const uploadResult = await uploadStoryPhoto(photoPath);
|
|
245
|
+
// Step 2: Create story with the uploaded photo
|
|
246
|
+
const variables = {
|
|
247
|
+
input: {
|
|
248
|
+
audiences: [{ stories: { self: { target_id: ctx.userID } } }],
|
|
249
|
+
audiences_is_complete: true,
|
|
250
|
+
logging: {
|
|
251
|
+
composer_session_id: 'createStoriesImage-' + Date.now(),
|
|
252
|
+
},
|
|
253
|
+
navigation_data: {
|
|
254
|
+
attribution_id_v2: 'StoriesCreateRoot.react,comet.stories.create',
|
|
255
|
+
},
|
|
256
|
+
source: 'WWW',
|
|
257
|
+
attachments: [
|
|
258
|
+
{
|
|
259
|
+
photo: {
|
|
260
|
+
id: uploadResult.photoID,
|
|
261
|
+
overlays: [],
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
tracking: [null],
|
|
266
|
+
actor_id: ctx.userID,
|
|
267
|
+
client_mutation_id: '1',
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
const form = {
|
|
271
|
+
__a: '1',
|
|
272
|
+
fb_api_caller_class: 'RelayModern',
|
|
273
|
+
fb_api_req_friendly_name: 'StoriesCreateMutation',
|
|
274
|
+
variables: JSON.stringify(variables),
|
|
275
|
+
doc_id: '24226878183562473',
|
|
276
|
+
};
|
|
277
|
+
const res = await defaultFuncs.post('https://www.facebook.com/api/graphql/', ctx.jar, form, {});
|
|
278
|
+
if (res.data.errors)
|
|
279
|
+
throw new Error(JSON.stringify(res.data.errors));
|
|
280
|
+
const storyNode = res.data?.data?.story_create?.viewer?.actor?.story_bucket?.nodes[0]
|
|
281
|
+
?.first_story_to_show;
|
|
282
|
+
if (!storyNode || !storyNode.id)
|
|
283
|
+
throw new Error('Could not find the storyCardID in the response.');
|
|
284
|
+
return { success: true, storyID: storyNode.id };
|
|
285
|
+
}
|
|
151
286
|
return {
|
|
152
287
|
/**
|
|
153
288
|
* Creates a new text-based story.
|
|
@@ -157,6 +292,18 @@ function default_1(defaultFuncs, api, ctx) {
|
|
|
157
292
|
* @returns {Promise<{success: boolean, storyID: string}>}
|
|
158
293
|
*/
|
|
159
294
|
create,
|
|
295
|
+
/**
|
|
296
|
+
* Uploads a photo for use in an image story.
|
|
297
|
+
* @param {string} photoPath Absolute path to the photo file.
|
|
298
|
+
* @returns {Promise<{success: boolean, photoID: string, photoId: string, imageSrc: string, data: object}>}
|
|
299
|
+
*/
|
|
300
|
+
uploadStoryPhoto,
|
|
301
|
+
/**
|
|
302
|
+
* Creates a new image-based story. Handles upload + publish in one call.
|
|
303
|
+
* @param {string} photoPath Absolute path to the photo file.
|
|
304
|
+
* @returns {Promise<{success: boolean, storyID: string}>}
|
|
305
|
+
*/
|
|
306
|
+
createImageStory,
|
|
160
307
|
/**
|
|
161
308
|
* Reacts to a story with a specific emoji.
|
|
162
309
|
* @param {string} storyIdOrUrl The ID or full URL of the story to react to.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"story.js","sourceRoot":"","sources":["../../../../src/deltas/apis/posting/story.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"story.js","sourceRoot":"","sources":["../../../../src/deltas/apis/posting/story.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = searchGroupModule;
|
|
4
|
+
const utils = require("../../../utils");
|
|
5
|
+
function parseResponseBody(body) {
|
|
6
|
+
if (typeof body === 'object' && body !== null && !Buffer.isBuffer(body)) {
|
|
7
|
+
return body;
|
|
8
|
+
}
|
|
9
|
+
const raw = typeof body === 'string' ? body : body.toString();
|
|
10
|
+
const normalized = raw.replace(/^for \(;;\);\s*/, '');
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(normalized);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
const lines = normalized.split('\n').filter(Boolean);
|
|
16
|
+
return JSON.parse(lines[0]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function parseLocalizedCount(text) {
|
|
20
|
+
const match = text.match(/([\d.,]+)\s*([kKmMbB])?/);
|
|
21
|
+
if (!match) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const base = Number((match[1] || '').replace(/,/g, '.'));
|
|
25
|
+
if (Number.isNaN(base)) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const unit = (match[2] || '').toLowerCase();
|
|
29
|
+
if (unit === 'k') {
|
|
30
|
+
return Math.round(base * 1000);
|
|
31
|
+
}
|
|
32
|
+
if (unit === 'm') {
|
|
33
|
+
return Math.round(base * 1000000);
|
|
34
|
+
}
|
|
35
|
+
if (unit === 'b') {
|
|
36
|
+
return Math.round(base * 1000000000);
|
|
37
|
+
}
|
|
38
|
+
return Math.round(base);
|
|
39
|
+
}
|
|
40
|
+
function mapGroupEdge(edge) {
|
|
41
|
+
const viewModel = edge?.rendering_strategy?.view_model;
|
|
42
|
+
const profile = viewModel?.profile || {};
|
|
43
|
+
const primaryCTAProfile = viewModel?.ctas?.primary?.[0]?.profile || {};
|
|
44
|
+
const summaryText = viewModel?.primary_snippet_text_with_entities?.text || null;
|
|
45
|
+
const summaryParts = summaryText
|
|
46
|
+
? summaryText.split('·').map((part) => part.trim()).filter(Boolean)
|
|
47
|
+
: [];
|
|
48
|
+
const memberPart = summaryParts.find((part) => /member|thành viên|membro|mitglieder|membres/i.test(part)) || null;
|
|
49
|
+
return {
|
|
50
|
+
groupID: profile.id || null,
|
|
51
|
+
name: profile.name || null,
|
|
52
|
+
url: profile.url || primaryCTAProfile.url || null,
|
|
53
|
+
profileUrl: profile.profile_url || profile.url || primaryCTAProfile.url || null,
|
|
54
|
+
imageSrc: profile.profile_picture?.uri || null,
|
|
55
|
+
summary: summaryText,
|
|
56
|
+
privacy: summaryParts[0] || null,
|
|
57
|
+
memberText: memberPart,
|
|
58
|
+
memberCount: memberPart ? parseLocalizedCount(memberPart) : null,
|
|
59
|
+
joinState: primaryCTAProfile.viewer_join_state || null,
|
|
60
|
+
hasMembershipQuestions: typeof primaryCTAProfile.has_membership_questions === 'boolean'
|
|
61
|
+
? primaryCTAProfile.has_membership_questions
|
|
62
|
+
: null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @ChoruOfficial
|
|
67
|
+
* @description Search Facebook groups by keyword using SearchCometResultsPaginatedResultsQuery.
|
|
68
|
+
*/
|
|
69
|
+
function searchGroupModule(defaultFuncs, api, ctx) {
|
|
70
|
+
/**
|
|
71
|
+
* Search groups by keyword.
|
|
72
|
+
* @param {string} keyword The keyword to search.
|
|
73
|
+
* @param {SearchGroupOptions} [options] Optional pagination and locale options.
|
|
74
|
+
* @returns {Promise<{ groups: any[]; cursor: string | null; hasNextPage: boolean; }>} Group search result and pagination cursor.
|
|
75
|
+
*/
|
|
76
|
+
return async function searchGroup(keyword, options = {}) {
|
|
77
|
+
if (!keyword || typeof keyword !== 'string') {
|
|
78
|
+
throw new Error('searchGroup: keyword must be a non-empty string.');
|
|
79
|
+
}
|
|
80
|
+
const limit = typeof options.limit === 'number' && Number.isInteger(options.limit)
|
|
81
|
+
? options.limit
|
|
82
|
+
: 10;
|
|
83
|
+
if (limit <= 0) {
|
|
84
|
+
throw new Error('searchGroup: options.limit must be a positive integer.');
|
|
85
|
+
}
|
|
86
|
+
const variables = {
|
|
87
|
+
allow_streaming: false,
|
|
88
|
+
args: {
|
|
89
|
+
callsite: 'comet:groups_search',
|
|
90
|
+
config: {
|
|
91
|
+
exact_match: false,
|
|
92
|
+
high_confidence_config: null,
|
|
93
|
+
intercept_config: null,
|
|
94
|
+
sts_disambiguation: null,
|
|
95
|
+
watch_config: null,
|
|
96
|
+
},
|
|
97
|
+
context: {
|
|
98
|
+
bsid: null,
|
|
99
|
+
tsid: null,
|
|
100
|
+
},
|
|
101
|
+
experience: {
|
|
102
|
+
client_defined_experiences: ['ADS_PARALLEL_FETCH'],
|
|
103
|
+
encoded_server_defined_params: null,
|
|
104
|
+
fbid: null,
|
|
105
|
+
type: 'GROUPS_TAB_GLOBAL',
|
|
106
|
+
},
|
|
107
|
+
filters: [],
|
|
108
|
+
text: keyword,
|
|
109
|
+
},
|
|
110
|
+
count: limit,
|
|
111
|
+
cursor: options.cursor ?? null,
|
|
112
|
+
feedLocation: 'SEARCH',
|
|
113
|
+
feedbackSource: 23,
|
|
114
|
+
fetch_filters: true,
|
|
115
|
+
focusCommentID: null,
|
|
116
|
+
locale: options.locale || 'vi_VN',
|
|
117
|
+
privacySelectorRenderLocation: 'COMET_STREAM',
|
|
118
|
+
referringStoryRenderLocation: null,
|
|
119
|
+
renderLocation: 'search_results_page',
|
|
120
|
+
scale: 1,
|
|
121
|
+
stream_initial_count: 0,
|
|
122
|
+
useDefaultActor: false,
|
|
123
|
+
};
|
|
124
|
+
const form = {
|
|
125
|
+
av: ctx.i_userID || ctx.userID,
|
|
126
|
+
__user: ctx.i_userID || ctx.userID,
|
|
127
|
+
__a: '1',
|
|
128
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
129
|
+
jazoest: ctx.jazoest,
|
|
130
|
+
lsd: ctx.lsd || '',
|
|
131
|
+
fb_api_caller_class: 'RelayModern',
|
|
132
|
+
fb_api_req_friendly_name: 'SearchCometResultsPaginatedResultsQuery',
|
|
133
|
+
server_timestamps: 'true',
|
|
134
|
+
variables: JSON.stringify(variables),
|
|
135
|
+
doc_id: '26131941349797315',
|
|
136
|
+
};
|
|
137
|
+
const customHeader = {
|
|
138
|
+
'x-fb-friendly-name': 'SearchCometResultsPaginatedResultsQuery',
|
|
139
|
+
'x-fb-lsd': ctx.lsd || '',
|
|
140
|
+
'x-asbd-id': '359341',
|
|
141
|
+
origin: 'https://www.facebook.com',
|
|
142
|
+
referer: `https://www.facebook.com/groups/search/groups_home?q=${encodeURIComponent(keyword)}&locale=${encodeURIComponent(options.locale || 'vi_VN')}`,
|
|
143
|
+
};
|
|
144
|
+
const resData = await utils.post('https://www.facebook.com/api/graphql/', ctx.jar, form, ctx.globalOptions, ctx, customHeader);
|
|
145
|
+
const data = parseResponseBody(resData.body);
|
|
146
|
+
if (data?.errors) {
|
|
147
|
+
throw new Error(JSON.stringify(data.errors));
|
|
148
|
+
}
|
|
149
|
+
const results = data?.data?.serpResponse?.results;
|
|
150
|
+
const edges = Array.isArray(results?.edges) ? results.edges : [];
|
|
151
|
+
const pageInfo = results?.page_info || {};
|
|
152
|
+
return {
|
|
153
|
+
groups: edges.map(mapGroupEdge),
|
|
154
|
+
cursor: pageInfo.end_cursor || null,
|
|
155
|
+
hasNextPage: Boolean(pageInfo.has_next_page),
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=searchGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchGroup.js","sourceRoot":"","sources":["../../../../src/deltas/apis/threads/searchGroup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = searchGroupsModule;
|
|
4
|
+
const utils = require("../../../utils");
|
|
5
|
+
/**
|
|
6
|
+
* @description A module for searching Facebook groups by keyword.
|
|
7
|
+
* Calls SearchCometResultsPaginatedResultsQuery via /api/graphql/.
|
|
8
|
+
* @param {Object} defaultFuncs The default functions provided by the API wrapper.
|
|
9
|
+
* @param {Object} api The full API object.
|
|
10
|
+
* @param {Object} ctx The context object containing the user's session state.
|
|
11
|
+
* @returns {Function} An async function that searches for groups by keyword.
|
|
12
|
+
*/
|
|
13
|
+
function searchGroupsModule(defaultFuncs, api, ctx) {
|
|
14
|
+
/**
|
|
15
|
+
* Generates a UUID v4 string for use as a batch search ID.
|
|
16
|
+
*/
|
|
17
|
+
function createBsid() {
|
|
18
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
19
|
+
const r = Math.random() * 16;
|
|
20
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
21
|
+
return Math.floor(v).toString(16);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parses a localised member count string (e.g. "1.2K members") into a number.
|
|
26
|
+
*/
|
|
27
|
+
function parseLocalizedCount(text) {
|
|
28
|
+
const match = text.match(/([\d.,]+)\s*([kKmMbB])?/);
|
|
29
|
+
if (!match)
|
|
30
|
+
return null;
|
|
31
|
+
const base = Number((match[1] || '').replace(/,/g, '.'));
|
|
32
|
+
if (Number.isNaN(base))
|
|
33
|
+
return null;
|
|
34
|
+
const unit = (match[2] || '').toLowerCase();
|
|
35
|
+
if (unit === 'k')
|
|
36
|
+
return Math.round(base * 1000);
|
|
37
|
+
if (unit === 'm')
|
|
38
|
+
return Math.round(base * 1000000);
|
|
39
|
+
if (unit === 'b')
|
|
40
|
+
return Math.round(base * 1000000000);
|
|
41
|
+
return Math.round(base);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Maps a single search result edge to a group object.
|
|
45
|
+
*/
|
|
46
|
+
function mapSearchGroupEdge(edge) {
|
|
47
|
+
const viewModel = edge?.rendering_strategy?.view_model;
|
|
48
|
+
const profile = viewModel?.profile || {};
|
|
49
|
+
const primaryCTAProfile = viewModel?.ctas?.primary?.[0]?.profile || {};
|
|
50
|
+
const summaryText = viewModel?.primary_snippet_text_with_entities?.text || null;
|
|
51
|
+
const summaryParts = summaryText
|
|
52
|
+
? summaryText
|
|
53
|
+
.split('·')
|
|
54
|
+
.map((part) => part.trim())
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
: [];
|
|
57
|
+
const memberPart = summaryParts.find((part) => /member|thành viên|membro|mitglieder|membres/i.test(part)) || null;
|
|
58
|
+
return {
|
|
59
|
+
groupID: profile.id || null,
|
|
60
|
+
name: profile.name || null,
|
|
61
|
+
url: profile.url || primaryCTAProfile.url || null,
|
|
62
|
+
profileUrl: profile.profile_url || profile.url || primaryCTAProfile.url || null,
|
|
63
|
+
imageSrc: profile.profile_picture?.uri || null,
|
|
64
|
+
summary: summaryText,
|
|
65
|
+
privacy: summaryParts[0] || null,
|
|
66
|
+
memberText: memberPart,
|
|
67
|
+
memberCount: memberPart ? parseLocalizedCount(memberPart) : null,
|
|
68
|
+
joinState: primaryCTAProfile.viewer_join_state || null,
|
|
69
|
+
hasMembershipQuestions: typeof primaryCTAProfile.has_membership_questions === 'boolean'
|
|
70
|
+
? primaryCTAProfile.has_membership_questions
|
|
71
|
+
: null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parses the HTTP response body, handling both pre-parsed objects and raw strings.
|
|
76
|
+
*/
|
|
77
|
+
function parseResponseBody(body) {
|
|
78
|
+
if (typeof body === 'object' && body !== null && !Buffer.isBuffer(body)) {
|
|
79
|
+
return body;
|
|
80
|
+
}
|
|
81
|
+
const raw = typeof body === 'string' ? body : body.toString();
|
|
82
|
+
const normalized = raw.replace(/^for \(;;\);\s*/, '');
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(normalized);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
const lines = normalized.split('\n').filter(Boolean);
|
|
88
|
+
return JSON.parse(lines[0]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Searches for Facebook groups matching the given keyword.
|
|
93
|
+
* Uses Facebook's Search Comet endpoint with GROUPS_TAB_GLOBAL experience.
|
|
94
|
+
* @async
|
|
95
|
+
* @param {string} keyword The search keyword.
|
|
96
|
+
* @param {Object} [options] Optional parameters.
|
|
97
|
+
* @param {number} [options.limit=10] Number of results per page.
|
|
98
|
+
* @param {string|null} [options.cursor=null] Pagination cursor from a previous result.
|
|
99
|
+
* @param {string} [options.locale='vi_VN'] Locale for the search request.
|
|
100
|
+
* @returns {Promise<{ groups: any[]; cursor: string | null; hasNextPage: boolean }>}
|
|
101
|
+
* @throws {Error} If the keyword is missing or the API request fails.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* const result = await api.searchGroups('gaming');
|
|
105
|
+
* console.log(result.groups); // Array of group objects
|
|
106
|
+
* console.log(result.cursor); // cursor string for next page
|
|
107
|
+
* console.log(result.hasNextPage);
|
|
108
|
+
*
|
|
109
|
+
* // Page 2
|
|
110
|
+
* const page2 = await api.searchGroups('gaming', { cursor: result.cursor });
|
|
111
|
+
*/
|
|
112
|
+
return async function searchGroups(keyword, options = {}) {
|
|
113
|
+
if (!keyword || typeof keyword !== 'string') {
|
|
114
|
+
throw new Error('searchGroups: keyword must be a non-empty string.');
|
|
115
|
+
}
|
|
116
|
+
const limit = typeof options.limit === 'number' && Number.isInteger(options.limit)
|
|
117
|
+
? options.limit
|
|
118
|
+
: 10;
|
|
119
|
+
if (limit <= 0) {
|
|
120
|
+
throw new Error('searchGroups: options.limit must be a positive integer.');
|
|
121
|
+
}
|
|
122
|
+
const locale = options.locale || 'vi_VN';
|
|
123
|
+
const bsid = createBsid();
|
|
124
|
+
const tsid = Math.random().toString();
|
|
125
|
+
const variables = {
|
|
126
|
+
allow_streaming: false,
|
|
127
|
+
args: {
|
|
128
|
+
callsite: 'comet:groups_search',
|
|
129
|
+
config: {
|
|
130
|
+
exact_match: false,
|
|
131
|
+
high_confidence_config: null,
|
|
132
|
+
intercept_config: null,
|
|
133
|
+
sts_disambiguation: null,
|
|
134
|
+
watch_config: null,
|
|
135
|
+
},
|
|
136
|
+
context: {
|
|
137
|
+
bsid,
|
|
138
|
+
tsid,
|
|
139
|
+
},
|
|
140
|
+
experience: {
|
|
141
|
+
client_defined_experiences: ['ADS_PARALLEL_FETCH'],
|
|
142
|
+
encoded_server_defined_params: null,
|
|
143
|
+
fbid: null,
|
|
144
|
+
type: 'GROUPS_TAB_GLOBAL',
|
|
145
|
+
},
|
|
146
|
+
filters: [],
|
|
147
|
+
text: keyword,
|
|
148
|
+
},
|
|
149
|
+
count: limit,
|
|
150
|
+
cursor: options.cursor ?? null,
|
|
151
|
+
feedLocation: 'SEARCH',
|
|
152
|
+
feedbackSource: 23,
|
|
153
|
+
fetch_filters: true,
|
|
154
|
+
focusCommentID: null,
|
|
155
|
+
locale: null,
|
|
156
|
+
privacySelectorRenderLocation: 'COMET_STREAM',
|
|
157
|
+
referringStoryRenderLocation: null,
|
|
158
|
+
renderLocation: 'search_results_page',
|
|
159
|
+
scale: 1,
|
|
160
|
+
stream_initial_count: 0,
|
|
161
|
+
useDefaultActor: false,
|
|
162
|
+
__relay_internal__pv__GHLShouldChangeAdIdFieldNamerelayprovider: true,
|
|
163
|
+
__relay_internal__pv__GHLShouldChangeSponsoredDataFieldNamerelayprovider: true,
|
|
164
|
+
__relay_internal__pv__CometFeedStory_enable_post_permalink_white_space_clickrelayprovider: false,
|
|
165
|
+
__relay_internal__pv__CometUFICommentActionLinksRewriteEnabledrelayprovider: false,
|
|
166
|
+
__relay_internal__pv__CometUFICommentAvatarStickerAnimatedImagerelayprovider: false,
|
|
167
|
+
__relay_internal__pv__IsWorkUserrelayprovider: false,
|
|
168
|
+
__relay_internal__pv__TestPilotShouldIncludeDemoAdUseCaserelayprovider: false,
|
|
169
|
+
__relay_internal__pv__FBReels_deprecate_short_form_video_context_gkrelayprovider: true,
|
|
170
|
+
__relay_internal__pv__FBReels_enable_view_dubbed_audio_type_gkrelayprovider: true,
|
|
171
|
+
__relay_internal__pv__CometImmersivePhotoCanUserDisable3DMotionrelayprovider: false,
|
|
172
|
+
__relay_internal__pv__WorkCometIsEmployeeGKProviderrelayprovider: false,
|
|
173
|
+
__relay_internal__pv__IsMergQAPollsrelayprovider: false,
|
|
174
|
+
__relay_internal__pv__FBReelsMediaFooter_comet_enable_reels_ads_gkrelayprovider: true,
|
|
175
|
+
__relay_internal__pv__CometUFIReactionsEnableShortNamerelayprovider: false,
|
|
176
|
+
__relay_internal__pv__CometUFICommentAutoTranslationTyperelayprovider: 'ORIGINAL',
|
|
177
|
+
__relay_internal__pv__CometUFIShareActionMigrationrelayprovider: true,
|
|
178
|
+
__relay_internal__pv__CometUFISingleLineUFIrelayprovider: false,
|
|
179
|
+
__relay_internal__pv__CometUFI_dedicated_comment_routable_dialog_gkrelayprovider: true,
|
|
180
|
+
__relay_internal__pv__FBReelsIFUTileContent_reelsIFUPlayOnHoverrelayprovider: true,
|
|
181
|
+
__relay_internal__pv__GroupsCometGYSJFeedItemHeightrelayprovider: 150,
|
|
182
|
+
__relay_internal__pv__ShouldEnableBakedInTextStoriesrelayprovider: false,
|
|
183
|
+
__relay_internal__pv__StoriesShouldIncludeFbNotesrelayprovider: false,
|
|
184
|
+
};
|
|
185
|
+
const form = {
|
|
186
|
+
av: ctx.i_userID || ctx.userID,
|
|
187
|
+
__user: ctx.i_userID || ctx.userID,
|
|
188
|
+
__a: '1',
|
|
189
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
190
|
+
jazoest: ctx.jazoest,
|
|
191
|
+
lsd: ctx.lsd || '',
|
|
192
|
+
locale,
|
|
193
|
+
fb_api_caller_class: 'RelayModern',
|
|
194
|
+
fb_api_req_friendly_name: 'SearchCometResultsPaginatedResultsQuery',
|
|
195
|
+
server_timestamps: 'true',
|
|
196
|
+
variables: JSON.stringify(variables),
|
|
197
|
+
doc_id: '26131941349797315',
|
|
198
|
+
};
|
|
199
|
+
const customHeader = {
|
|
200
|
+
'x-fb-friendly-name': 'SearchCometResultsPaginatedResultsQuery',
|
|
201
|
+
'x-fb-lsd': ctx.lsd || '',
|
|
202
|
+
'x-asbd-id': '359341',
|
|
203
|
+
origin: 'https://www.facebook.com',
|
|
204
|
+
referer: `https://www.facebook.com/groups/search/groups_home?q=${encodeURIComponent(keyword)}&locale=${encodeURIComponent(locale)}`,
|
|
205
|
+
};
|
|
206
|
+
const res = await utils.post('https://www.facebook.com/api/graphql/', ctx.jar, form, ctx.globalOptions, ctx, customHeader);
|
|
207
|
+
const data = parseResponseBody(res.body);
|
|
208
|
+
if (data?.errors) {
|
|
209
|
+
throw new Error(JSON.stringify(data.errors));
|
|
210
|
+
}
|
|
211
|
+
const results = data?.data?.serpResponse?.results;
|
|
212
|
+
const edges = Array.isArray(results?.edges) ? results.edges : [];
|
|
213
|
+
const pageInfo = results?.page_info || {};
|
|
214
|
+
return {
|
|
215
|
+
groups: edges.map(mapSearchGroupEdge),
|
|
216
|
+
cursor: pageInfo.end_cursor || null,
|
|
217
|
+
hasNextPage: Boolean(pageInfo.has_next_page),
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=searchGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchGroups.js","sourceRoot":"","sources":["../../../../src/deltas/apis/users/searchGroups.ts"],"names":[],"mappings":"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"}
|