nodejs-insta-private-api-mqt 1.3.70
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/LICENSE +21 -0
- package/README.md +3677 -0
- package/dist/constants/constants.js +342 -0
- package/dist/constants/index.js +58 -0
- package/dist/core/client.js +419 -0
- package/dist/core/nav-chain.js +282 -0
- package/dist/core/repository.js +7 -0
- package/dist/core/request.js +390 -0
- package/dist/core/state.js +1473 -0
- package/dist/core/utils.js +786 -0
- package/dist/downloadMedia.js +381 -0
- package/dist/errors/index.d.ts +16 -0
- package/dist/errors/index.js +38 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/extend.js +167 -0
- package/dist/fbns/fbns.client.d.ts +32 -0
- package/dist/fbns/fbns.client.events.d.ts +41 -0
- package/dist/fbns/fbns.client.events.js +3 -0
- package/dist/fbns/fbns.client.events.js.map +1 -0
- package/dist/fbns/fbns.client.js +252 -0
- package/dist/fbns/fbns.client.js.map +1 -0
- package/dist/fbns/fbns.device-auth.d.ts +17 -0
- package/dist/fbns/fbns.device-auth.js +54 -0
- package/dist/fbns/fbns.device-auth.js.map +1 -0
- package/dist/fbns/fbns.types.d.ts +83 -0
- package/dist/fbns/fbns.types.js +3 -0
- package/dist/fbns/fbns.types.js.map +1 -0
- package/dist/fbns/fbns.utilities.d.ts +2 -0
- package/dist/fbns/fbns.utilities.js +79 -0
- package/dist/fbns/fbns.utilities.js.map +1 -0
- package/dist/fbns/index.d.ts +4 -0
- package/dist/fbns/index.js +21 -0
- package/dist/fbns/index.js.map +1 -0
- package/dist/index.js +139 -0
- package/dist/mqtt-shim.d.ts +96 -0
- package/dist/mqtt-shim.js +15 -0
- package/dist/mqttot/index.d.ts +4 -0
- package/dist/mqttot/index.js +21 -0
- package/dist/mqttot/index.js.map +1 -0
- package/dist/mqttot/mqttot.client.d.ts +39 -0
- package/dist/mqttot/mqttot.client.js +318 -0
- package/dist/mqttot/mqttot.client.js.map +1 -0
- package/dist/mqttot/mqttot.connect.request.packet.d.ts +7 -0
- package/dist/mqttot/mqttot.connect.request.packet.js +9 -0
- package/dist/mqttot/mqttot.connect.request.packet.js.map +1 -0
- package/dist/mqttot/mqttot.connect.response.packet.d.ts +7 -0
- package/dist/mqttot/mqttot.connect.response.packet.js +24 -0
- package/dist/mqttot/mqttot.connect.response.packet.js.map +1 -0
- package/dist/mqttot/mqttot.connection.d.ts +57 -0
- package/dist/mqttot/mqttot.connection.js +79 -0
- package/dist/mqttot/mqttot.connection.js.map +1 -0
- package/dist/package.json +59 -0
- package/dist/realtime/commands/commands.d.ts +15 -0
- package/dist/realtime/commands/commands.js +71 -0
- package/dist/realtime/commands/commands.js.map +1 -0
- package/dist/realtime/commands/direct.commands.d.ts +75 -0
- package/dist/realtime/commands/direct.commands.js +417 -0
- package/dist/realtime/commands/direct.commands.js.map +1 -0
- package/dist/realtime/commands/enhanced.direct.commands.js +1731 -0
- package/dist/realtime/commands/enhanced.direct.commands.js.bak +967 -0
- package/dist/realtime/commands/index.d.ts +2 -0
- package/dist/realtime/commands/index.js +20 -0
- package/dist/realtime/commands/index.js.map +1 -0
- package/dist/realtime/delta-sync.manager.js +293 -0
- package/dist/realtime/features/dm-sender.js +88 -0
- package/dist/realtime/features/error-handler.js +185 -0
- package/dist/realtime/features/gap-handler.js +61 -0
- package/dist/realtime/features/persistent-logger.js +186 -0
- package/dist/realtime/features/presence.manager.js +66 -0
- package/dist/realtime/features/session-health-monitor.js +345 -0
- package/dist/realtime/index.js +30 -0
- package/dist/realtime/messages/app-presence.event.d.ts +9 -0
- package/dist/realtime/messages/app-presence.event.js +3 -0
- package/dist/realtime/messages/app-presence.event.js.map +1 -0
- package/dist/realtime/messages/index.d.ts +3 -0
- package/dist/realtime/messages/index.js +20 -0
- package/dist/realtime/messages/index.js.map +1 -0
- package/dist/realtime/messages/message-sync.message.d.ts +222 -0
- package/dist/realtime/messages/message-sync.message.js +43 -0
- package/dist/realtime/messages/message-sync.message.js.map +1 -0
- package/dist/realtime/messages/realtime-sub.direct.data.d.ts +11 -0
- package/dist/realtime/messages/realtime-sub.direct.data.js +3 -0
- package/dist/realtime/messages/realtime-sub.direct.data.js.map +1 -0
- package/dist/realtime/messages/thread-update.message.d.ts +68 -0
- package/dist/realtime/messages/thread-update.message.js +3 -0
- package/dist/realtime/messages/thread-update.message.js.map +1 -0
- package/dist/realtime/mixins/index.d.ts +3 -0
- package/dist/realtime/mixins/index.js +20 -0
- package/dist/realtime/mixins/index.js.map +1 -0
- package/dist/realtime/mixins/message-sync.mixin.d.ts +8 -0
- package/dist/realtime/mixins/message-sync.mixin.js +596 -0
- package/dist/realtime/mixins/message-sync.mixin.js.map +1 -0
- package/dist/realtime/mixins/mixin.d.ts +19 -0
- package/dist/realtime/mixins/mixin.js +41 -0
- package/dist/realtime/mixins/mixin.js.map +1 -0
- package/dist/realtime/mixins/presence-typing.mixin.js +33 -0
- package/dist/realtime/mixins/realtime-sub.mixin.d.ts +8 -0
- package/dist/realtime/mixins/realtime-sub.mixin.js +181 -0
- package/dist/realtime/mixins/realtime-sub.mixin.js.map +1 -0
- package/dist/realtime/parsers/graphql-parser.js +43 -0
- package/dist/realtime/parsers/graphql.parser.d.ts +15 -0
- package/dist/realtime/parsers/graphql.parser.js +22 -0
- package/dist/realtime/parsers/graphql.parser.js.map +1 -0
- package/dist/realtime/parsers/index.d.ts +6 -0
- package/dist/realtime/parsers/index.js +23 -0
- package/dist/realtime/parsers/index.js.map +1 -0
- package/dist/realtime/parsers/iris-parser.js +43 -0
- package/dist/realtime/parsers/iris.parser.d.ts +17 -0
- package/dist/realtime/parsers/iris.parser.js +10 -0
- package/dist/realtime/parsers/iris.parser.js.map +1 -0
- package/dist/realtime/parsers/json-parser.js +43 -0
- package/dist/realtime/parsers/json.parser.d.ts +6 -0
- package/dist/realtime/parsers/json.parser.js +10 -0
- package/dist/realtime/parsers/json.parser.js.map +1 -0
- package/dist/realtime/parsers/parser.d.ts +9 -0
- package/dist/realtime/parsers/parser.js +3 -0
- package/dist/realtime/parsers/parser.js.map +1 -0
- package/dist/realtime/parsers/region-hint-parser.js +43 -0
- package/dist/realtime/parsers/region-hint.parser.d.ts +12 -0
- package/dist/realtime/parsers/region-hint.parser.js +15 -0
- package/dist/realtime/parsers/region-hint.parser.js.map +1 -0
- package/dist/realtime/parsers/skywalker-parser.js +43 -0
- package/dist/realtime/parsers/skywalker.parser.d.ts +12 -0
- package/dist/realtime/parsers/skywalker.parser.js +15 -0
- package/dist/realtime/parsers/skywalker.parser.js.map +1 -0
- package/dist/realtime/parsers-advanced.js +158 -0
- package/dist/realtime/proto/common.proto +38 -0
- package/dist/realtime/proto/direct.proto +65 -0
- package/dist/realtime/proto/ig-messages.proto +83 -0
- package/dist/realtime/proto/iris.proto +188 -0
- package/dist/realtime/proto-parser.js +195 -0
- package/dist/realtime/protocols/iris.handshake.js +74 -0
- package/dist/realtime/protocols/proto-definitions.js +80 -0
- package/dist/realtime/protocols/skywalker.protocol.js +91 -0
- package/dist/realtime/realtime.client.events.js +3 -0
- package/dist/realtime/realtime.client.js +1915 -0
- package/dist/realtime/realtime.service.js +462 -0
- package/dist/realtime/reconnect.manager.js +88 -0
- package/dist/realtime/session.manager.js +121 -0
- package/dist/realtime/subscriptions/graphql.subscription.d.ts +47 -0
- package/dist/realtime/subscriptions/graphql.subscription.js +99 -0
- package/dist/realtime/subscriptions/graphql.subscription.js.map +1 -0
- package/dist/realtime/subscriptions/index.d.ts +2 -0
- package/dist/realtime/subscriptions/index.js +19 -0
- package/dist/realtime/subscriptions/index.js.map +1 -0
- package/dist/realtime/subscriptions/skywalker.subscription.d.ts +4 -0
- package/dist/realtime/subscriptions/skywalker.subscription.js +13 -0
- package/dist/realtime/subscriptions/skywalker.subscription.js.map +1 -0
- package/dist/realtime/topic-map.js +71 -0
- package/dist/realtime/topic.js +80 -0
- package/dist/repositories/account.repository.js +575 -0
- package/dist/repositories/bloks.repository.js +70 -0
- package/dist/repositories/captcha.repository.js +44 -0
- package/dist/repositories/challenge.repository.js +120 -0
- package/dist/repositories/clip.repository.js +165 -0
- package/dist/repositories/close-friends.repository.js +46 -0
- package/dist/repositories/collection.repository.js +68 -0
- package/dist/repositories/direct-thread.repository.js +446 -0
- package/dist/repositories/direct.repository.js +232 -0
- package/dist/repositories/explore.repository.js +70 -0
- package/dist/repositories/fbsearch.repository.js +140 -0
- package/dist/repositories/feed.repository.js +245 -0
- package/dist/repositories/friendship.repository.js +296 -0
- package/dist/repositories/fundraiser.repository.js +49 -0
- package/dist/repositories/hashtag.repository.js +99 -0
- package/dist/repositories/highlights.repository.js +121 -0
- package/dist/repositories/insights.repository.js +82 -0
- package/dist/repositories/location.repository.js +84 -0
- package/dist/repositories/media.repository.js +395 -0
- package/dist/repositories/multiple-accounts.repository.js +41 -0
- package/dist/repositories/news.repository.js +35 -0
- package/dist/repositories/note.repository.js +57 -0
- package/dist/repositories/notification.repository.js +79 -0
- package/dist/repositories/share.repository.js +35 -0
- package/dist/repositories/signup.repository.js +218 -0
- package/dist/repositories/story.repository.js +290 -0
- package/dist/repositories/timeline.repository.js +60 -0
- package/dist/repositories/totp.repository.js +139 -0
- package/dist/repositories/track.repository.js +53 -0
- package/dist/repositories/upload.repository.js +204 -0
- package/dist/repositories/user.repository.js +360 -0
- package/dist/sendmedia/index.js +27 -0
- package/dist/sendmedia/sendFile.js +72 -0
- package/dist/sendmedia/sendPhoto.js +142 -0
- package/dist/sendmedia/sendRavenPhoto.js +153 -0
- package/dist/sendmedia/sendRavenVideo.js +158 -0
- package/dist/sendmedia/uploadPhoto.js +107 -0
- package/dist/sendmedia/uploadfFile.js +130 -0
- package/dist/services/live.service.js +139 -0
- package/dist/services/search.service.js +115 -0
- package/dist/shared/index.js +96 -0
- package/dist/shared/shared.js +86 -0
- package/dist/thrift/index.d.ts +3 -0
- package/dist/thrift/index.js +20 -0
- package/dist/thrift/index.js.map +1 -0
- package/dist/thrift/thrift.d.ts +59 -0
- package/dist/thrift/thrift.js +101 -0
- package/dist/thrift/thrift.js.map +1 -0
- package/dist/thrift/thrift.reading.d.ts +41 -0
- package/dist/thrift/thrift.reading.js +327 -0
- package/dist/thrift/thrift.reading.js.map +1 -0
- package/dist/thrift/thrift.writing.d.ts +44 -0
- package/dist/thrift/thrift.writing.js +342 -0
- package/dist/thrift/thrift.writing.js.map +1 -0
- package/dist/types/index.js +285 -0
- package/dist/useMultiFileAuthState.js +1768 -0
- package/dist/utils/helper-1.js +1 -0
- package/dist/utils/helper-10.js +1 -0
- package/dist/utils/helper-11.js +1 -0
- package/dist/utils/helper-12.js +1 -0
- package/dist/utils/helper-13.js +1 -0
- package/dist/utils/helper-14.js +1 -0
- package/dist/utils/helper-15.js +1 -0
- package/dist/utils/helper-16.js +1 -0
- package/dist/utils/helper-17.js +1 -0
- package/dist/utils/helper-18.js +1 -0
- package/dist/utils/helper-19.js +1 -0
- package/dist/utils/helper-2.js +1 -0
- package/dist/utils/helper-20.js +1 -0
- package/dist/utils/helper-21.js +1 -0
- package/dist/utils/helper-22.js +1 -0
- package/dist/utils/helper-23.js +1 -0
- package/dist/utils/helper-24.js +1 -0
- package/dist/utils/helper-25.js +1 -0
- package/dist/utils/helper-26.js +1 -0
- package/dist/utils/helper-27.js +1 -0
- package/dist/utils/helper-28.js +1 -0
- package/dist/utils/helper-29.js +1 -0
- package/dist/utils/helper-3.js +1 -0
- package/dist/utils/helper-30.js +1 -0
- package/dist/utils/helper-4.js +1 -0
- package/dist/utils/helper-5.js +1 -0
- package/dist/utils/helper-6.js +1 -0
- package/dist/utils/helper-7.js +1 -0
- package/dist/utils/helper-8.js +1 -0
- package/dist/utils/helper-9.js +1 -0
- package/dist/utils/index.js +280 -0
- package/dist/utils/insta-mqtt-helper.js +128 -0
- package/examples/listen-to-messages.js +86 -0
- package/package.json +82 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* request.fixed.js
|
|
3
|
+
*
|
|
4
|
+
* Repaired Request wrapper for nodejs-insta-private-api(-mqtt).
|
|
5
|
+
* Changes / fixes applied:
|
|
6
|
+
* - Removed global Content-Type header (was forcing urlencoded for all requests).
|
|
7
|
+
* - Made axios timeout configurable via client.state.requestTimeout (fallback 120s).
|
|
8
|
+
* - Set maxContentLength / maxBodyLength = Infinity to allow binary uploads.
|
|
9
|
+
* - Accept both `data` and `body` when callers pass payload; ensures axios receives `data`.
|
|
10
|
+
* - Preserve ability to pass signal (AbortController) through axios config.
|
|
11
|
+
* - Keep updateState / cookie handling intact.
|
|
12
|
+
*
|
|
13
|
+
* Replace the original request.js with this file (or apply same changes).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const axios = require('axios');
|
|
17
|
+
const crypto = require('crypto');
|
|
18
|
+
const { random } = require('lodash');
|
|
19
|
+
const NavChainManager = require('./nav-chain');
|
|
20
|
+
|
|
21
|
+
class Request {
|
|
22
|
+
constructor(client) {
|
|
23
|
+
this.client = client;
|
|
24
|
+
this.end$ = { complete: () => {} };
|
|
25
|
+
this.error$ = { complete: () => {} };
|
|
26
|
+
this.navChain = new NavChainManager();
|
|
27
|
+
|
|
28
|
+
// Determine timeout: prefer client.state.requestTimeout if provided, otherwise 120s
|
|
29
|
+
const timeoutMs = (this.client && this.client.state && this.client.state.requestTimeout)
|
|
30
|
+
? this.client.state.requestTimeout
|
|
31
|
+
: 120000;
|
|
32
|
+
|
|
33
|
+
// Create axios instance with sensible defaults for uploads
|
|
34
|
+
this.httpClient = axios.create({
|
|
35
|
+
baseURL: 'https://i.instagram.com/',
|
|
36
|
+
timeout: timeoutMs,
|
|
37
|
+
// Allow large uploads
|
|
38
|
+
maxContentLength: Infinity,
|
|
39
|
+
maxBodyLength: Infinity,
|
|
40
|
+
// Do not set a global Content-Type here -- requests will set their own appropriate Content-Type
|
|
41
|
+
// headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Optional: you can add interceptors for debugging if needed
|
|
45
|
+
// this.httpClient.interceptors.response.use(resp => resp, err => Promise.reject(err));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
signature(data) {
|
|
49
|
+
return 'SIGNATURE';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
sign(payload) {
|
|
53
|
+
const json = typeof payload === 'object' ? JSON.stringify(payload) : payload;
|
|
54
|
+
return {
|
|
55
|
+
signed_body: `SIGNATURE.${json}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
userBreadcrumb(size) {
|
|
60
|
+
const term = random(2, 3) * 1000 + size + random(15, 20) * 1000;
|
|
61
|
+
const textChangeEventCount = Math.round(size / random(2, 3)) || 1;
|
|
62
|
+
const data = `${size} ${term} ${textChangeEventCount} ${Date.now()}`;
|
|
63
|
+
const signature = Buffer.from(
|
|
64
|
+
crypto.createHmac('sha256', this.client.state.userBreadcrumbKey)
|
|
65
|
+
.update(data)
|
|
66
|
+
.digest('hex'),
|
|
67
|
+
).toString('base64');
|
|
68
|
+
const body = Buffer.from(data).toString('base64');
|
|
69
|
+
return `${signature}\n${body}\n`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Send a request.
|
|
74
|
+
* options should follow axios request config shape but this wrapper supports:
|
|
75
|
+
* - options.form -> object (will be turned into application/x-www-form-urlencoded)
|
|
76
|
+
* - options.qs -> query params
|
|
77
|
+
* - options.data or options.body -> request payload (we prefer data)
|
|
78
|
+
*/
|
|
79
|
+
async send(options = {}) {
|
|
80
|
+
const requestUrl = options.url || options.path || options.uri || '';
|
|
81
|
+
this._autoUpdateNavChain(requestUrl, (options.method || 'GET').toUpperCase());
|
|
82
|
+
|
|
83
|
+
// base axios config
|
|
84
|
+
const config = {
|
|
85
|
+
url: requestUrl,
|
|
86
|
+
method: (options.method || 'GET').toUpperCase(),
|
|
87
|
+
headers: {
|
|
88
|
+
...this.getDefaultHeaders(),
|
|
89
|
+
...(options.headers || {})
|
|
90
|
+
},
|
|
91
|
+
// allow override of responseType if needed
|
|
92
|
+
responseType: options.responseType || undefined,
|
|
93
|
+
// allow axios to handle decompress etc.
|
|
94
|
+
decompress: options.decompress !== undefined ? options.decompress : true,
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Query string / params
|
|
98
|
+
if (options.qs) {
|
|
99
|
+
config.params = options.qs;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Abort signal support (axios v0.22+ supports signal)
|
|
103
|
+
if (options.signal) {
|
|
104
|
+
config.signal = options.signal;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Handle form data (application/x-www-form-urlencoded)
|
|
108
|
+
if (options.form && (config.method === 'POST' || config.method === 'PUT' || config.method === 'PATCH')) {
|
|
109
|
+
// Build a urlencoded string
|
|
110
|
+
const formData = new URLSearchParams();
|
|
111
|
+
Object.keys(options.form).forEach(key => {
|
|
112
|
+
const val = options.form[key];
|
|
113
|
+
// For arrays/objects convert to JSON string to be safe
|
|
114
|
+
if (typeof val === 'object') {
|
|
115
|
+
formData.append(key, JSON.stringify(val));
|
|
116
|
+
} else {
|
|
117
|
+
formData.append(key, String(val));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
config.data = formData.toString();
|
|
121
|
+
config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
|
|
122
|
+
} else {
|
|
123
|
+
// If caller supplied data or body, prefer data
|
|
124
|
+
if (options.data !== undefined) {
|
|
125
|
+
config.data = options.data;
|
|
126
|
+
} else if (options.body !== undefined) {
|
|
127
|
+
// Accept legacy 'body' name used in some wrappers: ensure binary stays as-is
|
|
128
|
+
config.data = options.body;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// If caller explicitly passed paramsSerializer (rare), keep it
|
|
133
|
+
if (options.paramsSerializer) {
|
|
134
|
+
config.paramsSerializer = options.paramsSerializer;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
// Use axios instance
|
|
139
|
+
const response = await this.httpClient.request(config);
|
|
140
|
+
// Update internal client state (cookies, headers, auth, etc.)
|
|
141
|
+
this.updateState(response);
|
|
142
|
+
|
|
143
|
+
// Normalize success check: either HTTP 200 or response.data.status === 'ok'
|
|
144
|
+
const data = response.data;
|
|
145
|
+
if ((data && data.status && data.status === 'ok') || response.status === 200 || response.status === 201) {
|
|
146
|
+
return { body: data, headers: response.headers, status: response.status };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// If not explicitly ok, throw a processed error
|
|
150
|
+
throw this.handleResponseError(response);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
// If axios error with response, map to IG-specific errors
|
|
153
|
+
if (error && error.response) {
|
|
154
|
+
throw this.handleResponseError(error.response);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Re-throw axios error (timeout, network, abort, etc.)
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
updateState(response) {
|
|
163
|
+
const headers = response.headers || {};
|
|
164
|
+
|
|
165
|
+
if (headers['x-ig-set-www-claim']) {
|
|
166
|
+
this.client.state.igWWWClaim = headers['x-ig-set-www-claim'];
|
|
167
|
+
}
|
|
168
|
+
if (headers['ig-set-authorization'] && !headers['ig-set-authorization'].endsWith(':')) {
|
|
169
|
+
this.client.state.authorization = headers['ig-set-authorization'];
|
|
170
|
+
}
|
|
171
|
+
if (headers['ig-set-password-encryption-key-id']) {
|
|
172
|
+
this.client.state.passwordEncryptionKeyId = headers['ig-set-password-encryption-key-id'];
|
|
173
|
+
}
|
|
174
|
+
if (headers['ig-set-password-encryption-pub-key']) {
|
|
175
|
+
this.client.state.passwordEncryptionPubKey = headers['ig-set-password-encryption-pub-key'];
|
|
176
|
+
}
|
|
177
|
+
const mid = headers['ig-set-x-mid'];
|
|
178
|
+
if (mid) {
|
|
179
|
+
this.client.state.mid = mid;
|
|
180
|
+
}
|
|
181
|
+
const igURur = headers['ig-set-ig-u-rur'];
|
|
182
|
+
if (igURur) {
|
|
183
|
+
this.client.state.igURur = igURur;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Update cookies from Set-Cookie headers (if cookieJar is available)
|
|
187
|
+
const setCookieHeaders = headers['set-cookie'] || headers['Set-Cookie'];
|
|
188
|
+
if (setCookieHeaders && Array.isArray(setCookieHeaders) && this.client.state && this.client.state.cookieStore && typeof this.client.state.cookieStore.setCookieSync === 'function') {
|
|
189
|
+
setCookieHeaders.forEach(cookieString => {
|
|
190
|
+
try {
|
|
191
|
+
// host constant fallback if available
|
|
192
|
+
const host = (this.client.state.constants && this.client.state.constants.HOST) ? this.client.state.constants.HOST : 'https://i.instagram.com';
|
|
193
|
+
this.client.state.cookieStore.setCookieSync(cookieString, host);
|
|
194
|
+
} catch (e) {
|
|
195
|
+
// ignore cookie parsing errors
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
handleResponseError(response) {
|
|
202
|
+
const data = response.data || {};
|
|
203
|
+
const status = response.status;
|
|
204
|
+
|
|
205
|
+
if (data && data.spam) {
|
|
206
|
+
const error = new Error('Action blocked as spam');
|
|
207
|
+
error.name = 'IgActionSpamError';
|
|
208
|
+
error.response = response;
|
|
209
|
+
return error;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (status === 404) {
|
|
213
|
+
const error = new Error('Not found');
|
|
214
|
+
error.name = 'IgNotFoundError';
|
|
215
|
+
error.response = response;
|
|
216
|
+
return error;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (data && data.message === 'challenge_required') {
|
|
220
|
+
this.client.state.checkpoint = data;
|
|
221
|
+
const error = new Error('Challenge required');
|
|
222
|
+
error.name = 'IgCheckpointError';
|
|
223
|
+
error.response = response;
|
|
224
|
+
return error;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (data && data.message === 'user_has_logged_out') {
|
|
228
|
+
const error = new Error('User has logged out');
|
|
229
|
+
error.name = 'IgUserHasLoggedOutError';
|
|
230
|
+
error.response = response;
|
|
231
|
+
return error;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (data && data.message === 'login_required') {
|
|
235
|
+
const error = new Error('Login required');
|
|
236
|
+
error.name = 'IgLoginRequiredError';
|
|
237
|
+
error.response = response;
|
|
238
|
+
return error;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (data && data.error_type === 'sentry_block') {
|
|
242
|
+
const error = new Error('Sentry block');
|
|
243
|
+
error.name = 'IgSentryBlockError';
|
|
244
|
+
error.response = response;
|
|
245
|
+
return error;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (data && data.error_type === 'inactive user') {
|
|
249
|
+
const error = new Error('Inactive user');
|
|
250
|
+
error.name = 'IgInactiveUserError';
|
|
251
|
+
error.response = response;
|
|
252
|
+
return error;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const error = new Error((data && data.message) ? data.message : 'Request failed');
|
|
256
|
+
error.name = 'IgResponseError';
|
|
257
|
+
error.response = response;
|
|
258
|
+
error.status = status;
|
|
259
|
+
error.data = data;
|
|
260
|
+
return error;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
_autoUpdateNavChain(url, method) {
|
|
264
|
+
if (!url) return;
|
|
265
|
+
const path = url.toLowerCase();
|
|
266
|
+
|
|
267
|
+
if (path.includes('/accounts/login/') || path.includes('/launcher/sync/')) {
|
|
268
|
+
this.navChain.simulateAppOpen();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (path.includes('/direct_v2/inbox/') || path.includes('/direct_v2/pending_inbox/') || path.includes('/direct_v2/ranked_recipients/')) {
|
|
273
|
+
this.navChain.navigateToInbox();
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (path.includes('/direct_v2/threads/broadcast/')) {
|
|
278
|
+
this.navChain.getChainForDMBroadcast();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (path.includes('/direct_v2/threads/') && !path.includes('broadcast')) {
|
|
283
|
+
if (path.includes('/seen/') || path.includes('/items/')) {
|
|
284
|
+
this.navChain.incrementForAction();
|
|
285
|
+
} else {
|
|
286
|
+
this.navChain.navigateToThread();
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (path.includes('/direct_v2/get_presence/')) {
|
|
292
|
+
this.navChain.incrementForAction();
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (path.includes('/feed/timeline/') || path.includes('/feed/reels_tray/')) {
|
|
297
|
+
this.navChain.navigateToFeed();
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (path.includes('/users/') && path.includes('/info/')) {
|
|
302
|
+
this.navChain.incrementForAction();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (path.includes('/explore/')) {
|
|
307
|
+
this.navChain.navigateToExplore();
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (path.includes('/accounts/current_user/') || path.includes('/users/self/')) {
|
|
312
|
+
this.navChain.navigateToProfile(true);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (method === 'POST') {
|
|
317
|
+
this.navChain.incrementForAction();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
getDefaultHeaders() {
|
|
322
|
+
const state = this.client.state;
|
|
323
|
+
const locale = (state.locale || state.language || 'en_US').replace('-', '_');
|
|
324
|
+
const lang = locale.replace('_', '-');
|
|
325
|
+
const acceptLanguage = lang === 'en-US' ? 'en-US' : `${lang}, en-US`;
|
|
326
|
+
const userId = (() => {
|
|
327
|
+
try { return state.cookieUserId; } catch { return 0; }
|
|
328
|
+
})();
|
|
329
|
+
|
|
330
|
+
const headers = {
|
|
331
|
+
'X-IG-App-Locale': locale,
|
|
332
|
+
'X-IG-Device-Locale': locale,
|
|
333
|
+
'X-IG-Mapped-Locale': locale,
|
|
334
|
+
'X-Pigeon-Session-Id': `UFS-${state.pigeonSessionId}-1`,
|
|
335
|
+
'X-Pigeon-Rawclienttime': (Date.now() / 1000).toFixed(3),
|
|
336
|
+
'X-IG-Bandwidth-Speed-KBPS': (random(2500000, 3000000) / 1000).toFixed(3),
|
|
337
|
+
'X-IG-Bandwidth-TotalBytes-B': String(random(5000000, 90000000)),
|
|
338
|
+
'X-IG-Bandwidth-TotalTime-MS': String(random(2000, 9000)),
|
|
339
|
+
'X-IG-App-Startup-Country': (state.country || 'US').toUpperCase(),
|
|
340
|
+
'X-Bloks-Version-Id': state.bloksVersionId,
|
|
341
|
+
'X-IG-WWW-Claim': state.igWWWClaim || '0',
|
|
342
|
+
'X-Bloks-Is-Layout-RTL': 'false',
|
|
343
|
+
'X-Bloks-Is-Panorama-Enabled': 'true',
|
|
344
|
+
'X-IG-Device-ID': state.uuid,
|
|
345
|
+
'X-IG-Family-Device-ID': state.phoneId,
|
|
346
|
+
'X-IG-Android-ID': state.deviceId,
|
|
347
|
+
'X-IG-Timezone-Offset': String(state.timezoneOffset),
|
|
348
|
+
'X-IG-Connection-Type': state.connectionTypeHeader || 'WIFI',
|
|
349
|
+
'X-IG-Capabilities': state.capabilitiesHeader || '3brTvx0=',
|
|
350
|
+
'X-IG-App-ID': state.fbAnalyticsApplicationId,
|
|
351
|
+
'Priority': 'u=3',
|
|
352
|
+
'User-Agent': state.appUserAgent,
|
|
353
|
+
'Accept-Language': acceptLanguage,
|
|
354
|
+
'X-MID': state.mid || '',
|
|
355
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
356
|
+
'Host': 'i.instagram.com',
|
|
357
|
+
'X-FB-HTTP-Engine': 'Liger',
|
|
358
|
+
'Connection': 'keep-alive',
|
|
359
|
+
'X-FB-Client-IP': 'True',
|
|
360
|
+
'X-FB-Server-Cluster': 'True',
|
|
361
|
+
'IG-INTENDED-USER-ID': String(userId || 0),
|
|
362
|
+
'X-IG-Nav-Chain': this.navChain.getChainString(),
|
|
363
|
+
'X-IG-SALT-IDS': String(random(1061162222, 1061262222)),
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
if (state.authorization) {
|
|
367
|
+
headers['Authorization'] = state.authorization;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
if (userId && userId !== 0 && userId !== '0') {
|
|
371
|
+
const nextYear = Math.floor(Date.now() / 1000) + 31536000;
|
|
372
|
+
headers['IG-U-DS-USER-ID'] = String(userId);
|
|
373
|
+
headers['IG-U-IG-DIRECT-REGION-HINT'] = `LLA,${userId},${nextYear}:01f7bae7d8b131877d8e0ae1493252280d72f6d0d554447cb1dc9049b6b2c507c08605b7`;
|
|
374
|
+
headers['IG-U-SHBID'] = `12695,${userId},${nextYear}:01f778d9c9f7546cf3722578fbf9b85143cd6e5132723e5c93f40f55ca0459c8ef8a0d9f`;
|
|
375
|
+
headers['IG-U-SHBTS'] = `${Math.floor(Date.now() / 1000)},${userId},${nextYear}:01f7ace11925d0388080078d0282b75b8059844855da27e23c90a362270fddfb3fae7e28`;
|
|
376
|
+
headers['IG-U-RUR'] = `RVA,${userId},${nextYear}:01f7f627f9ae4ce2874b2e04463efdb184340968b1b006fa88cb4cc69a942a04201e544c`;
|
|
377
|
+
}
|
|
378
|
+
if (state.igURur) {
|
|
379
|
+
headers['IG-U-RUR'] = state.igURur;
|
|
380
|
+
}
|
|
381
|
+
if (state.igWWWClaim) {
|
|
382
|
+
headers['X-IG-WWW-Claim'] = state.igWWWClaim;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return headers;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
module.exports = Request;
|
|
390
|
+
|