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,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Download Media from Instagram Messages
|
|
3
|
+
*
|
|
4
|
+
* Similar to Baileys' downloadContentFromMessage() function.
|
|
5
|
+
* Extracts and downloads media (photos, videos, voice notes) from Instagram DM messages.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - Regular photos/videos in DMs
|
|
9
|
+
* - View-once (raven) media - MUST download BEFORE marking as seen
|
|
10
|
+
* - Voice messages
|
|
11
|
+
* - Shared reels/posts
|
|
12
|
+
*
|
|
13
|
+
* @author Added for nodejs-insta-private-api
|
|
14
|
+
* @version 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const axios = require('axios');
|
|
18
|
+
const { Transform } = require('stream');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Media types supported
|
|
22
|
+
*/
|
|
23
|
+
const MEDIA_TYPES = {
|
|
24
|
+
IMAGE: 'image',
|
|
25
|
+
VIDEO: 'video',
|
|
26
|
+
AUDIO: 'audio',
|
|
27
|
+
VOICE: 'voice',
|
|
28
|
+
RAVEN_IMAGE: 'raven_image',
|
|
29
|
+
RAVEN_VIDEO: 'raven_video',
|
|
30
|
+
MEDIA_SHARE: 'media_share',
|
|
31
|
+
REEL_SHARE: 'reel_share',
|
|
32
|
+
STORY_SHARE: 'story_share',
|
|
33
|
+
CLIP: 'clip'
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Extract media URLs from an Instagram message object
|
|
38
|
+
*
|
|
39
|
+
* @param {Object} message - The Instagram message object from MQTT/API
|
|
40
|
+
* @returns {Object|null} - Object with urls, type, and metadata or null if no media
|
|
41
|
+
*/
|
|
42
|
+
function extractMediaUrls(message) {
|
|
43
|
+
if (!message) return null;
|
|
44
|
+
|
|
45
|
+
const result = {
|
|
46
|
+
urls: [],
|
|
47
|
+
type: null,
|
|
48
|
+
width: null,
|
|
49
|
+
height: null,
|
|
50
|
+
duration: null,
|
|
51
|
+
isViewOnce: false,
|
|
52
|
+
expiresAt: null,
|
|
53
|
+
originalMessage: message
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Check item_type for message type
|
|
57
|
+
const itemType = message.item_type || message.type;
|
|
58
|
+
|
|
59
|
+
// Handle view-once (raven) media
|
|
60
|
+
if (itemType === 'raven_media' || message.visual_media) {
|
|
61
|
+
result.isViewOnce = true;
|
|
62
|
+
const visualMedia = message.visual_media || message.raven_media;
|
|
63
|
+
|
|
64
|
+
if (visualMedia) {
|
|
65
|
+
const media = visualMedia.media || visualMedia;
|
|
66
|
+
result.expiresAt = visualMedia.expiring_media_action_summary?.timestamp;
|
|
67
|
+
|
|
68
|
+
// Extract image
|
|
69
|
+
if (media.image_versions2?.candidates) {
|
|
70
|
+
result.type = MEDIA_TYPES.RAVEN_IMAGE;
|
|
71
|
+
result.urls = media.image_versions2.candidates.map(c => ({
|
|
72
|
+
url: c.url,
|
|
73
|
+
width: c.width,
|
|
74
|
+
height: c.height
|
|
75
|
+
}));
|
|
76
|
+
result.width = result.urls[0]?.width;
|
|
77
|
+
result.height = result.urls[0]?.height;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Extract video
|
|
81
|
+
if (media.video_versions) {
|
|
82
|
+
result.type = MEDIA_TYPES.RAVEN_VIDEO;
|
|
83
|
+
result.urls = media.video_versions.map(v => ({
|
|
84
|
+
url: v.url,
|
|
85
|
+
width: v.width,
|
|
86
|
+
height: v.height,
|
|
87
|
+
type: v.type
|
|
88
|
+
}));
|
|
89
|
+
result.duration = media.video_duration;
|
|
90
|
+
result.width = result.urls[0]?.width;
|
|
91
|
+
result.height = result.urls[0]?.height;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return result.urls.length > 0 ? result : null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Handle regular media message
|
|
99
|
+
if (itemType === 'media' || message.media) {
|
|
100
|
+
const media = message.media || message;
|
|
101
|
+
|
|
102
|
+
// Image
|
|
103
|
+
if (media.image_versions2?.candidates) {
|
|
104
|
+
result.type = MEDIA_TYPES.IMAGE;
|
|
105
|
+
result.urls = media.image_versions2.candidates.map(c => ({
|
|
106
|
+
url: c.url,
|
|
107
|
+
width: c.width,
|
|
108
|
+
height: c.height
|
|
109
|
+
}));
|
|
110
|
+
result.width = result.urls[0]?.width;
|
|
111
|
+
result.height = result.urls[0]?.height;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Video
|
|
115
|
+
if (media.video_versions) {
|
|
116
|
+
result.type = MEDIA_TYPES.VIDEO;
|
|
117
|
+
result.urls = media.video_versions.map(v => ({
|
|
118
|
+
url: v.url,
|
|
119
|
+
width: v.width,
|
|
120
|
+
height: v.height,
|
|
121
|
+
type: v.type
|
|
122
|
+
}));
|
|
123
|
+
result.duration = media.video_duration;
|
|
124
|
+
result.width = result.urls[0]?.width;
|
|
125
|
+
result.height = result.urls[0]?.height;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return result.urls.length > 0 ? result : null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Handle voice message
|
|
132
|
+
if (itemType === 'voice_media' || message.voice_media) {
|
|
133
|
+
const voiceMedia = message.voice_media || message;
|
|
134
|
+
const audio = voiceMedia.media || voiceMedia;
|
|
135
|
+
|
|
136
|
+
if (audio.audio) {
|
|
137
|
+
result.type = MEDIA_TYPES.VOICE;
|
|
138
|
+
result.urls = [{
|
|
139
|
+
url: audio.audio.audio_src,
|
|
140
|
+
duration: audio.audio.duration
|
|
141
|
+
}];
|
|
142
|
+
result.duration = audio.audio.duration;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return result.urls.length > 0 ? result : null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Handle media share (shared post)
|
|
149
|
+
if (itemType === 'media_share' || message.media_share) {
|
|
150
|
+
const mediaShare = message.media_share || message;
|
|
151
|
+
|
|
152
|
+
if (mediaShare.image_versions2?.candidates) {
|
|
153
|
+
result.type = MEDIA_TYPES.MEDIA_SHARE;
|
|
154
|
+
result.urls = mediaShare.image_versions2.candidates.map(c => ({
|
|
155
|
+
url: c.url,
|
|
156
|
+
width: c.width,
|
|
157
|
+
height: c.height
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (mediaShare.video_versions) {
|
|
162
|
+
result.type = MEDIA_TYPES.MEDIA_SHARE;
|
|
163
|
+
result.urls = mediaShare.video_versions.map(v => ({
|
|
164
|
+
url: v.url,
|
|
165
|
+
width: v.width,
|
|
166
|
+
height: v.height
|
|
167
|
+
}));
|
|
168
|
+
result.duration = mediaShare.video_duration;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return result.urls.length > 0 ? result : null;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Handle reel share
|
|
175
|
+
if (itemType === 'clip' || itemType === 'felix_share' || message.clip) {
|
|
176
|
+
const clip = message.clip?.clip || message.felix_share?.video || message;
|
|
177
|
+
|
|
178
|
+
if (clip.image_versions2?.candidates) {
|
|
179
|
+
result.type = MEDIA_TYPES.CLIP;
|
|
180
|
+
result.urls = clip.image_versions2.candidates.map(c => ({
|
|
181
|
+
url: c.url,
|
|
182
|
+
width: c.width,
|
|
183
|
+
height: c.height
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (clip.video_versions) {
|
|
188
|
+
result.type = MEDIA_TYPES.CLIP;
|
|
189
|
+
result.urls = clip.video_versions.map(v => ({
|
|
190
|
+
url: v.url,
|
|
191
|
+
width: v.width,
|
|
192
|
+
height: v.height
|
|
193
|
+
}));
|
|
194
|
+
result.duration = clip.video_duration;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return result.urls.length > 0 ? result : null;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Handle story share
|
|
201
|
+
if (itemType === 'story_share' || message.story_share) {
|
|
202
|
+
const story = message.story_share?.media || message.story_share || message;
|
|
203
|
+
|
|
204
|
+
if (story.image_versions2?.candidates) {
|
|
205
|
+
result.type = MEDIA_TYPES.STORY_SHARE;
|
|
206
|
+
result.urls = story.image_versions2.candidates.map(c => ({
|
|
207
|
+
url: c.url,
|
|
208
|
+
width: c.width,
|
|
209
|
+
height: c.height
|
|
210
|
+
}));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (story.video_versions) {
|
|
214
|
+
result.type = MEDIA_TYPES.STORY_SHARE;
|
|
215
|
+
result.urls = story.video_versions.map(v => ({
|
|
216
|
+
url: v.url,
|
|
217
|
+
width: v.width,
|
|
218
|
+
height: v.height
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return result.urls.length > 0 ? result : null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Download media content from an Instagram message
|
|
230
|
+
* Similar to Baileys' downloadContentFromMessage()
|
|
231
|
+
*
|
|
232
|
+
* @param {Object} message - The Instagram message object containing media
|
|
233
|
+
* @param {string} type - Optional: 'image', 'video', 'audio' to specify which type to download
|
|
234
|
+
* @param {Object} options - Optional download options
|
|
235
|
+
* @param {number} options.quality - Quality index (0 = highest, default 0)
|
|
236
|
+
* @param {number} options.timeout - Request timeout in ms (default 30000)
|
|
237
|
+
* @param {Object} options.headers - Additional headers for the request
|
|
238
|
+
* @returns {Promise<Transform>} - Readable stream of the media content
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* // Download view-once image before marking as seen
|
|
242
|
+
* const stream = await downloadContentFromMessage(message, 'image');
|
|
243
|
+
* let buffer = Buffer.from([]);
|
|
244
|
+
* for await (const chunk of stream) {
|
|
245
|
+
* buffer = Buffer.concat([buffer, chunk]);
|
|
246
|
+
* }
|
|
247
|
+
* fs.writeFileSync('saved-viewonce.jpg', buffer);
|
|
248
|
+
*/
|
|
249
|
+
async function downloadContentFromMessage(message, type = null, options = {}) {
|
|
250
|
+
const mediaInfo = extractMediaUrls(message);
|
|
251
|
+
|
|
252
|
+
if (!mediaInfo || mediaInfo.urls.length === 0) {
|
|
253
|
+
throw new Error('No media found in message');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Select quality (0 = best)
|
|
257
|
+
const qualityIndex = options.quality || 0;
|
|
258
|
+
const selectedUrl = mediaInfo.urls[Math.min(qualityIndex, mediaInfo.urls.length - 1)];
|
|
259
|
+
|
|
260
|
+
if (!selectedUrl?.url) {
|
|
261
|
+
throw new Error('Could not extract media URL from message');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const timeout = options.timeout || 30000;
|
|
265
|
+
const headers = {
|
|
266
|
+
'User-Agent': 'Instagram 415.0.0.36.76 Android',
|
|
267
|
+
'Accept': '*/*',
|
|
268
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
269
|
+
...(options.headers || {})
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
const response = await axios({
|
|
274
|
+
method: 'GET',
|
|
275
|
+
url: selectedUrl.url,
|
|
276
|
+
responseType: 'stream',
|
|
277
|
+
timeout: timeout,
|
|
278
|
+
headers: headers,
|
|
279
|
+
maxRedirects: 5
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// Create transform stream to pass through
|
|
283
|
+
const transform = new Transform({
|
|
284
|
+
transform(chunk, encoding, callback) {
|
|
285
|
+
this.push(chunk);
|
|
286
|
+
callback();
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// Attach metadata to stream
|
|
291
|
+
transform.mediaInfo = {
|
|
292
|
+
type: mediaInfo.type,
|
|
293
|
+
isViewOnce: mediaInfo.isViewOnce,
|
|
294
|
+
width: selectedUrl.width || mediaInfo.width,
|
|
295
|
+
height: selectedUrl.height || mediaInfo.height,
|
|
296
|
+
duration: mediaInfo.duration,
|
|
297
|
+
contentType: response.headers['content-type'],
|
|
298
|
+
contentLength: parseInt(response.headers['content-length']) || null
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
response.data.pipe(transform);
|
|
302
|
+
|
|
303
|
+
return transform;
|
|
304
|
+
|
|
305
|
+
} catch (error) {
|
|
306
|
+
throw new Error(`Failed to download media: ${error.message}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Download media content as a Buffer directly
|
|
312
|
+
* Convenience wrapper around downloadContentFromMessage
|
|
313
|
+
*
|
|
314
|
+
* @param {Object} message - The Instagram message object containing media
|
|
315
|
+
* @param {string} type - Optional: 'image', 'video', 'audio' to specify type
|
|
316
|
+
* @param {Object} options - Optional download options
|
|
317
|
+
* @returns {Promise<{buffer: Buffer, mediaInfo: Object}>} - Buffer and metadata
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* const { buffer, mediaInfo } = await downloadMediaBuffer(message);
|
|
321
|
+
* console.log('Downloaded', mediaInfo.type, 'size:', buffer.length);
|
|
322
|
+
* fs.writeFileSync('media.' + (mediaInfo.type === 'video' ? 'mp4' : 'jpg'), buffer);
|
|
323
|
+
*/
|
|
324
|
+
async function downloadMediaBuffer(message, type = null, options = {}) {
|
|
325
|
+
const stream = await downloadContentFromMessage(message, type, options);
|
|
326
|
+
|
|
327
|
+
const chunks = [];
|
|
328
|
+
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
stream.on('data', (chunk) => chunks.push(chunk));
|
|
331
|
+
stream.on('end', () => {
|
|
332
|
+
resolve({
|
|
333
|
+
buffer: Buffer.concat(chunks),
|
|
334
|
+
mediaInfo: stream.mediaInfo
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
stream.on('error', reject);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Check if a message contains downloadable media
|
|
343
|
+
*
|
|
344
|
+
* @param {Object} message - The Instagram message object
|
|
345
|
+
* @returns {boolean} - True if message contains downloadable media
|
|
346
|
+
*/
|
|
347
|
+
function hasMedia(message) {
|
|
348
|
+
return extractMediaUrls(message) !== null;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Get media type from message without downloading
|
|
353
|
+
*
|
|
354
|
+
* @param {Object} message - The Instagram message object
|
|
355
|
+
* @returns {string|null} - Media type or null
|
|
356
|
+
*/
|
|
357
|
+
function getMediaType(message) {
|
|
358
|
+
const info = extractMediaUrls(message);
|
|
359
|
+
return info?.type || null;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Check if message is view-once (disappearing)
|
|
364
|
+
*
|
|
365
|
+
* @param {Object} message - The Instagram message object
|
|
366
|
+
* @returns {boolean} - True if view-once media
|
|
367
|
+
*/
|
|
368
|
+
function isViewOnceMedia(message) {
|
|
369
|
+
const info = extractMediaUrls(message);
|
|
370
|
+
return info?.isViewOnce || false;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
module.exports = {
|
|
374
|
+
downloadContentFromMessage,
|
|
375
|
+
downloadMediaBuffer,
|
|
376
|
+
extractMediaUrls,
|
|
377
|
+
hasMedia,
|
|
378
|
+
getMediaType,
|
|
379
|
+
isViewOnceMedia,
|
|
380
|
+
MEDIA_TYPES
|
|
381
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare class BaseError extends Error {
|
|
2
|
+
constructor(message?: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class ClientDisconnectedError extends BaseError {
|
|
5
|
+
}
|
|
6
|
+
export declare class EmptyPacketError extends BaseError {
|
|
7
|
+
}
|
|
8
|
+
export declare class InvalidStateError extends BaseError {
|
|
9
|
+
}
|
|
10
|
+
export declare class ConnectionFailedError extends BaseError {
|
|
11
|
+
}
|
|
12
|
+
export declare class IllegalArgumentError extends BaseError {
|
|
13
|
+
}
|
|
14
|
+
export declare class ThriftError extends BaseError {
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IgApiClientError = exports.ThriftError = exports.IllegalArgumentError = exports.ConnectionFailedError = exports.InvalidStateError = exports.EmptyPacketError = exports.ClientDisconnectedError = void 0;
|
|
4
|
+
class BaseError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
// @ts-ignore -- set the name to the class's actual name
|
|
8
|
+
this.name = this.__proto__.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
class IgApiClientError extends BaseError {
|
|
12
|
+
constructor(message, statusCode, body) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.statusCode = statusCode || null;
|
|
15
|
+
this.body = body || null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.IgApiClientError = IgApiClientError;
|
|
19
|
+
class ClientDisconnectedError extends BaseError {
|
|
20
|
+
}
|
|
21
|
+
exports.ClientDisconnectedError = ClientDisconnectedError;
|
|
22
|
+
class EmptyPacketError extends BaseError {
|
|
23
|
+
}
|
|
24
|
+
exports.EmptyPacketError = EmptyPacketError;
|
|
25
|
+
class InvalidStateError extends BaseError {
|
|
26
|
+
}
|
|
27
|
+
exports.InvalidStateError = InvalidStateError;
|
|
28
|
+
class ConnectionFailedError extends BaseError {
|
|
29
|
+
}
|
|
30
|
+
exports.ConnectionFailedError = ConnectionFailedError;
|
|
31
|
+
class IllegalArgumentError extends BaseError {
|
|
32
|
+
}
|
|
33
|
+
exports.IllegalArgumentError = IllegalArgumentError;
|
|
34
|
+
// TODO: split further
|
|
35
|
+
class ThriftError extends BaseError {
|
|
36
|
+
}
|
|
37
|
+
exports.ThriftError = ThriftError;
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,MAAM,SAAU,SAAQ,KAAK;IAC1B,YAAY,OAAgB;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,wDAAwD;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/C,CAAC;CACH;AAED,MAAa,uBAAwB,SAAQ,SAAS;CAAG;AAAzD,0DAAyD;AAEzD,MAAa,gBAAiB,SAAQ,SAAS;CAAG;AAAlD,4CAAkD;AAElD,MAAa,iBAAkB,SAAQ,SAAS;CAAG;AAAnD,8CAAmD;AAEnD,MAAa,qBAAsB,SAAQ,SAAS;CAAG;AAAvD,sDAAuD;AAEvD,MAAa,oBAAqB,SAAQ,SAAS;CAAG;AAAtD,oDAAsD;AAEtD,sBAAsB;AACtB,MAAa,WAAY,SAAQ,SAAS;CAAG;AAA7C,kCAA6C"}
|
package/dist/extend.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withFbnsAndRealtime = exports.withRealtime = exports.withFbns = exports.IgApiClientExt = void 0;
|
|
4
|
+
|
|
5
|
+
const IgApiClient = require('./core/client');
|
|
6
|
+
|
|
7
|
+
let FbnsClient = null;
|
|
8
|
+
try { FbnsClient = require('./fbns/fbns.client').FbnsClient; } catch (e) {}
|
|
9
|
+
|
|
10
|
+
const { RealtimeClient } = require('./realtime');
|
|
11
|
+
|
|
12
|
+
const { sendRavenPhoto, sendRavenPhotoOnce, sendRavenPhotoReplayable, sendRavenVideo, sendRavenVideoOnce, sendRavenVideoReplayable } = require('./sendmedia');
|
|
13
|
+
|
|
14
|
+
class IgApiClientExt extends IgApiClient {
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
this.stateHooks = [];
|
|
18
|
+
this.addStateHook({
|
|
19
|
+
name: 'client',
|
|
20
|
+
onExport: async (client) => {
|
|
21
|
+
if (client.state && typeof client.state.serialize === 'function') {
|
|
22
|
+
const state = await client.state.serialize();
|
|
23
|
+
const { constants, ...rest } = state;
|
|
24
|
+
return rest;
|
|
25
|
+
}
|
|
26
|
+
return {};
|
|
27
|
+
},
|
|
28
|
+
onImport: (data, client) => {
|
|
29
|
+
if (client.state && typeof client.state.deserialize === 'function') {
|
|
30
|
+
return client.state.deserialize(data);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async sendRavenPhoto(buffer, options) {
|
|
37
|
+
return sendRavenPhoto(this, buffer, options);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async sendRavenPhotoOnce(buffer, options) {
|
|
41
|
+
return sendRavenPhotoOnce(this, buffer, options);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async sendRavenPhotoReplayable(buffer, options) {
|
|
45
|
+
return sendRavenPhotoReplayable(this, buffer, options);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async sendRavenVideo(buffer, options) {
|
|
49
|
+
return sendRavenVideo(this, buffer, options);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async sendRavenVideoOnce(buffer, options) {
|
|
53
|
+
return sendRavenVideoOnce(this, buffer, options);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async sendRavenVideoReplayable(buffer, options) {
|
|
57
|
+
return sendRavenVideoReplayable(this, buffer, options);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async exportState() {
|
|
61
|
+
const data = {};
|
|
62
|
+
for (const hook of this.stateHooks) {
|
|
63
|
+
try {
|
|
64
|
+
data[hook.name] = await hook.onExport(this);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
data[hook.name] = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return JSON.stringify(data);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async importState(state) {
|
|
73
|
+
if (typeof state === 'string') state = JSON.parse(state);
|
|
74
|
+
for (const [key, value] of Object.entries(state)) {
|
|
75
|
+
const hook = this.stateHooks.find(x => x.name === key);
|
|
76
|
+
if (hook) {
|
|
77
|
+
try {
|
|
78
|
+
await hook.onImport(value, this);
|
|
79
|
+
} catch (e) {}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
addStateHook(hook) {
|
|
85
|
+
if (this.stateHooks.some(x => x.name === hook.name)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.stateHooks.push(hook);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.IgApiClientExt = IgApiClientExt;
|
|
92
|
+
|
|
93
|
+
function upgradeToExt(client) {
|
|
94
|
+
if (client instanceof IgApiClientExt) return client;
|
|
95
|
+
Object.setPrototypeOf(client, IgApiClientExt.prototype);
|
|
96
|
+
if (!client.stateHooks) {
|
|
97
|
+
client.stateHooks = [];
|
|
98
|
+
client.addStateHook({
|
|
99
|
+
name: 'client',
|
|
100
|
+
onExport: async (c) => {
|
|
101
|
+
if (c.state && typeof c.state.serialize === 'function') {
|
|
102
|
+
const state = await c.state.serialize();
|
|
103
|
+
const { constants, ...rest } = state;
|
|
104
|
+
return rest;
|
|
105
|
+
}
|
|
106
|
+
return {};
|
|
107
|
+
},
|
|
108
|
+
onImport: (data, c) => {
|
|
109
|
+
if (c.state && typeof c.state.deserialize === 'function') {
|
|
110
|
+
return c.state.deserialize(data);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return client;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function withFbns(client) {
|
|
119
|
+
if (!FbnsClient) {
|
|
120
|
+
throw new Error('FbnsClient is not available (mqtt-shim dependency missing)');
|
|
121
|
+
}
|
|
122
|
+
client = upgradeToExt(client);
|
|
123
|
+
Object.defineProperty(client, 'fbns', {
|
|
124
|
+
value: new FbnsClient(client),
|
|
125
|
+
enumerable: false,
|
|
126
|
+
configurable: true,
|
|
127
|
+
});
|
|
128
|
+
client.addStateHook({
|
|
129
|
+
name: 'fbns',
|
|
130
|
+
onExport: (c) => c.fbns && c.fbns.auth ? c.fbns.auth.toString() : null,
|
|
131
|
+
onImport: (data, c) => {
|
|
132
|
+
if (c.fbns && c.fbns.auth && typeof c.fbns.auth.read === 'function') {
|
|
133
|
+
c.fbns.auth.read(data);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
return client;
|
|
138
|
+
}
|
|
139
|
+
exports.withFbns = withFbns;
|
|
140
|
+
|
|
141
|
+
function withRealtime(client, mixins) {
|
|
142
|
+
client = upgradeToExt(client);
|
|
143
|
+
let realtimeInstance = null;
|
|
144
|
+
Object.defineProperty(client, 'realtime', {
|
|
145
|
+
get() {
|
|
146
|
+
if (!realtimeInstance) {
|
|
147
|
+
realtimeInstance = new RealtimeClient(client, mixins);
|
|
148
|
+
}
|
|
149
|
+
return realtimeInstance;
|
|
150
|
+
},
|
|
151
|
+
enumerable: false,
|
|
152
|
+
configurable: true,
|
|
153
|
+
});
|
|
154
|
+
return client;
|
|
155
|
+
}
|
|
156
|
+
exports.withRealtime = withRealtime;
|
|
157
|
+
|
|
158
|
+
function withFbnsAndRealtime(client, mixins) {
|
|
159
|
+
client = withRealtime(client, mixins);
|
|
160
|
+
if (FbnsClient) {
|
|
161
|
+
try {
|
|
162
|
+
client = withFbns(client);
|
|
163
|
+
} catch (e) {}
|
|
164
|
+
}
|
|
165
|
+
return client;
|
|
166
|
+
}
|
|
167
|
+
exports.withFbnsAndRealtime = withFbnsAndRealtime;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { IgApiClient, StatusResponse } from 'instagram-private-api';
|
|
3
|
+
import { FbnsDeviceAuth } from './fbns.device-auth';
|
|
4
|
+
import { ToEventFn } from '../shared';
|
|
5
|
+
import { FbnsNotificationUnknown } from './fbns.types';
|
|
6
|
+
import { EventEmitter } from 'eventemitter3';
|
|
7
|
+
import { FbnsClientEvents } from './fbns.client.events';
|
|
8
|
+
import { SocksProxy } from 'socks';
|
|
9
|
+
import { ConnectionOptions } from 'tls';
|
|
10
|
+
export declare class FbnsClient extends EventEmitter<ToEventFn<FbnsClientEvents & {
|
|
11
|
+
[x: string]: FbnsNotificationUnknown;
|
|
12
|
+
}>> {
|
|
13
|
+
private readonly ig;
|
|
14
|
+
get auth(): FbnsDeviceAuth;
|
|
15
|
+
set auth(value: FbnsDeviceAuth);
|
|
16
|
+
private fbnsDebug;
|
|
17
|
+
private client?;
|
|
18
|
+
private conn?;
|
|
19
|
+
private _auth;
|
|
20
|
+
private safeDisconnect;
|
|
21
|
+
constructor(ig: IgApiClient);
|
|
22
|
+
buildConnection(): void;
|
|
23
|
+
connect({ enableTrace, autoReconnect, socksOptions, additionalTlsOptions, }?: {
|
|
24
|
+
enableTrace?: boolean;
|
|
25
|
+
autoReconnect?: boolean;
|
|
26
|
+
socksOptions?: SocksProxy;
|
|
27
|
+
additionalTlsOptions?: ConnectionOptions;
|
|
28
|
+
}): Promise<any>;
|
|
29
|
+
disconnect(): Promise<void>;
|
|
30
|
+
private handleMessage;
|
|
31
|
+
sendPushRegister(token: string): Promise<StatusResponse>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { FbnsMessageData, FbnsNotification, FbnsNotificationUnknown } from './fbns.types';
|
|
2
|
+
import { FbnsDeviceAuth } from './fbns.device-auth';
|
|
3
|
+
export interface FbnsClientEvents extends ToClientEvents<FbnsNotificationEventParams> {
|
|
4
|
+
auth: FbnsDeviceAuth;
|
|
5
|
+
push: FbnsNotificationUnknown;
|
|
6
|
+
error: Error;
|
|
7
|
+
warning: Error;
|
|
8
|
+
message: FbnsMessageData;
|
|
9
|
+
logging: {
|
|
10
|
+
beacon_id: number;
|
|
11
|
+
};
|
|
12
|
+
pp: string;
|
|
13
|
+
disconnect: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
export type ToClientEvents<T> = {
|
|
16
|
+
[x in keyof T]: FbnsNotification<T[x]>;
|
|
17
|
+
};
|
|
18
|
+
export interface FbnsNotificationEventParams {
|
|
19
|
+
post: {
|
|
20
|
+
id: string;
|
|
21
|
+
};
|
|
22
|
+
first_post: {
|
|
23
|
+
username: string;
|
|
24
|
+
};
|
|
25
|
+
resurrected_user_post: {
|
|
26
|
+
id: string;
|
|
27
|
+
};
|
|
28
|
+
recent_follow_post: {
|
|
29
|
+
id: string;
|
|
30
|
+
};
|
|
31
|
+
fb_first_post: {
|
|
32
|
+
username: string;
|
|
33
|
+
};
|
|
34
|
+
first_bestie_post: {
|
|
35
|
+
id: string;
|
|
36
|
+
};
|
|
37
|
+
direct_v2_message: {
|
|
38
|
+
id: string;
|
|
39
|
+
x: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fbns.client.events.js","sourceRoot":"","sources":["../../src/fbns/fbns.client.events.ts"],"names":[],"mappings":""}
|