@lazyneoaz/testfca 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +229 -0
- package/COOKIE_LOGIN.md +208 -0
- package/LICENSE +3 -0
- package/README.md +492 -0
- package/index.js +2 -0
- package/package.json +120 -0
- package/scripts/build-go.mjs +54 -0
- package/scripts/detect-platform.mjs +36 -0
- package/scripts/download-prebuilt.mjs +119 -0
- package/scripts/package.mjs +6 -0
- package/scripts/postinstall.mjs +113 -0
- package/src/apis/addExternalModule.js +24 -0
- package/src/apis/addUserToGroup.js +108 -0
- package/src/apis/changeAdminStatus.js +148 -0
- package/src/apis/changeArchivedStatus.js +61 -0
- package/src/apis/changeAvatar.js +103 -0
- package/src/apis/changeBio.js +69 -0
- package/src/apis/changeBlockedStatus.js +54 -0
- package/src/apis/changeGroupImage.js +136 -0
- package/src/apis/changeThreadColor.js +116 -0
- package/src/apis/changeThreadEmoji.js +53 -0
- package/src/apis/comment.js +207 -0
- package/src/apis/createAITheme.js +129 -0
- package/src/apis/createNewGroup.js +79 -0
- package/src/apis/createPoll.js +73 -0
- package/src/apis/deleteMessage.js +52 -0
- package/src/apis/deleteThread.js +52 -0
- package/src/apis/e2ee.js +170 -0
- package/src/apis/editMessage.js +78 -0
- package/src/apis/emoji.js +124 -0
- package/src/apis/fetchThemeData.js +82 -0
- package/src/apis/follow.js +81 -0
- package/src/apis/forwardMessage.js +52 -0
- package/src/apis/friend.js +243 -0
- package/src/apis/gcmember.js +122 -0
- package/src/apis/gcname.js +123 -0
- package/src/apis/gcrule.js +119 -0
- package/src/apis/getAccess.js +111 -0
- package/src/apis/getBotInfo.js +88 -0
- package/src/apis/getBotInitialData.js +43 -0
- package/src/apis/getFriendsList.js +79 -0
- package/src/apis/getMessage.js +423 -0
- package/src/apis/getTheme.js +95 -0
- package/src/apis/getThemeInfo.js +116 -0
- package/src/apis/getThreadHistory.js +239 -0
- package/src/apis/getThreadInfo.js +267 -0
- package/src/apis/getThreadList.js +232 -0
- package/src/apis/getThreadPictures.js +58 -0
- package/src/apis/getUserID.js +117 -0
- package/src/apis/getUserInfo.js +513 -0
- package/src/apis/getUserInfoV2.js +146 -0
- package/src/apis/handleMessageRequest.js +50 -0
- package/src/apis/httpGet.js +63 -0
- package/src/apis/httpPost.js +89 -0
- package/src/apis/httpPostFormData.js +69 -0
- package/src/apis/listenMqtt.js +1236 -0
- package/src/apis/listenSpeed.js +179 -0
- package/src/apis/logout.js +93 -0
- package/src/apis/markAsDelivered.js +47 -0
- package/src/apis/markAsRead.js +115 -0
- package/src/apis/markAsReadAll.js +40 -0
- package/src/apis/markAsSeen.js +70 -0
- package/src/apis/mqttDeltaValue.js +250 -0
- package/src/apis/muteThread.js +45 -0
- package/src/apis/nickname.js +132 -0
- package/src/apis/notes.js +163 -0
- package/src/apis/pinMessage.js +150 -0
- package/src/apis/produceMetaTheme.js +180 -0
- package/src/apis/realtime.js +182 -0
- package/src/apis/removeUserFromGroup.js +117 -0
- package/src/apis/resolvePhotoUrl.js +58 -0
- package/src/apis/searchForThread.js +154 -0
- package/src/apis/sendMessage.js +346 -0
- package/src/apis/sendMessageMqtt.js +248 -0
- package/src/apis/sendTypingIndicator.js +105 -0
- package/src/apis/setMessageReaction.js +38 -0
- package/src/apis/setMessageReactionMqtt.js +61 -0
- package/src/apis/setThreadTheme.js +260 -0
- package/src/apis/setThreadThemeMqtt.js +94 -0
- package/src/apis/share.js +107 -0
- package/src/apis/shareContact.js +66 -0
- package/src/apis/stickers.js +257 -0
- package/src/apis/story.js +181 -0
- package/src/apis/theme.js +233 -0
- package/src/apis/unfriend.js +47 -0
- package/src/apis/unsendMessage.js +25 -0
- package/src/database/appStateBackup.js +298 -0
- package/src/database/models/index.js +56 -0
- package/src/database/models/thread.js +31 -0
- package/src/database/models/user.js +32 -0
- package/src/database/threadData.js +101 -0
- package/src/database/userData.js +90 -0
- package/src/e2ee/bridge.js +275 -0
- package/src/e2ee/index.js +60 -0
- package/src/engine/client.js +95 -0
- package/src/engine/models/buildAPI.js +152 -0
- package/src/engine/models/loginHelper.js +574 -0
- package/src/engine/models/setOptions.js +88 -0
- package/src/types/index.d.ts +574 -0
- package/src/utils/antiSuspension.js +529 -0
- package/src/utils/auth-helpers.js +149 -0
- package/src/utils/autoReLogin.js +336 -0
- package/src/utils/axios.js +436 -0
- package/src/utils/cache.js +54 -0
- package/src/utils/clients.js +282 -0
- package/src/utils/constants.js +410 -0
- package/src/utils/formatters/data/formatAttachment.js +370 -0
- package/src/utils/formatters/data/formatDelta.js +109 -0
- package/src/utils/formatters/index.js +159 -0
- package/src/utils/formatters/value/formatCookie.js +91 -0
- package/src/utils/formatters/value/formatDate.js +36 -0
- package/src/utils/formatters/value/formatID.js +16 -0
- package/src/utils/formatters.js +1373 -0
- package/src/utils/headers.js +235 -0
- package/src/utils/index.js +153 -0
- package/src/utils/monitoring.js +333 -0
- package/src/utils/rateLimiter.js +319 -0
- package/src/utils/tokenRefresh.js +680 -0
- package/src/utils/user-agents.js +238 -0
- package/src/utils/validation.js +157 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { randomUserAgent, generateUserAgentByPersona } = require("./user-agents");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Strip characters that are illegal in HTTP header values:
|
|
7
|
+
* control chars (except HTAB), DEL, CR, LF, and stringified arrays.
|
|
8
|
+
* This prevents ERR_INVALID_CHAR crashes that expose bot-like behaviour.
|
|
9
|
+
*/
|
|
10
|
+
function sanitizeHeaderValue(value) {
|
|
11
|
+
if (value === null || value === undefined) return '';
|
|
12
|
+
let str;
|
|
13
|
+
try {
|
|
14
|
+
str = typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
15
|
+
} catch (_) {
|
|
16
|
+
return '';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Detect accidentally stringified JS arrays like '["performAutoLogin"]'
|
|
20
|
+
if (str.trim().startsWith('[') && str.trim().endsWith(']')) {
|
|
21
|
+
try {
|
|
22
|
+
const parsed = JSON.parse(str);
|
|
23
|
+
if (Array.isArray(parsed)) return '';
|
|
24
|
+
} catch (_) {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Remove control chars (0x00-0x08, 0x0A-0x1F), DEL (0x7F), CR, LF, brackets
|
|
28
|
+
str = str.replace(/[\x00-\x08\x0A-\x1F\x7F\r\n\[\]]/g, '').trim();
|
|
29
|
+
return str;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function sanitizeHeaders(headers) {
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
35
|
+
if (!key || typeof key !== 'string') continue;
|
|
36
|
+
const cleanKey = key.replace(/[^\x21-\x7E]/g, '').trim();
|
|
37
|
+
if (!cleanKey) continue;
|
|
38
|
+
const cleanVal = sanitizeHeaderValue(value);
|
|
39
|
+
if (cleanVal !== '') {
|
|
40
|
+
out[cleanKey] = cleanVal;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const LOCALE_PROFILES = [
|
|
47
|
+
'en-US,en;q=0.9',
|
|
48
|
+
'en-GB,en;q=0.9,en-US;q=0.8',
|
|
49
|
+
'en-US,en;q=0.9,es;q=0.8',
|
|
50
|
+
'en-US,en;q=0.9,fr;q=0.8',
|
|
51
|
+
'en-CA,en;q=0.9,fr;q=0.8',
|
|
52
|
+
'en-AU,en;q=0.9,en-GB;q=0.8'
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const TIMEZONE_OFFSETS = [-480, -420, -360, -300, -240, -180, -120, 0, 60, 120, 180, 240, 300, 360, 480, 540, 600];
|
|
56
|
+
|
|
57
|
+
function getRandomLocale() {
|
|
58
|
+
return LOCALE_PROFILES[Math.floor(Math.random() * LOCALE_PROFILES.length)];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function getRandomTimezone() {
|
|
62
|
+
return TIMEZONE_OFFSETS[Math.floor(Math.random() * TIMEZONE_OFFSETS.length)];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Generates a comprehensive and realistic set of headers for requests to Facebook.
|
|
67
|
+
* @param {string} url - The target URL.
|
|
68
|
+
* @param {object} options - Global options from context.
|
|
69
|
+
* @param {object} ctx - The application context (containing fb_dtsg, lsd, etc.).
|
|
70
|
+
* @param {object} customHeader - Any extra headers to merge.
|
|
71
|
+
* @param {string} requestType - Type of request: 'xhr' for GraphQL/AJAX or 'navigate' for page navigation
|
|
72
|
+
* @returns {object} A complete headers object.
|
|
73
|
+
*/
|
|
74
|
+
function getHeaders(url, options, ctx, customHeader, requestType = 'navigate') {
|
|
75
|
+
const persona = options?.persona || 'desktop';
|
|
76
|
+
const isAndroid = persona === 'android' || persona === 'mobile';
|
|
77
|
+
|
|
78
|
+
let userAgent, secChUa, secChUaFullVersionList, secChUaPlatform, secChUaPlatformVersion;
|
|
79
|
+
let androidData = null;
|
|
80
|
+
|
|
81
|
+
if (isAndroid) {
|
|
82
|
+
if (options && options.cachedAndroidUA) {
|
|
83
|
+
userAgent = options.cachedAndroidUA;
|
|
84
|
+
androidData = {
|
|
85
|
+
resolution: options.cachedAndroidResolution,
|
|
86
|
+
locale: options.cachedAndroidLocale,
|
|
87
|
+
device: options.cachedAndroidDevice
|
|
88
|
+
};
|
|
89
|
+
} else {
|
|
90
|
+
const generated = generateUserAgentByPersona('android', options);
|
|
91
|
+
userAgent = generated.userAgent;
|
|
92
|
+
androidData = {
|
|
93
|
+
resolution: generated.resolution,
|
|
94
|
+
locale: generated.locale,
|
|
95
|
+
device: generated.device
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
if (options && options.cachedUserAgent) {
|
|
100
|
+
userAgent = options.cachedUserAgent;
|
|
101
|
+
secChUa = options.cachedSecChUa;
|
|
102
|
+
secChUaFullVersionList = options.cachedSecChUaFullVersionList;
|
|
103
|
+
secChUaPlatform = options.cachedSecChUaPlatform;
|
|
104
|
+
secChUaPlatformVersion = options.cachedSecChUaPlatformVersion;
|
|
105
|
+
} else {
|
|
106
|
+
const generated = randomUserAgent();
|
|
107
|
+
userAgent = generated.userAgent;
|
|
108
|
+
secChUa = generated.secChUa;
|
|
109
|
+
secChUaFullVersionList = generated.secChUaFullVersionList;
|
|
110
|
+
secChUaPlatform = generated.secChUaPlatform;
|
|
111
|
+
secChUaPlatformVersion = generated.secChUaPlatformVersion;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const host = new URL(url).hostname;
|
|
116
|
+
const referer = `https://${host}/`;
|
|
117
|
+
|
|
118
|
+
const isXhr = requestType === 'xhr';
|
|
119
|
+
|
|
120
|
+
const locales = options?.cachedLocale || (androidData?.locale ? androidData.locale.replace('_', '-') : getRandomLocale());
|
|
121
|
+
const timezone = options?.cachedTimezone || getRandomTimezone();
|
|
122
|
+
|
|
123
|
+
if (isAndroid) {
|
|
124
|
+
const headers = {
|
|
125
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
126
|
+
'Host': host,
|
|
127
|
+
'Connection': 'keep-alive',
|
|
128
|
+
'User-Agent': userAgent,
|
|
129
|
+
'Accept': '*/*',
|
|
130
|
+
'Accept-Language': locales,
|
|
131
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
132
|
+
'X-FB-HTTP-Engine': 'Liger'
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
if (androidData && androidData.resolution) {
|
|
136
|
+
headers['X-FB-Client-Density'] = String(androidData.resolution.density);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (ctx) {
|
|
140
|
+
if (ctx.lsd || ctx.fb_dtsg) {
|
|
141
|
+
headers['X-Fb-Lsd'] = ctx.lsd || ctx.fb_dtsg;
|
|
142
|
+
}
|
|
143
|
+
if (ctx.region) {
|
|
144
|
+
headers['X-MSGR-Region'] = ctx.region;
|
|
145
|
+
}
|
|
146
|
+
// Spin params are spread directly into ctx by buildAPI — ctx.master never exists.
|
|
147
|
+
if (ctx.__spin_r) headers['X-Fb-Spin-R'] = String(ctx.__spin_r);
|
|
148
|
+
if (ctx.__spin_b) headers['X-Fb-Spin-B'] = String(ctx.__spin_b);
|
|
149
|
+
if (ctx.__spin_t) headers['X-Fb-Spin-T'] = String(ctx.__spin_t);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (customHeader) {
|
|
153
|
+
Object.assign(headers, customHeader);
|
|
154
|
+
if (customHeader.noRef) {
|
|
155
|
+
delete headers.Referer;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return sanitizeHeaders(headers);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const isWindows = secChUaPlatform === '"Windows"';
|
|
163
|
+
const isMac = secChUaPlatform === '"macOS"';
|
|
164
|
+
const isLinux = secChUaPlatform === '"Linux"';
|
|
165
|
+
|
|
166
|
+
const headers = {
|
|
167
|
+
'Accept': isXhr ? '*/*' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
|
|
168
|
+
'Accept-Language': locales,
|
|
169
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
170
|
+
'Cache-Control': 'no-cache',
|
|
171
|
+
'Connection': 'keep-alive',
|
|
172
|
+
'DNT': '1',
|
|
173
|
+
'Dpr': '1',
|
|
174
|
+
'Host': host,
|
|
175
|
+
'Pragma': 'no-cache',
|
|
176
|
+
'Referer': referer,
|
|
177
|
+
'Sec-Ch-Prefers-Color-Scheme': 'light',
|
|
178
|
+
'Sec-Ch-Ua': secChUa,
|
|
179
|
+
'Sec-Ch-Ua-Full-Version-List': secChUaFullVersionList,
|
|
180
|
+
'Sec-Ch-Ua-Mobile': '?0',
|
|
181
|
+
'Sec-Ch-Ua-Model': '""',
|
|
182
|
+
'Sec-Ch-Ua-Platform': secChUaPlatform,
|
|
183
|
+
'Sec-Ch-Ua-Platform-Version': secChUaPlatformVersion,
|
|
184
|
+
'Sec-Fetch-Dest': isXhr ? 'empty' : 'document',
|
|
185
|
+
'Sec-Fetch-Mode': isXhr ? 'cors' : 'navigate',
|
|
186
|
+
'Sec-Fetch-Site': isXhr ? 'same-origin' : 'none',
|
|
187
|
+
'User-Agent': userAgent,
|
|
188
|
+
'Viewport-Width': '1920',
|
|
189
|
+
'X-FB-Timezone-Offset': String(timezone * 60)
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
if (isWindows || isMac || isLinux) {
|
|
193
|
+
headers['Sec-Ch-Ua-Arch'] = '"x86"';
|
|
194
|
+
headers['Sec-Ch-Ua-Bitness'] = '"64"';
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (isXhr) {
|
|
198
|
+
headers['Origin'] = `https://${host}`;
|
|
199
|
+
headers['X-Requested-With'] = 'XMLHttpRequest';
|
|
200
|
+
} else {
|
|
201
|
+
headers['Sec-Fetch-User'] = '?1';
|
|
202
|
+
headers['Upgrade-Insecure-Requests'] = '1';
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (ctx) {
|
|
206
|
+
if (ctx.lsd || ctx.fb_dtsg) {
|
|
207
|
+
headers['X-Fb-Lsd'] = ctx.lsd || ctx.fb_dtsg;
|
|
208
|
+
}
|
|
209
|
+
if (ctx.region) {
|
|
210
|
+
headers['X-MSGR-Region'] = ctx.region;
|
|
211
|
+
}
|
|
212
|
+
// Spin params are spread directly into ctx by buildAPI — ctx.master never exists.
|
|
213
|
+
if (ctx.__spin_r) headers['X-Fb-Spin-R'] = String(ctx.__spin_r);
|
|
214
|
+
if (ctx.__spin_b) headers['X-Fb-Spin-B'] = String(ctx.__spin_b);
|
|
215
|
+
if (ctx.__spin_t) headers['X-Fb-Spin-T'] = String(ctx.__spin_t);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (customHeader) {
|
|
219
|
+
Object.assign(headers, customHeader);
|
|
220
|
+
if (customHeader.noRef) {
|
|
221
|
+
delete headers.Referer;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return sanitizeHeaders(headers);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const meta = (prop) => new RegExp(`<meta property="${prop}" content="([^"]*)"`);
|
|
229
|
+
|
|
230
|
+
module.exports = {
|
|
231
|
+
getHeaders,
|
|
232
|
+
meta,
|
|
233
|
+
getRandomLocale,
|
|
234
|
+
getRandomTimezone
|
|
235
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/* eslint-disable no-prototype-builtins */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const cheerio = require("cheerio");
|
|
5
|
+
const util = require("util");
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Fetches a URL, scrapes all <script type="application/json"> tags, and returns their parsed content.
|
|
9
|
+
* @param {string} url - The URL to fetch.
|
|
10
|
+
* @param {object} jar - The cookie jar.
|
|
11
|
+
* @param {object} qs - Query string parameters.
|
|
12
|
+
* @param {object} options - Global options.
|
|
13
|
+
* @param {object} ctx - The application context.
|
|
14
|
+
* @param {object} customHeader - Custom headers.
|
|
15
|
+
* @returns {Promise<Array<Object>>} A promise that resolves with an array of parsed JSON objects.
|
|
16
|
+
*/
|
|
17
|
+
async function json(url, jar, qs, options, ctx, customHeader) {
|
|
18
|
+
const network = require("./axios");
|
|
19
|
+
const constants = require("./constants");
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const res = await network.get(url, jar, qs, options, ctx, customHeader);
|
|
23
|
+
const body = res.body;
|
|
24
|
+
const $ = cheerio.load(body);
|
|
25
|
+
const scripts = $('script[type="application/json"]');
|
|
26
|
+
|
|
27
|
+
if (scripts.length === 0) {
|
|
28
|
+
constants.warn(`No <script type="application/json"> tags found on ${url}`);
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const allJsonData = [];
|
|
33
|
+
scripts.each((index, element) => {
|
|
34
|
+
try {
|
|
35
|
+
const jsonContent = $(element).html();
|
|
36
|
+
if (jsonContent) {
|
|
37
|
+
allJsonData.push(JSON.parse(jsonContent));
|
|
38
|
+
}
|
|
39
|
+
} catch (e) {
|
|
40
|
+
constants.warn(`Could not parse JSON from script #${index + 1} on ${url}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return allJsonData;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
constants.error(`Error in utils.json fetching from ${url}:`, error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates an object with pre-filled request defaults based on HTML and user context.
|
|
53
|
+
* @param {string} html - The HTML content.
|
|
54
|
+
* @param {string|number} userID - The user ID.
|
|
55
|
+
* @param {object} ctx - The context containing session data.
|
|
56
|
+
* @returns {object} An object with .get, .post, and .postFormData methods.
|
|
57
|
+
*/
|
|
58
|
+
function makeDefaults(html, userID, ctx) {
|
|
59
|
+
const network = require("./axios");
|
|
60
|
+
const constants = require("./constants");
|
|
61
|
+
|
|
62
|
+
let reqCounter = 1;
|
|
63
|
+
const revision = constants.getFrom(html, 'revision":', ",");
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Merges provided data with default request parameters.
|
|
67
|
+
* @param {object} obj - The original query or form object.
|
|
68
|
+
* @returns {object} The merged object.
|
|
69
|
+
*/
|
|
70
|
+
function mergeWithDefaults(obj) {
|
|
71
|
+
const newObj = {
|
|
72
|
+
av: userID,
|
|
73
|
+
__user: userID,
|
|
74
|
+
__req: (reqCounter++).toString(36),
|
|
75
|
+
__rev: revision,
|
|
76
|
+
__a: 1,
|
|
77
|
+
...(ctx && {
|
|
78
|
+
fb_dtsg: ctx.fb_dtsg,
|
|
79
|
+
jazoest: ctx.jazoest,
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
if (!obj) return newObj;
|
|
84
|
+
|
|
85
|
+
for (const prop in obj) {
|
|
86
|
+
if (obj.hasOwnProperty(prop) && !(prop in newObj)) {
|
|
87
|
+
newObj[prop] = obj[prop];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return newObj;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
/**
|
|
96
|
+
* Makes a GET request with merged defaults.
|
|
97
|
+
* @param {string} url
|
|
98
|
+
* @param {object} jar
|
|
99
|
+
* @param {object} qs
|
|
100
|
+
* @param {object} ctxx
|
|
101
|
+
* @param {object} [customHeader={}]
|
|
102
|
+
* @returns {Promise<object>}
|
|
103
|
+
*/
|
|
104
|
+
get: (url, jar, qs, ctxx, customHeader = {}) =>
|
|
105
|
+
network.get(url, jar, mergeWithDefaults(qs), ctx?.globalOptions, ctxx || ctx, customHeader),
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Makes a POST request with merged defaults.
|
|
109
|
+
* @param {string} url
|
|
110
|
+
* @param {object} jar
|
|
111
|
+
* @param {object} form
|
|
112
|
+
* @param {object} ctxx
|
|
113
|
+
* @param {object} [customHeader={}]
|
|
114
|
+
* @returns {Promise<object>}
|
|
115
|
+
*/
|
|
116
|
+
post: (url, jar, form, ctxx, customHeader = {}) =>
|
|
117
|
+
network.post(url, jar, mergeWithDefaults(form), ctx?.globalOptions, ctxx || ctx, customHeader),
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Makes a multipart/form-data POST request with merged defaults.
|
|
121
|
+
* @param {string} url
|
|
122
|
+
* @param {object} jar
|
|
123
|
+
* @param {object} form
|
|
124
|
+
* @param {object} qs
|
|
125
|
+
* @param {object} ctxx
|
|
126
|
+
* @returns {Promise<object>}
|
|
127
|
+
*/
|
|
128
|
+
postFormData: (url, jar, form, qs, ctxx) =>
|
|
129
|
+
network.postFormData(
|
|
130
|
+
url,
|
|
131
|
+
jar,
|
|
132
|
+
mergeWithDefaults(form),
|
|
133
|
+
mergeWithDefaults(qs),
|
|
134
|
+
ctx?.globalOptions,
|
|
135
|
+
ctxx || ctx
|
|
136
|
+
),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
module.exports = {
|
|
141
|
+
...require('./axios'),
|
|
142
|
+
...require('./clients'),
|
|
143
|
+
...require('./constants'),
|
|
144
|
+
...require('./formatters'),
|
|
145
|
+
...require('./headers'),
|
|
146
|
+
...require('./user-agents'),
|
|
147
|
+
...require('./antiSuspension'),
|
|
148
|
+
...require('./rateLimiter'),
|
|
149
|
+
json,
|
|
150
|
+
makeDefaults,
|
|
151
|
+
promisify: (func) => util.promisify(func),
|
|
152
|
+
delay: (ms) => new Promise(r => setTimeout(r, ms))
|
|
153
|
+
};
|