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.
Files changed (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3677 -0
  3. package/dist/constants/constants.js +342 -0
  4. package/dist/constants/index.js +58 -0
  5. package/dist/core/client.js +419 -0
  6. package/dist/core/nav-chain.js +282 -0
  7. package/dist/core/repository.js +7 -0
  8. package/dist/core/request.js +390 -0
  9. package/dist/core/state.js +1473 -0
  10. package/dist/core/utils.js +786 -0
  11. package/dist/downloadMedia.js +381 -0
  12. package/dist/errors/index.d.ts +16 -0
  13. package/dist/errors/index.js +38 -0
  14. package/dist/errors/index.js.map +1 -0
  15. package/dist/extend.js +167 -0
  16. package/dist/fbns/fbns.client.d.ts +32 -0
  17. package/dist/fbns/fbns.client.events.d.ts +41 -0
  18. package/dist/fbns/fbns.client.events.js +3 -0
  19. package/dist/fbns/fbns.client.events.js.map +1 -0
  20. package/dist/fbns/fbns.client.js +252 -0
  21. package/dist/fbns/fbns.client.js.map +1 -0
  22. package/dist/fbns/fbns.device-auth.d.ts +17 -0
  23. package/dist/fbns/fbns.device-auth.js +54 -0
  24. package/dist/fbns/fbns.device-auth.js.map +1 -0
  25. package/dist/fbns/fbns.types.d.ts +83 -0
  26. package/dist/fbns/fbns.types.js +3 -0
  27. package/dist/fbns/fbns.types.js.map +1 -0
  28. package/dist/fbns/fbns.utilities.d.ts +2 -0
  29. package/dist/fbns/fbns.utilities.js +79 -0
  30. package/dist/fbns/fbns.utilities.js.map +1 -0
  31. package/dist/fbns/index.d.ts +4 -0
  32. package/dist/fbns/index.js +21 -0
  33. package/dist/fbns/index.js.map +1 -0
  34. package/dist/index.js +139 -0
  35. package/dist/mqtt-shim.d.ts +96 -0
  36. package/dist/mqtt-shim.js +15 -0
  37. package/dist/mqttot/index.d.ts +4 -0
  38. package/dist/mqttot/index.js +21 -0
  39. package/dist/mqttot/index.js.map +1 -0
  40. package/dist/mqttot/mqttot.client.d.ts +39 -0
  41. package/dist/mqttot/mqttot.client.js +318 -0
  42. package/dist/mqttot/mqttot.client.js.map +1 -0
  43. package/dist/mqttot/mqttot.connect.request.packet.d.ts +7 -0
  44. package/dist/mqttot/mqttot.connect.request.packet.js +9 -0
  45. package/dist/mqttot/mqttot.connect.request.packet.js.map +1 -0
  46. package/dist/mqttot/mqttot.connect.response.packet.d.ts +7 -0
  47. package/dist/mqttot/mqttot.connect.response.packet.js +24 -0
  48. package/dist/mqttot/mqttot.connect.response.packet.js.map +1 -0
  49. package/dist/mqttot/mqttot.connection.d.ts +57 -0
  50. package/dist/mqttot/mqttot.connection.js +79 -0
  51. package/dist/mqttot/mqttot.connection.js.map +1 -0
  52. package/dist/package.json +59 -0
  53. package/dist/realtime/commands/commands.d.ts +15 -0
  54. package/dist/realtime/commands/commands.js +71 -0
  55. package/dist/realtime/commands/commands.js.map +1 -0
  56. package/dist/realtime/commands/direct.commands.d.ts +75 -0
  57. package/dist/realtime/commands/direct.commands.js +417 -0
  58. package/dist/realtime/commands/direct.commands.js.map +1 -0
  59. package/dist/realtime/commands/enhanced.direct.commands.js +1731 -0
  60. package/dist/realtime/commands/enhanced.direct.commands.js.bak +967 -0
  61. package/dist/realtime/commands/index.d.ts +2 -0
  62. package/dist/realtime/commands/index.js +20 -0
  63. package/dist/realtime/commands/index.js.map +1 -0
  64. package/dist/realtime/delta-sync.manager.js +293 -0
  65. package/dist/realtime/features/dm-sender.js +88 -0
  66. package/dist/realtime/features/error-handler.js +185 -0
  67. package/dist/realtime/features/gap-handler.js +61 -0
  68. package/dist/realtime/features/persistent-logger.js +186 -0
  69. package/dist/realtime/features/presence.manager.js +66 -0
  70. package/dist/realtime/features/session-health-monitor.js +345 -0
  71. package/dist/realtime/index.js +30 -0
  72. package/dist/realtime/messages/app-presence.event.d.ts +9 -0
  73. package/dist/realtime/messages/app-presence.event.js +3 -0
  74. package/dist/realtime/messages/app-presence.event.js.map +1 -0
  75. package/dist/realtime/messages/index.d.ts +3 -0
  76. package/dist/realtime/messages/index.js +20 -0
  77. package/dist/realtime/messages/index.js.map +1 -0
  78. package/dist/realtime/messages/message-sync.message.d.ts +222 -0
  79. package/dist/realtime/messages/message-sync.message.js +43 -0
  80. package/dist/realtime/messages/message-sync.message.js.map +1 -0
  81. package/dist/realtime/messages/realtime-sub.direct.data.d.ts +11 -0
  82. package/dist/realtime/messages/realtime-sub.direct.data.js +3 -0
  83. package/dist/realtime/messages/realtime-sub.direct.data.js.map +1 -0
  84. package/dist/realtime/messages/thread-update.message.d.ts +68 -0
  85. package/dist/realtime/messages/thread-update.message.js +3 -0
  86. package/dist/realtime/messages/thread-update.message.js.map +1 -0
  87. package/dist/realtime/mixins/index.d.ts +3 -0
  88. package/dist/realtime/mixins/index.js +20 -0
  89. package/dist/realtime/mixins/index.js.map +1 -0
  90. package/dist/realtime/mixins/message-sync.mixin.d.ts +8 -0
  91. package/dist/realtime/mixins/message-sync.mixin.js +596 -0
  92. package/dist/realtime/mixins/message-sync.mixin.js.map +1 -0
  93. package/dist/realtime/mixins/mixin.d.ts +19 -0
  94. package/dist/realtime/mixins/mixin.js +41 -0
  95. package/dist/realtime/mixins/mixin.js.map +1 -0
  96. package/dist/realtime/mixins/presence-typing.mixin.js +33 -0
  97. package/dist/realtime/mixins/realtime-sub.mixin.d.ts +8 -0
  98. package/dist/realtime/mixins/realtime-sub.mixin.js +181 -0
  99. package/dist/realtime/mixins/realtime-sub.mixin.js.map +1 -0
  100. package/dist/realtime/parsers/graphql-parser.js +43 -0
  101. package/dist/realtime/parsers/graphql.parser.d.ts +15 -0
  102. package/dist/realtime/parsers/graphql.parser.js +22 -0
  103. package/dist/realtime/parsers/graphql.parser.js.map +1 -0
  104. package/dist/realtime/parsers/index.d.ts +6 -0
  105. package/dist/realtime/parsers/index.js +23 -0
  106. package/dist/realtime/parsers/index.js.map +1 -0
  107. package/dist/realtime/parsers/iris-parser.js +43 -0
  108. package/dist/realtime/parsers/iris.parser.d.ts +17 -0
  109. package/dist/realtime/parsers/iris.parser.js +10 -0
  110. package/dist/realtime/parsers/iris.parser.js.map +1 -0
  111. package/dist/realtime/parsers/json-parser.js +43 -0
  112. package/dist/realtime/parsers/json.parser.d.ts +6 -0
  113. package/dist/realtime/parsers/json.parser.js +10 -0
  114. package/dist/realtime/parsers/json.parser.js.map +1 -0
  115. package/dist/realtime/parsers/parser.d.ts +9 -0
  116. package/dist/realtime/parsers/parser.js +3 -0
  117. package/dist/realtime/parsers/parser.js.map +1 -0
  118. package/dist/realtime/parsers/region-hint-parser.js +43 -0
  119. package/dist/realtime/parsers/region-hint.parser.d.ts +12 -0
  120. package/dist/realtime/parsers/region-hint.parser.js +15 -0
  121. package/dist/realtime/parsers/region-hint.parser.js.map +1 -0
  122. package/dist/realtime/parsers/skywalker-parser.js +43 -0
  123. package/dist/realtime/parsers/skywalker.parser.d.ts +12 -0
  124. package/dist/realtime/parsers/skywalker.parser.js +15 -0
  125. package/dist/realtime/parsers/skywalker.parser.js.map +1 -0
  126. package/dist/realtime/parsers-advanced.js +158 -0
  127. package/dist/realtime/proto/common.proto +38 -0
  128. package/dist/realtime/proto/direct.proto +65 -0
  129. package/dist/realtime/proto/ig-messages.proto +83 -0
  130. package/dist/realtime/proto/iris.proto +188 -0
  131. package/dist/realtime/proto-parser.js +195 -0
  132. package/dist/realtime/protocols/iris.handshake.js +74 -0
  133. package/dist/realtime/protocols/proto-definitions.js +80 -0
  134. package/dist/realtime/protocols/skywalker.protocol.js +91 -0
  135. package/dist/realtime/realtime.client.events.js +3 -0
  136. package/dist/realtime/realtime.client.js +1915 -0
  137. package/dist/realtime/realtime.service.js +462 -0
  138. package/dist/realtime/reconnect.manager.js +88 -0
  139. package/dist/realtime/session.manager.js +121 -0
  140. package/dist/realtime/subscriptions/graphql.subscription.d.ts +47 -0
  141. package/dist/realtime/subscriptions/graphql.subscription.js +99 -0
  142. package/dist/realtime/subscriptions/graphql.subscription.js.map +1 -0
  143. package/dist/realtime/subscriptions/index.d.ts +2 -0
  144. package/dist/realtime/subscriptions/index.js +19 -0
  145. package/dist/realtime/subscriptions/index.js.map +1 -0
  146. package/dist/realtime/subscriptions/skywalker.subscription.d.ts +4 -0
  147. package/dist/realtime/subscriptions/skywalker.subscription.js +13 -0
  148. package/dist/realtime/subscriptions/skywalker.subscription.js.map +1 -0
  149. package/dist/realtime/topic-map.js +71 -0
  150. package/dist/realtime/topic.js +80 -0
  151. package/dist/repositories/account.repository.js +575 -0
  152. package/dist/repositories/bloks.repository.js +70 -0
  153. package/dist/repositories/captcha.repository.js +44 -0
  154. package/dist/repositories/challenge.repository.js +120 -0
  155. package/dist/repositories/clip.repository.js +165 -0
  156. package/dist/repositories/close-friends.repository.js +46 -0
  157. package/dist/repositories/collection.repository.js +68 -0
  158. package/dist/repositories/direct-thread.repository.js +446 -0
  159. package/dist/repositories/direct.repository.js +232 -0
  160. package/dist/repositories/explore.repository.js +70 -0
  161. package/dist/repositories/fbsearch.repository.js +140 -0
  162. package/dist/repositories/feed.repository.js +245 -0
  163. package/dist/repositories/friendship.repository.js +296 -0
  164. package/dist/repositories/fundraiser.repository.js +49 -0
  165. package/dist/repositories/hashtag.repository.js +99 -0
  166. package/dist/repositories/highlights.repository.js +121 -0
  167. package/dist/repositories/insights.repository.js +82 -0
  168. package/dist/repositories/location.repository.js +84 -0
  169. package/dist/repositories/media.repository.js +395 -0
  170. package/dist/repositories/multiple-accounts.repository.js +41 -0
  171. package/dist/repositories/news.repository.js +35 -0
  172. package/dist/repositories/note.repository.js +57 -0
  173. package/dist/repositories/notification.repository.js +79 -0
  174. package/dist/repositories/share.repository.js +35 -0
  175. package/dist/repositories/signup.repository.js +218 -0
  176. package/dist/repositories/story.repository.js +290 -0
  177. package/dist/repositories/timeline.repository.js +60 -0
  178. package/dist/repositories/totp.repository.js +139 -0
  179. package/dist/repositories/track.repository.js +53 -0
  180. package/dist/repositories/upload.repository.js +204 -0
  181. package/dist/repositories/user.repository.js +360 -0
  182. package/dist/sendmedia/index.js +27 -0
  183. package/dist/sendmedia/sendFile.js +72 -0
  184. package/dist/sendmedia/sendPhoto.js +142 -0
  185. package/dist/sendmedia/sendRavenPhoto.js +153 -0
  186. package/dist/sendmedia/sendRavenVideo.js +158 -0
  187. package/dist/sendmedia/uploadPhoto.js +107 -0
  188. package/dist/sendmedia/uploadfFile.js +130 -0
  189. package/dist/services/live.service.js +139 -0
  190. package/dist/services/search.service.js +115 -0
  191. package/dist/shared/index.js +96 -0
  192. package/dist/shared/shared.js +86 -0
  193. package/dist/thrift/index.d.ts +3 -0
  194. package/dist/thrift/index.js +20 -0
  195. package/dist/thrift/index.js.map +1 -0
  196. package/dist/thrift/thrift.d.ts +59 -0
  197. package/dist/thrift/thrift.js +101 -0
  198. package/dist/thrift/thrift.js.map +1 -0
  199. package/dist/thrift/thrift.reading.d.ts +41 -0
  200. package/dist/thrift/thrift.reading.js +327 -0
  201. package/dist/thrift/thrift.reading.js.map +1 -0
  202. package/dist/thrift/thrift.writing.d.ts +44 -0
  203. package/dist/thrift/thrift.writing.js +342 -0
  204. package/dist/thrift/thrift.writing.js.map +1 -0
  205. package/dist/types/index.js +285 -0
  206. package/dist/useMultiFileAuthState.js +1768 -0
  207. package/dist/utils/helper-1.js +1 -0
  208. package/dist/utils/helper-10.js +1 -0
  209. package/dist/utils/helper-11.js +1 -0
  210. package/dist/utils/helper-12.js +1 -0
  211. package/dist/utils/helper-13.js +1 -0
  212. package/dist/utils/helper-14.js +1 -0
  213. package/dist/utils/helper-15.js +1 -0
  214. package/dist/utils/helper-16.js +1 -0
  215. package/dist/utils/helper-17.js +1 -0
  216. package/dist/utils/helper-18.js +1 -0
  217. package/dist/utils/helper-19.js +1 -0
  218. package/dist/utils/helper-2.js +1 -0
  219. package/dist/utils/helper-20.js +1 -0
  220. package/dist/utils/helper-21.js +1 -0
  221. package/dist/utils/helper-22.js +1 -0
  222. package/dist/utils/helper-23.js +1 -0
  223. package/dist/utils/helper-24.js +1 -0
  224. package/dist/utils/helper-25.js +1 -0
  225. package/dist/utils/helper-26.js +1 -0
  226. package/dist/utils/helper-27.js +1 -0
  227. package/dist/utils/helper-28.js +1 -0
  228. package/dist/utils/helper-29.js +1 -0
  229. package/dist/utils/helper-3.js +1 -0
  230. package/dist/utils/helper-30.js +1 -0
  231. package/dist/utils/helper-4.js +1 -0
  232. package/dist/utils/helper-5.js +1 -0
  233. package/dist/utils/helper-6.js +1 -0
  234. package/dist/utils/helper-7.js +1 -0
  235. package/dist/utils/helper-8.js +1 -0
  236. package/dist/utils/helper-9.js +1 -0
  237. package/dist/utils/index.js +280 -0
  238. package/dist/utils/insta-mqtt-helper.js +128 -0
  239. package/examples/listen-to-messages.js +86 -0
  240. 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
+