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,84 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ class LocationRepository extends Repository {
4
+ async info(locationId) {
5
+ const response = await this.client.request.send({
6
+ method: 'GET',
7
+ url: `/api/v1/locations/${locationId}/info/`,
8
+ });
9
+
10
+ return response.body;
11
+ }
12
+
13
+ async search(query, lat, lng) {
14
+ const qs = {
15
+ search_query: query,
16
+ rank_token: this.client.state.uuid,
17
+ };
18
+
19
+ if (lat && lng) {
20
+ qs.latitude = lat;
21
+ qs.longitude = lng;
22
+ }
23
+
24
+ const response = await this.client.request.send({
25
+ method: 'GET',
26
+ url: '/api/v1/location_search/',
27
+ qs
28
+ });
29
+
30
+ return response.body;
31
+ }
32
+
33
+ async searchByCoordinates(lat, lng) {
34
+ const response = await this.client.request.send({
35
+ method: 'GET',
36
+ url: '/api/v1/location_search/',
37
+ qs: {
38
+ latitude: lat,
39
+ longitude: lng,
40
+ rank_token: this.client.state.uuid,
41
+ }
42
+ });
43
+
44
+ return response.body;
45
+ }
46
+
47
+ async getFeed(locationId, maxId = null) {
48
+ const qs = {
49
+ rank_token: this.client.state.uuid
50
+ };
51
+
52
+ if (maxId) {
53
+ qs.max_id = maxId;
54
+ }
55
+
56
+ const response = await this.client.request.send({
57
+ method: 'GET',
58
+ url: `/api/v1/feed/location/${locationId}/`,
59
+ qs
60
+ });
61
+
62
+ return response.body;
63
+ }
64
+
65
+ async getStories(locationId) {
66
+ const response = await this.client.request.send({
67
+ method: 'GET',
68
+ url: `/api/v1/locations/${locationId}/story/`,
69
+ });
70
+
71
+ return response.body;
72
+ }
73
+
74
+ async getRelated(locationId) {
75
+ const response = await this.client.request.send({
76
+ method: 'GET',
77
+ url: `/api/v1/locations/${locationId}/related/`,
78
+ });
79
+
80
+ return response.body;
81
+ }
82
+ }
83
+
84
+ module.exports = LocationRepository;
@@ -0,0 +1,395 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
4
+
5
+ class MediaRepository extends Repository {
6
+ async info(mediaId) {
7
+ const response = await this.client.request.send({
8
+ url: `/api/v1/media/${mediaId}/info/`,
9
+ method: 'GET',
10
+ });
11
+ return response.body;
12
+ }
13
+
14
+ async like(mediaId, moduleInfo = { module_name: 'feed_timeline' }) {
15
+ const response = await this.client.request.send({
16
+ url: `/api/v1/media/${mediaId}/like/`,
17
+ method: 'POST',
18
+ form: this.client.request.sign({
19
+ media_id: mediaId,
20
+ _uid: this.client.state.cookieUserId,
21
+ _uuid: this.client.state.uuid,
22
+ radio_type: this.client.state.radioType,
23
+ module_name: moduleInfo.module_name,
24
+ }),
25
+ });
26
+ return response.body;
27
+ }
28
+
29
+ async unlike(mediaId, moduleInfo = { module_name: 'feed_timeline' }) {
30
+ const response = await this.client.request.send({
31
+ url: `/api/v1/media/${mediaId}/unlike/`,
32
+ method: 'POST',
33
+ form: this.client.request.sign({
34
+ media_id: mediaId,
35
+ _uid: this.client.state.cookieUserId,
36
+ _uuid: this.client.state.uuid,
37
+ radio_type: this.client.state.radioType,
38
+ module_name: moduleInfo.module_name,
39
+ }),
40
+ });
41
+ return response.body;
42
+ }
43
+
44
+ async comment(mediaId, commentText) {
45
+ const response = await this.client.request.send({
46
+ url: `/api/v1/media/${mediaId}/comment/`,
47
+ method: 'POST',
48
+ form: this.client.request.sign({
49
+ media_id: mediaId,
50
+ comment_text: commentText,
51
+ _uid: this.client.state.cookieUserId,
52
+ _uuid: this.client.state.uuid,
53
+ radio_type: this.client.state.radioType,
54
+ module_name: 'feed_timeline',
55
+ }),
56
+ });
57
+ return response.body;
58
+ }
59
+
60
+ async deleteComment(mediaId, commentId) {
61
+ const response = await this.client.request.send({
62
+ url: `/api/v1/media/${mediaId}/comment/${commentId}/delete/`,
63
+ method: 'POST',
64
+ form: this.client.request.sign({
65
+ _uid: this.client.state.cookieUserId,
66
+ _uuid: this.client.state.uuid,
67
+ }),
68
+ });
69
+ return response.body;
70
+ }
71
+
72
+ async delete(mediaId, mediaType = 'PHOTO') {
73
+ const response = await this.client.request.send({
74
+ url: `/api/v1/media/${mediaId}/delete/`,
75
+ method: 'POST',
76
+ qs: { media_type: mediaType },
77
+ form: this.client.request.sign({
78
+ igtv_feed_preview: false,
79
+ media_id: mediaId,
80
+ _uid: this.client.state.cookieUserId,
81
+ _uuid: this.client.state.uuid,
82
+ }),
83
+ });
84
+ return response.body;
85
+ }
86
+
87
+ async edit(mediaId, captionText, options = {}) {
88
+ const { usertags, location } = options;
89
+ const data = {
90
+ igtv_feed_preview: false,
91
+ media_id: mediaId,
92
+ _uid: this.client.state.cookieUserId,
93
+ _uuid: this.client.state.uuid,
94
+ caption_text: captionText,
95
+ };
96
+ if (usertags) data.usertags = JSON.stringify({ in: usertags });
97
+ if (location) {
98
+ data.location = JSON.stringify(location);
99
+ }
100
+ const response = await this.client.request.send({
101
+ url: `/api/v1/media/${mediaId}/edit_media/`,
102
+ method: 'POST',
103
+ form: this.client.request.sign(data),
104
+ });
105
+ return response.body;
106
+ }
107
+
108
+ async seen(reels) {
109
+ const response = await this.client.request.send({
110
+ url: '/api/v1/media/seen/',
111
+ method: 'POST',
112
+ form: this.client.request.sign({
113
+ reels: JSON.stringify(reels),
114
+ live_vods: JSON.stringify([]),
115
+ nf_token: '',
116
+ _uid: this.client.state.cookieUserId,
117
+ _uuid: this.client.state.uuid,
118
+ container_module: 'feed_short_url',
119
+ }),
120
+ });
121
+ return response.body;
122
+ }
123
+
124
+ async likers(mediaId) {
125
+ const response = await this.client.request.send({
126
+ url: `/api/v1/media/${mediaId}/likers/`,
127
+ method: 'GET',
128
+ });
129
+ return response.body;
130
+ }
131
+
132
+ async comments(mediaId, maxId = null, amount = 20) {
133
+ const allComments = [];
134
+ let nextMaxId = maxId;
135
+ while (allComments.length < amount) {
136
+ const qs = {};
137
+ if (nextMaxId) qs.max_id = nextMaxId;
138
+ const response = await this.client.request.send({
139
+ url: `/api/v1/media/${mediaId}/comments/`,
140
+ method: 'GET',
141
+ qs,
142
+ });
143
+ const body = response.body;
144
+ allComments.push(...(body.comments || []));
145
+ if (!body.has_more_comments || !body.next_max_id) break;
146
+ nextMaxId = body.next_max_id;
147
+ }
148
+ return allComments.slice(0, amount);
149
+ }
150
+
151
+ async replyToComment(mediaId, commentId, replyText) {
152
+ const response = await this.client.request.send({
153
+ url: `/api/v1/media/${mediaId}/comment/`,
154
+ method: 'POST',
155
+ form: this.client.request.sign({
156
+ media_id: mediaId,
157
+ comment_text: replyText,
158
+ replied_to_comment_id: commentId,
159
+ _uid: this.client.state.cookieUserId,
160
+ _uuid: this.client.state.uuid,
161
+ radio_type: this.client.state.radioType,
162
+ }),
163
+ });
164
+ return response.body;
165
+ }
166
+
167
+ async likeComment(mediaId, commentId) {
168
+ const response = await this.client.request.send({
169
+ url: `/api/v1/media/${mediaId}/comment/${commentId}/comment_like/`,
170
+ method: 'POST',
171
+ form: this.client.request.sign({
172
+ _uid: this.client.state.cookieUserId,
173
+ _uuid: this.client.state.uuid,
174
+ }),
175
+ });
176
+ return response.body;
177
+ }
178
+
179
+ async unlikeComment(mediaId, commentId) {
180
+ const response = await this.client.request.send({
181
+ url: `/api/v1/media/${mediaId}/comment/${commentId}/comment_unlike/`,
182
+ method: 'POST',
183
+ form: this.client.request.sign({
184
+ _uid: this.client.state.cookieUserId,
185
+ _uuid: this.client.state.uuid,
186
+ }),
187
+ });
188
+ return response.body;
189
+ }
190
+
191
+ async pinComment(mediaId, commentId) {
192
+ const response = await this.client.request.send({
193
+ url: `/api/v1/media/${mediaId}/comment/${commentId}/pin_comment/`,
194
+ method: 'POST',
195
+ form: this.client.request.sign({
196
+ _uid: this.client.state.cookieUserId,
197
+ _uuid: this.client.state.uuid,
198
+ }),
199
+ });
200
+ return response.body;
201
+ }
202
+
203
+ async unpinComment(mediaId, commentId) {
204
+ const response = await this.client.request.send({
205
+ url: `/api/v1/media/${mediaId}/comment/${commentId}/unpin_comment/`,
206
+ method: 'POST',
207
+ form: this.client.request.sign({
208
+ _uid: this.client.state.cookieUserId,
209
+ _uuid: this.client.state.uuid,
210
+ }),
211
+ });
212
+ return response.body;
213
+ }
214
+
215
+ async bulkDeleteComments(mediaId, commentIds) {
216
+ const response = await this.client.request.send({
217
+ url: `/api/v1/media/${mediaId}/comment/bulk_delete/`,
218
+ method: 'POST',
219
+ form: this.client.request.sign({
220
+ comment_ids_to_delete: Array.isArray(commentIds) ? commentIds.join(',') : commentIds,
221
+ _uid: this.client.state.cookieUserId,
222
+ _uuid: this.client.state.uuid,
223
+ }),
224
+ });
225
+ return response.body;
226
+ }
227
+
228
+ async save(mediaId, collectionId = null) {
229
+ const form = {
230
+ _uid: this.client.state.cookieUserId,
231
+ _uuid: this.client.state.uuid,
232
+ };
233
+ if (collectionId) form.added_collection_ids = JSON.stringify([collectionId]);
234
+ const response = await this.client.request.send({
235
+ url: `/api/v1/media/${mediaId}/save/`,
236
+ method: 'POST',
237
+ form: this.client.request.sign(form),
238
+ });
239
+ return response.body;
240
+ }
241
+
242
+ async unsave(mediaId) {
243
+ const response = await this.client.request.send({
244
+ url: `/api/v1/media/${mediaId}/unsave/`,
245
+ method: 'POST',
246
+ form: this.client.request.sign({
247
+ _uid: this.client.state.cookieUserId,
248
+ _uuid: this.client.state.uuid,
249
+ }),
250
+ });
251
+ return response.body;
252
+ }
253
+
254
+ async archive(mediaId) {
255
+ const response = await this.client.request.send({
256
+ url: `/api/v1/media/${mediaId}/only_me/`,
257
+ method: 'POST',
258
+ form: this.client.request.sign({
259
+ media_id: mediaId,
260
+ _uid: this.client.state.cookieUserId,
261
+ _uuid: this.client.state.uuid,
262
+ }),
263
+ });
264
+ return response.body;
265
+ }
266
+
267
+ async unarchive(mediaId) {
268
+ const response = await this.client.request.send({
269
+ url: `/api/v1/media/${mediaId}/undo_only_me/`,
270
+ method: 'POST',
271
+ form: this.client.request.sign({
272
+ media_id: mediaId,
273
+ _uid: this.client.state.cookieUserId,
274
+ _uuid: this.client.state.uuid,
275
+ }),
276
+ });
277
+ return response.body;
278
+ }
279
+
280
+ async disableComments(mediaId) {
281
+ const response = await this.client.request.send({
282
+ url: `/api/v1/media/${mediaId}/disable_comments/`,
283
+ method: 'POST',
284
+ form: this.client.request.sign({
285
+ _uid: this.client.state.cookieUserId,
286
+ _uuid: this.client.state.uuid,
287
+ }),
288
+ });
289
+ return response.body;
290
+ }
291
+
292
+ async enableComments(mediaId) {
293
+ const response = await this.client.request.send({
294
+ url: `/api/v1/media/${mediaId}/enable_comments/`,
295
+ method: 'POST',
296
+ form: this.client.request.sign({
297
+ _uid: this.client.state.cookieUserId,
298
+ _uuid: this.client.state.uuid,
299
+ }),
300
+ });
301
+ return response.body;
302
+ }
303
+
304
+ async commentThreadComments(mediaId, commentId, maxId = null) {
305
+ const qs = {};
306
+ if (maxId) qs.max_id = maxId;
307
+ const response = await this.client.request.send({
308
+ url: `/api/v1/media/${mediaId}/comments/${commentId}/inline_child_comments/`,
309
+ method: 'GET',
310
+ qs,
311
+ });
312
+ return response.body;
313
+ }
314
+
315
+ async oembed(url) {
316
+ const response = await this.client.request.send({
317
+ method: 'GET',
318
+ url: '/api/v1/oembed/',
319
+ qs: { url },
320
+ });
321
+ return response.body;
322
+ }
323
+
324
+ async downloadByUrl(url) {
325
+ const axios = require('axios');
326
+ const response = await axios.get(url, { responseType: 'arraybuffer' });
327
+ return Buffer.from(response.data);
328
+ }
329
+
330
+ async downloadPhoto(mediaPk) {
331
+ const result = await this.info(mediaPk);
332
+ const items = result.items || [result];
333
+ const item = items[0] || result;
334
+ const candidates = item.image_versions2?.candidates || [];
335
+ if (!candidates.length) throw new Error('No image candidates found');
336
+ return this.downloadByUrl(candidates[0].url);
337
+ }
338
+
339
+ async downloadVideo(mediaPk) {
340
+ const result = await this.info(mediaPk);
341
+ const items = result.items || [result];
342
+ const item = items[0] || result;
343
+ const videoVersions = item.video_versions || [];
344
+ if (!videoVersions.length) throw new Error('No video versions found');
345
+ return this.downloadByUrl(videoVersions[0].url);
346
+ }
347
+
348
+ static mediaPkFromCode(code) {
349
+ let pk = BigInt(0);
350
+ for (let i = 0; i < Math.min(code.length, 11); i++) {
351
+ const idx = ALPHABET.indexOf(code[i]);
352
+ if (idx === -1) continue;
353
+ pk = pk * BigInt(64) + BigInt(idx);
354
+ }
355
+ return pk.toString();
356
+ }
357
+
358
+ static mediaCodeFromPk(pk) {
359
+ let id = BigInt(pk);
360
+ let code = '';
361
+ while (id > BigInt(0)) {
362
+ const remainder = Number(id % BigInt(64));
363
+ code = ALPHABET[remainder] + code;
364
+ id = id / BigInt(64);
365
+ }
366
+ return code;
367
+ }
368
+
369
+ static mediaPkFromUrl(url) {
370
+ try {
371
+ const parsed = new URL(url);
372
+ const parts = parsed.pathname.split('/').filter(p => p.length > 0);
373
+ const code = parts[parts.length - 1];
374
+ return MediaRepository.mediaPkFromCode(code.substring(0, 11));
375
+ } catch {
376
+ return null;
377
+ }
378
+ }
379
+
380
+ mediaId(mediaPk, userId) {
381
+ return `${mediaPk}_${userId}`;
382
+ }
383
+
384
+ mediaPk(mediaId) {
385
+ return String(mediaId).split('_')[0];
386
+ }
387
+
388
+ async getUser(mediaPk) {
389
+ const result = await this.info(mediaPk);
390
+ const items = result.items || [result];
391
+ return (items[0] || result).user;
392
+ }
393
+ }
394
+
395
+ module.exports = MediaRepository;
@@ -0,0 +1,41 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ class MultipleAccountsRepository extends Repository {
4
+ async getFeaturedAccounts() {
5
+ const response = await this.client.request.send({
6
+ method: 'GET',
7
+ url: '/api/v1/multiple_accounts/get_featured_accounts/',
8
+ });
9
+ return response.body;
10
+ }
11
+
12
+ async getAccountFamily() {
13
+ const response = await this.client.request.send({
14
+ method: 'GET',
15
+ url: '/api/v1/multiple_accounts/get_account_family/',
16
+ });
17
+ return response.body;
18
+ }
19
+
20
+ async getAccountInfo() {
21
+ const response = await this.client.request.send({
22
+ method: 'GET',
23
+ url: '/api/v1/multiple_accounts/get_account_info/',
24
+ });
25
+ return response.body;
26
+ }
27
+
28
+ async switchAccount(userId) {
29
+ const response = await this.client.request.send({
30
+ method: 'POST',
31
+ url: '/api/v1/multiple_accounts/switch_account/',
32
+ form: this.client.request.sign({
33
+ _uuid: this.client.state.uuid,
34
+ user_id: userId,
35
+ }),
36
+ });
37
+ return response.body;
38
+ }
39
+ }
40
+
41
+ module.exports = MultipleAccountsRepository;
@@ -0,0 +1,35 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ class NewsRepository extends Repository {
4
+ async inbox() {
5
+ const response = await this.client.request.send({
6
+ url: '/api/v1/news/inbox/',
7
+ method: 'GET',
8
+ });
9
+ return response.body;
10
+ }
11
+
12
+ async getFollowRequests(maxId = null) {
13
+ const qs = {};
14
+ if (maxId) qs.max_id = maxId;
15
+ const response = await this.client.request.send({
16
+ url: '/api/v1/news/inbox/',
17
+ method: 'GET',
18
+ qs: { ...qs, filters: 'follow_requests' },
19
+ });
20
+ return response.body;
21
+ }
22
+
23
+ async markAsSeen(timestamps = {}) {
24
+ const response = await this.client.request.send({
25
+ url: '/api/v1/news/inbox_seen/',
26
+ method: 'POST',
27
+ form: this.client.request.sign({
28
+ _uuid: this.client.state.uuid,
29
+ }),
30
+ });
31
+ return response.body;
32
+ }
33
+ }
34
+
35
+ module.exports = NewsRepository;
@@ -0,0 +1,57 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ class NoteRepository extends Repository {
4
+ async getNotes() {
5
+ const response = await this.client.request.send({
6
+ method: 'GET',
7
+ url: '/api/v1/notes/get_notes/',
8
+ });
9
+ return response.body;
10
+ }
11
+
12
+ async createNote(text, audience = 0) {
13
+ const response = await this.client.request.send({
14
+ method: 'POST',
15
+ url: '/api/v1/notes/create_note/',
16
+ form: this.client.request.sign({
17
+ _uuid: this.client.state.uuid,
18
+ text,
19
+ audience,
20
+ }),
21
+ });
22
+ return response.body;
23
+ }
24
+
25
+ async deleteNote(noteId) {
26
+ const response = await this.client.request.send({
27
+ method: 'POST',
28
+ url: `/api/v1/notes/delete_note/${noteId}/`,
29
+ form: this.client.request.sign({
30
+ _uuid: this.client.state.uuid,
31
+ id: noteId,
32
+ }),
33
+ });
34
+ return response.body;
35
+ }
36
+
37
+ async lastSeenUpdateNote() {
38
+ const response = await this.client.request.send({
39
+ method: 'POST',
40
+ url: '/api/v1/notes/last_seen_update/',
41
+ form: this.client.request.sign({
42
+ _uuid: this.client.state.uuid,
43
+ }),
44
+ });
45
+ return response.body;
46
+ }
47
+
48
+ async getNotesFollowing() {
49
+ const response = await this.client.request.send({
50
+ method: 'GET',
51
+ url: '/api/v1/notes/following_notes/',
52
+ });
53
+ return response.body;
54
+ }
55
+ }
56
+
57
+ module.exports = NoteRepository;
@@ -0,0 +1,79 @@
1
+ const Repository = require('../core/repository');
2
+
3
+ const MUTE_ALL_VALUES = ['cancel', '15_minutes', '1_hour', '2_hour', '4_hour', '8_hour'];
4
+ const SETTING_VALUES = ['off', 'following_only', 'everyone'];
5
+
6
+ class NotificationRepository extends Repository {
7
+ async changeSettings(contentType, settingValue) {
8
+ let userId;
9
+ try { userId = this.client.state.cookieUserId; } catch { userId = '0'; }
10
+ const response = await this.client.request.send({
11
+ method: 'POST',
12
+ url: '/api/v1/notifications/change_notification_settings/',
13
+ form: this.client.request.sign({
14
+ content_type: contentType,
15
+ setting_value: settingValue,
16
+ _uid: userId,
17
+ _uuid: this.client.state.uuid,
18
+ }),
19
+ });
20
+ return response.body;
21
+ }
22
+
23
+ async muteAll(settingValue = '8_hour') {
24
+ if (!MUTE_ALL_VALUES.includes(settingValue)) {
25
+ throw new Error(`Unsupported mute value: ${settingValue}. Must be one of: ${MUTE_ALL_VALUES.join(', ')}`);
26
+ }
27
+ return this.changeSettings('mute_all', settingValue);
28
+ }
29
+
30
+ async likes(settingValue = 'off') { return this._assertAndSet('likes', settingValue); }
31
+ async likeAndCommentOnPhotoUserTagged(v = 'off') { return this._assertAndSet('like_and_comment_on_photo_user_tagged', v); }
32
+ async userTagged(v = 'off') { return this._assertAndSet('user_tagged', v); }
33
+ async comments(v = 'off') { return this._assertAndSet('comments', v); }
34
+ async commentLikes(v = 'off') { return this._assertAndSet('comment_likes', v); }
35
+ async firstPost(v = 'off') { return this._assertAndSet('first_post', v); }
36
+ async newFollower(v = 'off') { return this._assertAndSet('new_follower', v); }
37
+ async followRequestAccepted(v = 'off') { return this._assertAndSet('follow_request_accepted', v); }
38
+ async connection(v = 'off') { return this._assertAndSet('connection', v); }
39
+ async taggedInBio(v = 'off') { return this._assertAndSet('tagged_in_bio', v); }
40
+ async pendingDirectShare(v = 'off') { return this._assertAndSet('pending_direct_share', v); }
41
+ async directShareActivity(v = 'off') { return this._assertAndSet('direct_share_activity', v); }
42
+ async directGroupRequests(v = 'off') { return this._assertAndSet('direct_group_requests', v); }
43
+ async videoCall(v = 'off') { return this._assertAndSet('video_call', v); }
44
+ async rooms(v = 'off') { return this._assertAndSet('rooms', v); }
45
+ async liveBroadcast(v = 'off') { return this._assertAndSet('live_broadcast', v); }
46
+ async felixUploadResult(v = 'off') { return this._assertAndSet('felix_upload_result', v); }
47
+ async viewCount(v = 'off') { return this._assertAndSet('view_count', v); }
48
+ async fundraiserCreator(v = 'off') { return this._assertAndSet('fundraiser_creator', v); }
49
+ async fundraiserSupporter(v = 'off') { return this._assertAndSet('fundraiser_supporter', v); }
50
+ async reminders(v = 'off') { return this._assertAndSet('reminders', v); }
51
+ async announcements(v = 'off') { return this._assertAndSet('announcements', v); }
52
+ async reportUpdated(v = 'off') { return this._assertAndSet('report_updated', v); }
53
+ async login(v = 'off') { return this._assertAndSet('login_notification', v); }
54
+
55
+ async disableAll() {
56
+ const methods = [
57
+ 'likes', 'likeAndCommentOnPhotoUserTagged', 'userTagged', 'comments',
58
+ 'commentLikes', 'firstPost', 'newFollower', 'followRequestAccepted',
59
+ 'connection', 'taggedInBio', 'pendingDirectShare', 'directShareActivity',
60
+ 'directGroupRequests', 'videoCall', 'rooms', 'liveBroadcast',
61
+ 'felixUploadResult', 'viewCount', 'fundraiserCreator', 'fundraiserSupporter',
62
+ 'reminders', 'announcements', 'reportUpdated', 'login',
63
+ ];
64
+ const results = [];
65
+ for (const method of methods) {
66
+ results.push(await this[method]('off'));
67
+ }
68
+ return results.every(r => r?.status === 'ok');
69
+ }
70
+
71
+ _assertAndSet(contentType, settingValue) {
72
+ if (!SETTING_VALUES.includes(settingValue)) {
73
+ throw new Error(`Unsupported setting value: ${settingValue}. Must be one of: ${SETTING_VALUES.join(', ')}`);
74
+ }
75
+ return this.changeSettings(contentType, settingValue);
76
+ }
77
+ }
78
+
79
+ module.exports = NotificationRepository;