naystack 1.8.12 → 1.8.14
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/README.md +189 -31
- package/dist/auth/index.cjs.js +158 -18
- package/dist/auth/index.d.mts +3 -1
- package/dist/auth/index.d.ts +3 -1
- package/dist/auth/index.esm.js +158 -18
- package/dist/auth/instagram/index.cjs.js +158 -18
- package/dist/auth/instagram/index.d.mts +6 -1
- package/dist/auth/instagram/index.d.ts +6 -1
- package/dist/auth/instagram/index.esm.js +158 -18
- package/dist/auth/instagram/route.cjs.js +158 -18
- package/dist/auth/instagram/route.d.mts +3 -1
- package/dist/auth/instagram/route.d.ts +3 -1
- package/dist/auth/instagram/route.esm.js +158 -18
- package/dist/auth/instagram/utils.cjs.js +2 -2
- package/dist/auth/instagram/utils.d.mts +13 -2
- package/dist/auth/instagram/utils.d.ts +13 -2
- package/dist/auth/instagram/utils.esm.js +2 -2
- package/dist/file/setup.d.mts +13 -5
- package/dist/file/setup.d.ts +13 -5
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/socials/index.cjs.js +298 -72
- package/dist/socials/index.d.mts +6 -4
- package/dist/socials/index.d.ts +6 -4
- package/dist/socials/index.esm.js +296 -72
- package/dist/socials/instagram/getters.cjs.js +76 -25
- package/dist/socials/instagram/getters.d.mts +56 -6
- package/dist/socials/instagram/getters.d.ts +56 -6
- package/dist/socials/instagram/getters.esm.js +74 -25
- package/dist/socials/instagram/setters.cjs.js +192 -14
- package/dist/socials/instagram/setters.d.mts +43 -3
- package/dist/socials/instagram/setters.d.ts +43 -3
- package/dist/socials/instagram/setters.esm.js +191 -14
- package/dist/socials/instagram/types.d.mts +48 -11
- package/dist/socials/instagram/types.d.ts +48 -11
- package/dist/socials/instagram/utils.cjs.js +28 -15
- package/dist/socials/instagram/utils.d.mts +7 -18
- package/dist/socials/instagram/utils.d.ts +7 -18
- package/dist/socials/instagram/utils.esm.js +26 -14
- package/dist/socials/instagram/webhook.cjs.js +1 -1
- package/dist/socials/instagram/webhook.esm.js +1 -1
- package/dist/socials/meta/container.cjs.js +82 -0
- package/dist/socials/meta/container.d.mts +38 -0
- package/dist/socials/meta/container.d.ts +38 -0
- package/dist/socials/meta/container.esm.js +57 -0
- package/dist/socials/meta/request.cjs.js +60 -0
- package/dist/socials/meta/request.d.mts +50 -0
- package/dist/socials/meta/request.d.ts +50 -0
- package/dist/socials/meta/request.esm.js +34 -0
- package/dist/socials/meta/types.cjs.js +34 -0
- package/dist/socials/meta/types.d.mts +51 -0
- package/dist/socials/meta/types.d.ts +51 -0
- package/dist/socials/meta/types.esm.js +9 -0
- package/dist/socials/{meta-webhook.cjs.js → meta/webhook.cjs.js} +4 -4
- package/dist/socials/{meta-webhook.esm.js → meta/webhook.esm.js} +1 -1
- package/dist/socials/threads/getters.cjs.js +36 -11
- package/dist/socials/threads/getters.d.mts +23 -2
- package/dist/socials/threads/getters.d.ts +23 -2
- package/dist/socials/threads/getters.esm.js +35 -11
- package/dist/socials/threads/setters.cjs.js +150 -44
- package/dist/socials/threads/setters.d.mts +25 -34
- package/dist/socials/threads/setters.d.ts +25 -34
- package/dist/socials/threads/setters.esm.js +149 -41
- package/dist/socials/threads/types.d.mts +40 -1
- package/dist/socials/threads/types.d.ts +40 -1
- package/dist/socials/threads/utils.cjs.js +29 -11
- package/dist/socials/threads/utils.d.mts +8 -17
- package/dist/socials/threads/utils.d.ts +8 -17
- package/dist/socials/threads/utils.esm.js +27 -10
- package/dist/socials/threads/webhook.cjs.js +1 -1
- package/dist/socials/threads/webhook.esm.js +1 -1
- package/package.json +1 -1
- /package/dist/socials/{meta-webhook.d.mts → meta/webhook.d.mts} +0 -0
- /package/dist/socials/{meta-webhook.d.ts → meta/webhook.d.ts} +0 -0
|
@@ -1,36 +1,62 @@
|
|
|
1
|
-
// src/socials/
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
method: postData ? "POST" : "GET",
|
|
8
|
-
body: JSON.stringify(postData),
|
|
9
|
-
headers: {
|
|
10
|
-
Authorization: `Bearer ${token}`,
|
|
11
|
-
"Content-Type": "application/json"
|
|
1
|
+
// src/socials/meta/request.ts
|
|
2
|
+
function createGraphClient(baseURL) {
|
|
3
|
+
const buildURL = (token, path, params = {}) => {
|
|
4
|
+
const search = new URLSearchParams();
|
|
5
|
+
for (const [key, value] of Object.entries(params)) {
|
|
6
|
+
if (value !== void 0) search.set(key, String(value));
|
|
12
7
|
}
|
|
13
|
-
|
|
8
|
+
search.set("access_token", token);
|
|
9
|
+
return `${baseURL}/${path}?${search.toString()}`;
|
|
10
|
+
};
|
|
11
|
+
const request = async (token, path, options = {}) => {
|
|
12
|
+
const response = await fetch(buildURL(token, path, options.params), {
|
|
13
|
+
method: options.method || (options.body ? "POST" : "GET"),
|
|
14
|
+
headers: {
|
|
15
|
+
Authorization: `Bearer ${token}`,
|
|
16
|
+
...options.body ? { "Content-Type": "application/json" } : {}
|
|
17
|
+
},
|
|
18
|
+
...options.body ? { body: JSON.stringify(options.body) } : {}
|
|
19
|
+
});
|
|
20
|
+
return response.json().catch(() => null);
|
|
21
|
+
};
|
|
22
|
+
return { buildURL, request };
|
|
23
|
+
}
|
|
24
|
+
function readGraphID(label, result) {
|
|
25
|
+
if (result?.error) {
|
|
26
|
+
console.error(`[naystack] ${label} failed: ${result.error.message}`);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return result?.id || null;
|
|
14
30
|
}
|
|
15
31
|
|
|
32
|
+
// src/socials/instagram/utils.ts
|
|
33
|
+
var client = createGraphClient("https://graph.instagram.com/v23.0");
|
|
34
|
+
var getInstagramData = client.request;
|
|
35
|
+
|
|
16
36
|
// src/socials/instagram/getters.ts
|
|
17
37
|
var getInstagramUser = (token, id, fields) => {
|
|
18
38
|
return getInstagramData(token, id || "me", {
|
|
19
|
-
|
|
39
|
+
params: {
|
|
40
|
+
fields: fields ? fields.join(",") : "username,followers_count,media_count"
|
|
41
|
+
}
|
|
20
42
|
});
|
|
21
43
|
};
|
|
22
44
|
var getInstagramMedia = (token, fields, limit = 12) => {
|
|
23
45
|
return getInstagramData(token, "me/media", {
|
|
24
|
-
|
|
25
|
-
|
|
46
|
+
params: {
|
|
47
|
+
fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
|
|
48
|
+
limit
|
|
49
|
+
}
|
|
26
50
|
});
|
|
27
51
|
};
|
|
28
52
|
var getInstagramConversations = async (token, limit = 25, cursor) => {
|
|
29
53
|
const result = await getInstagramData(token, "me/conversations", {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
54
|
+
params: {
|
|
55
|
+
platform: "instagram",
|
|
56
|
+
fields: "participants,messages,updated_time",
|
|
57
|
+
limit,
|
|
58
|
+
after: cursor
|
|
59
|
+
}
|
|
34
60
|
});
|
|
35
61
|
return {
|
|
36
62
|
data: result?.data.map((item) => ({
|
|
@@ -46,8 +72,10 @@ var getInstagramConversationsByUser = (token, userID) => {
|
|
|
46
72
|
token,
|
|
47
73
|
"me/conversations",
|
|
48
74
|
{
|
|
49
|
-
|
|
50
|
-
|
|
75
|
+
params: {
|
|
76
|
+
fields: "participants,messages,updated_time",
|
|
77
|
+
user_id: userID
|
|
78
|
+
}
|
|
51
79
|
}
|
|
52
80
|
);
|
|
53
81
|
};
|
|
@@ -56,9 +84,11 @@ var getInstagramConversationByUser = async (token, userID) => {
|
|
|
56
84
|
return res?.data?.find((item) => item.participants?.data.length === 2);
|
|
57
85
|
};
|
|
58
86
|
var getInstagramConversation = async (token, id, cursor) => {
|
|
59
|
-
const result = await getInstagramData(token, id
|
|
60
|
-
|
|
61
|
-
|
|
87
|
+
const result = await getInstagramData(token, id, {
|
|
88
|
+
params: {
|
|
89
|
+
fields: "participants,messages,updated_time",
|
|
90
|
+
after: cursor
|
|
91
|
+
}
|
|
62
92
|
});
|
|
63
93
|
return {
|
|
64
94
|
messages: result?.messages?.data,
|
|
@@ -72,21 +102,191 @@ var getInstagramConversation = async (token, id, cursor) => {
|
|
|
72
102
|
};
|
|
73
103
|
var getInstagramMessage = (token, id, fields) => {
|
|
74
104
|
return getInstagramData(token, id, {
|
|
75
|
-
|
|
105
|
+
params: {
|
|
106
|
+
fields: fields ? fields.join(",") : "id,created_time,from,to,message"
|
|
107
|
+
}
|
|
76
108
|
});
|
|
77
109
|
};
|
|
110
|
+
var getInstagramContainerStatus = async (token, id) => {
|
|
111
|
+
const result = await getInstagramData(token, id, { params: { fields: "status_code,status" } });
|
|
112
|
+
if (!result?.status_code) return null;
|
|
113
|
+
return {
|
|
114
|
+
status: result.status_code,
|
|
115
|
+
error: result.status_code === "ERROR" ? result.status : void 0
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
var canPublishToInstagram = async (token) => {
|
|
119
|
+
const result = await getInstagramData(
|
|
120
|
+
token,
|
|
121
|
+
"me/content_publishing_limit",
|
|
122
|
+
{ params: { fields: "quota_usage" } }
|
|
123
|
+
);
|
|
124
|
+
if (!Array.isArray(result?.data)) {
|
|
125
|
+
console.error(
|
|
126
|
+
`[naystack] Instagram token cannot publish${result?.error ? `: ${result.error.message}` : ""}`
|
|
127
|
+
);
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// src/socials/meta/container.ts
|
|
134
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
135
|
+
async function waitForContainer(getState, { intervalMS = 5e3, timeoutMS = 3e5 } = {}) {
|
|
136
|
+
const deadline = Date.now() + timeoutMS;
|
|
137
|
+
let state = await getState();
|
|
138
|
+
if (!state) {
|
|
139
|
+
await sleep(2e3);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
while (state?.status === "IN_PROGRESS" && Date.now() < deadline) {
|
|
143
|
+
await sleep(intervalMS);
|
|
144
|
+
state = await getState();
|
|
145
|
+
}
|
|
146
|
+
return state;
|
|
147
|
+
}
|
|
148
|
+
function createPublisher(platform) {
|
|
149
|
+
const isReady = async (token, id, label, wait) => {
|
|
150
|
+
const state = await waitForContainer(
|
|
151
|
+
() => platform.getStatus(token, id),
|
|
152
|
+
wait
|
|
153
|
+
);
|
|
154
|
+
if (state && state.status !== "FINISHED" && state.status !== "PUBLISHED") {
|
|
155
|
+
console.error(
|
|
156
|
+
`[naystack] ${platform.name} ${label} ${id} is ${state.status}${state.error ? `: ${state.error}` : ""}`
|
|
157
|
+
);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
return true;
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
/** Creates a container, waits for it to finish processing, then publishes it. */
|
|
164
|
+
publish: async (token, params, wait) => {
|
|
165
|
+
const containerID = await platform.createContainer(token, params);
|
|
166
|
+
if (!containerID) return null;
|
|
167
|
+
if (!await isReady(token, containerID, "container", wait)) return null;
|
|
168
|
+
return platform.publish(token, containerID);
|
|
169
|
+
},
|
|
170
|
+
/** Creates and awaits every carousel child, resolving to their ids — or `null` if any failed. */
|
|
171
|
+
createChildren: async (token, items, wait) => {
|
|
172
|
+
const children = [];
|
|
173
|
+
for (const item of items) {
|
|
174
|
+
const childID = await platform.createContainer(token, {
|
|
175
|
+
...item,
|
|
176
|
+
is_carousel_item: true
|
|
177
|
+
});
|
|
178
|
+
if (!childID) return null;
|
|
179
|
+
if (!await isReady(token, childID, "carousel item", wait))
|
|
180
|
+
return null;
|
|
181
|
+
children.push(childID);
|
|
182
|
+
}
|
|
183
|
+
return children;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
78
187
|
|
|
79
188
|
// src/socials/instagram/setters.ts
|
|
189
|
+
var publisher = createPublisher({
|
|
190
|
+
name: "Instagram",
|
|
191
|
+
getStatus: getInstagramContainerStatus,
|
|
192
|
+
createContainer: async (token, params) => readGraphID(
|
|
193
|
+
"Instagram media container",
|
|
194
|
+
await getInstagramData(token, "me/media", {
|
|
195
|
+
params,
|
|
196
|
+
method: "POST"
|
|
197
|
+
})
|
|
198
|
+
),
|
|
199
|
+
publish: async (token, creationID) => readGraphID(
|
|
200
|
+
"Instagram publish",
|
|
201
|
+
await getInstagramData(token, "me/media_publish", {
|
|
202
|
+
params: { creation_id: creationID },
|
|
203
|
+
method: "POST"
|
|
204
|
+
})
|
|
205
|
+
)
|
|
206
|
+
});
|
|
207
|
+
var mediaParams = (media) => ({
|
|
208
|
+
media_type: media.type === "video" /* Video */ ? "VIDEO" : void 0,
|
|
209
|
+
image_url: media.type === "photo" /* Photo */ ? media.url : void 0,
|
|
210
|
+
video_url: media.type === "video" /* Video */ ? media.url : void 0,
|
|
211
|
+
// Instagram accepts alt text on images only.
|
|
212
|
+
alt_text: media.type === "photo" /* Photo */ ? media.altText : void 0
|
|
213
|
+
});
|
|
214
|
+
var createInstagramPost = async (token, input) => {
|
|
215
|
+
const media = [input.media].flat();
|
|
216
|
+
const first = media[0];
|
|
217
|
+
if (!first) {
|
|
218
|
+
console.error(
|
|
219
|
+
"[naystack] Instagram posts need at least one image or video"
|
|
220
|
+
);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
if (input.story) {
|
|
224
|
+
return publisher.publish(
|
|
225
|
+
token,
|
|
226
|
+
{
|
|
227
|
+
...mediaParams(first),
|
|
228
|
+
media_type: "STORIES",
|
|
229
|
+
alt_text: void 0
|
|
230
|
+
},
|
|
231
|
+
input.wait
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
if (media.length > 1) {
|
|
235
|
+
const children = await publisher.createChildren(
|
|
236
|
+
token,
|
|
237
|
+
media.map(mediaParams),
|
|
238
|
+
input.wait
|
|
239
|
+
);
|
|
240
|
+
if (!children) return null;
|
|
241
|
+
return publisher.publish(
|
|
242
|
+
token,
|
|
243
|
+
{
|
|
244
|
+
media_type: "CAROUSEL",
|
|
245
|
+
children: children.join(","),
|
|
246
|
+
caption: input.caption
|
|
247
|
+
},
|
|
248
|
+
input.wait
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
if (first.type === "video" /* Video */) {
|
|
252
|
+
return publisher.publish(
|
|
253
|
+
token,
|
|
254
|
+
{
|
|
255
|
+
media_type: "REELS",
|
|
256
|
+
video_url: first.url,
|
|
257
|
+
caption: input.caption,
|
|
258
|
+
cover_url: input.coverURL,
|
|
259
|
+
thumb_offset: input.thumbOffset,
|
|
260
|
+
share_to_feed: input.shareToFeed,
|
|
261
|
+
audio_name: input.audioName,
|
|
262
|
+
collaborators: input.collaborators && JSON.stringify(input.collaborators)
|
|
263
|
+
},
|
|
264
|
+
input.wait
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
return publisher.publish(
|
|
268
|
+
token,
|
|
269
|
+
{
|
|
270
|
+
image_url: first.url,
|
|
271
|
+
caption: input.caption,
|
|
272
|
+
alt_text: first.altText,
|
|
273
|
+
location_id: input.locationID
|
|
274
|
+
},
|
|
275
|
+
input.wait
|
|
276
|
+
);
|
|
277
|
+
};
|
|
80
278
|
var sendInstagramMessage = (token, to, text) => {
|
|
81
|
-
return getInstagramData(token, "me/messages",
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
279
|
+
return getInstagramData(token, "me/messages", {
|
|
280
|
+
body: {
|
|
281
|
+
recipient: { id: to },
|
|
282
|
+
message: {
|
|
283
|
+
text
|
|
284
|
+
}
|
|
85
285
|
}
|
|
86
286
|
});
|
|
87
287
|
};
|
|
88
288
|
|
|
89
|
-
// src/socials/meta
|
|
289
|
+
// src/socials/meta/webhook.ts
|
|
90
290
|
import { NextResponse } from "next/server";
|
|
91
291
|
var verifyWebhook = (secret) => (req) => {
|
|
92
292
|
const params = req.nextUrl.searchParams;
|
|
@@ -115,69 +315,91 @@ var setupInstagramWebhook = (options) => {
|
|
|
115
315
|
};
|
|
116
316
|
|
|
117
317
|
// src/socials/threads/utils.ts
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
function getThreadsData(token, path, params, method) {
|
|
122
|
-
return fetch(getThreadsURL(token, path, params), {
|
|
123
|
-
method: method || "GET"
|
|
124
|
-
}).then((res) => res.json());
|
|
125
|
-
}
|
|
318
|
+
var client2 = createGraphClient("https://graph.threads.net/v1.0");
|
|
319
|
+
var getThreadsData = client2.request;
|
|
126
320
|
|
|
127
321
|
// src/socials/threads/getters.ts
|
|
128
322
|
var getThread = (token, id, fields) => {
|
|
129
323
|
return getThreadsData(token, id, {
|
|
130
|
-
fields: fields ? fields.join(",") : "text,permalink,username"
|
|
324
|
+
params: { fields: fields ? fields.join(",") : "text,permalink,username" }
|
|
131
325
|
});
|
|
132
326
|
};
|
|
133
327
|
var getThreads = (token, fields) => {
|
|
134
328
|
return getThreadsData(token, "me/threads", {
|
|
135
|
-
fields: fields ? fields.join(",") : "text,permalink,username"
|
|
329
|
+
params: { fields: fields ? fields.join(",") : "text,permalink,username" }
|
|
136
330
|
}).then((res) => res?.data);
|
|
137
331
|
};
|
|
138
332
|
var getThreadsReplies = (token, id, fields) => {
|
|
139
333
|
return getThreadsData(token, `${id}/replies`, {
|
|
140
|
-
fields: fields ? fields.join(",") : "text,username,permalink"
|
|
334
|
+
params: { fields: fields ? fields.join(",") : "text,username,permalink" }
|
|
141
335
|
}).then((res) => res?.data);
|
|
142
336
|
};
|
|
337
|
+
var getThreadsContainerStatus = async (token, id) => {
|
|
338
|
+
const result = await getThreadsData(token, id, { params: { fields: "status,error_message" } });
|
|
339
|
+
if (!result?.status) return null;
|
|
340
|
+
return { status: result.status, error: result.error_message };
|
|
341
|
+
};
|
|
143
342
|
|
|
144
343
|
// src/socials/threads/setters.ts
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
344
|
+
var publisher2 = createPublisher({
|
|
345
|
+
name: "Threads",
|
|
346
|
+
getStatus: getThreadsContainerStatus,
|
|
347
|
+
createContainer: async (token, params) => readGraphID(
|
|
348
|
+
"Threads container",
|
|
349
|
+
await getThreadsData(token, "me/threads", {
|
|
350
|
+
params,
|
|
351
|
+
method: "POST"
|
|
352
|
+
})
|
|
353
|
+
),
|
|
354
|
+
publish: async (token, creationID) => readGraphID(
|
|
355
|
+
"Threads publish",
|
|
356
|
+
await getThreadsData(token, "me/threads_publish", {
|
|
357
|
+
params: { creation_id: creationID },
|
|
358
|
+
method: "POST"
|
|
359
|
+
})
|
|
360
|
+
)
|
|
361
|
+
});
|
|
362
|
+
var mediaParams2 = (media) => ({
|
|
363
|
+
media_type: media ? media.type === "video" /* Video */ ? "VIDEO" : "IMAGE" : "TEXT",
|
|
364
|
+
image_url: media?.type === "photo" /* Photo */ ? media.url : void 0,
|
|
365
|
+
video_url: media?.type === "video" /* Video */ ? media.url : void 0,
|
|
366
|
+
alt_text: media?.altText
|
|
367
|
+
});
|
|
368
|
+
var createThreadsPost = async (token, input, replyToID) => {
|
|
369
|
+
const post = typeof input === "string" ? { text: input } : input;
|
|
370
|
+
const media = post.media ? [post.media].flat() : [];
|
|
371
|
+
const shared = {
|
|
372
|
+
text: post.text,
|
|
373
|
+
reply_to_id: post.replyToID || replyToID,
|
|
374
|
+
reply_control: post.replyControl
|
|
375
|
+
};
|
|
376
|
+
if (media.length > 1) {
|
|
377
|
+
const children = await publisher2.createChildren(
|
|
378
|
+
token,
|
|
379
|
+
media.map((item) => mediaParams2(item)),
|
|
380
|
+
post.wait
|
|
381
|
+
);
|
|
382
|
+
if (!children) return null;
|
|
383
|
+
return publisher2.publish(
|
|
384
|
+
token,
|
|
385
|
+
{ ...shared, media_type: "CAROUSEL", children: children.join(",") },
|
|
386
|
+
post.wait
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
return publisher2.publish(
|
|
159
390
|
token,
|
|
160
|
-
"me/threads_publish",
|
|
161
391
|
{
|
|
162
|
-
|
|
392
|
+
...mediaParams2(media[0]),
|
|
393
|
+
...shared,
|
|
394
|
+
link_attachment: post.linkAttachment
|
|
163
395
|
},
|
|
164
|
-
|
|
165
|
-
)
|
|
166
|
-
}
|
|
167
|
-
var createThreadsPost = async (token, text, reply_to_id) => {
|
|
168
|
-
const containerID = await createContainer(token, text, reply_to_id);
|
|
169
|
-
if (!containerID) return null;
|
|
170
|
-
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
171
|
-
return publishContainer(token, containerID);
|
|
396
|
+
post.wait
|
|
397
|
+
);
|
|
172
398
|
};
|
|
173
|
-
var createThread = async (token,
|
|
399
|
+
var createThread = async (token, posts) => {
|
|
174
400
|
const publishedIDs = [];
|
|
175
|
-
for (const
|
|
176
|
-
const postID = await createThreadsPost(
|
|
177
|
-
token,
|
|
178
|
-
thread.split("\n").join("%0A"),
|
|
179
|
-
publishedIDs.at(-1)
|
|
180
|
-
);
|
|
401
|
+
for (const post of posts) {
|
|
402
|
+
const postID = await createThreadsPost(token, post, publishedIDs.at(-1));
|
|
181
403
|
if (postID) publishedIDs.push(postID);
|
|
182
404
|
}
|
|
183
405
|
return publishedIDs[0];
|
|
@@ -199,6 +421,8 @@ var setupThreadsWebhook = (options) => {
|
|
|
199
421
|
};
|
|
200
422
|
};
|
|
201
423
|
export {
|
|
424
|
+
canPublishToInstagram,
|
|
425
|
+
createInstagramPost,
|
|
202
426
|
createThread,
|
|
203
427
|
createThreadsPost,
|
|
204
428
|
getInstagramConversation,
|
|
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/socials/instagram/getters.ts
|
|
21
21
|
var getters_exports = {};
|
|
22
22
|
__export(getters_exports, {
|
|
23
|
+
canPublishToInstagram: () => canPublishToInstagram,
|
|
24
|
+
getInstagramContainerStatus: () => getInstagramContainerStatus,
|
|
23
25
|
getInstagramConversation: () => getInstagramConversation,
|
|
24
26
|
getInstagramConversationByUser: () => getInstagramConversationByUser,
|
|
25
27
|
getInstagramConversations: () => getInstagramConversations,
|
|
@@ -30,39 +32,58 @@ __export(getters_exports, {
|
|
|
30
32
|
});
|
|
31
33
|
module.exports = __toCommonJS(getters_exports);
|
|
32
34
|
|
|
33
|
-
// src/socials/
|
|
34
|
-
function
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
method: postData ? "POST" : "GET",
|
|
40
|
-
body: JSON.stringify(postData),
|
|
41
|
-
headers: {
|
|
42
|
-
Authorization: `Bearer ${token}`,
|
|
43
|
-
"Content-Type": "application/json"
|
|
35
|
+
// src/socials/meta/request.ts
|
|
36
|
+
function createGraphClient(baseURL) {
|
|
37
|
+
const buildURL = (token, path, params = {}) => {
|
|
38
|
+
const search = new URLSearchParams();
|
|
39
|
+
for (const [key, value] of Object.entries(params)) {
|
|
40
|
+
if (value !== void 0) search.set(key, String(value));
|
|
44
41
|
}
|
|
45
|
-
|
|
42
|
+
search.set("access_token", token);
|
|
43
|
+
return `${baseURL}/${path}?${search.toString()}`;
|
|
44
|
+
};
|
|
45
|
+
const request = async (token, path, options = {}) => {
|
|
46
|
+
const response = await fetch(buildURL(token, path, options.params), {
|
|
47
|
+
method: options.method || (options.body ? "POST" : "GET"),
|
|
48
|
+
headers: {
|
|
49
|
+
Authorization: `Bearer ${token}`,
|
|
50
|
+
...options.body ? { "Content-Type": "application/json" } : {}
|
|
51
|
+
},
|
|
52
|
+
...options.body ? { body: JSON.stringify(options.body) } : {}
|
|
53
|
+
});
|
|
54
|
+
return response.json().catch(() => null);
|
|
55
|
+
};
|
|
56
|
+
return { buildURL, request };
|
|
46
57
|
}
|
|
47
58
|
|
|
59
|
+
// src/socials/instagram/utils.ts
|
|
60
|
+
var client = createGraphClient("https://graph.instagram.com/v23.0");
|
|
61
|
+
var getInstagramData = client.request;
|
|
62
|
+
|
|
48
63
|
// src/socials/instagram/getters.ts
|
|
49
64
|
var getInstagramUser = (token, id, fields) => {
|
|
50
65
|
return getInstagramData(token, id || "me", {
|
|
51
|
-
|
|
66
|
+
params: {
|
|
67
|
+
fields: fields ? fields.join(",") : "username,followers_count,media_count"
|
|
68
|
+
}
|
|
52
69
|
});
|
|
53
70
|
};
|
|
54
71
|
var getInstagramMedia = (token, fields, limit = 12) => {
|
|
55
72
|
return getInstagramData(token, "me/media", {
|
|
56
|
-
|
|
57
|
-
|
|
73
|
+
params: {
|
|
74
|
+
fields: fields ? fields.join(",") : "like_count,comments_count,permalink",
|
|
75
|
+
limit
|
|
76
|
+
}
|
|
58
77
|
});
|
|
59
78
|
};
|
|
60
79
|
var getInstagramConversations = async (token, limit = 25, cursor) => {
|
|
61
80
|
const result = await getInstagramData(token, "me/conversations", {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
params: {
|
|
82
|
+
platform: "instagram",
|
|
83
|
+
fields: "participants,messages,updated_time",
|
|
84
|
+
limit,
|
|
85
|
+
after: cursor
|
|
86
|
+
}
|
|
66
87
|
});
|
|
67
88
|
return {
|
|
68
89
|
data: result?.data.map((item) => ({
|
|
@@ -78,8 +99,10 @@ var getInstagramConversationsByUser = (token, userID) => {
|
|
|
78
99
|
token,
|
|
79
100
|
"me/conversations",
|
|
80
101
|
{
|
|
81
|
-
|
|
82
|
-
|
|
102
|
+
params: {
|
|
103
|
+
fields: "participants,messages,updated_time",
|
|
104
|
+
user_id: userID
|
|
105
|
+
}
|
|
83
106
|
}
|
|
84
107
|
);
|
|
85
108
|
};
|
|
@@ -88,9 +111,11 @@ var getInstagramConversationByUser = async (token, userID) => {
|
|
|
88
111
|
return res?.data?.find((item) => item.participants?.data.length === 2);
|
|
89
112
|
};
|
|
90
113
|
var getInstagramConversation = async (token, id, cursor) => {
|
|
91
|
-
const result = await getInstagramData(token, id
|
|
92
|
-
|
|
93
|
-
|
|
114
|
+
const result = await getInstagramData(token, id, {
|
|
115
|
+
params: {
|
|
116
|
+
fields: "participants,messages,updated_time",
|
|
117
|
+
after: cursor
|
|
118
|
+
}
|
|
94
119
|
});
|
|
95
120
|
return {
|
|
96
121
|
messages: result?.messages?.data,
|
|
@@ -104,11 +129,37 @@ var getInstagramConversation = async (token, id, cursor) => {
|
|
|
104
129
|
};
|
|
105
130
|
var getInstagramMessage = (token, id, fields) => {
|
|
106
131
|
return getInstagramData(token, id, {
|
|
107
|
-
|
|
132
|
+
params: {
|
|
133
|
+
fields: fields ? fields.join(",") : "id,created_time,from,to,message"
|
|
134
|
+
}
|
|
108
135
|
});
|
|
109
136
|
};
|
|
137
|
+
var getInstagramContainerStatus = async (token, id) => {
|
|
138
|
+
const result = await getInstagramData(token, id, { params: { fields: "status_code,status" } });
|
|
139
|
+
if (!result?.status_code) return null;
|
|
140
|
+
return {
|
|
141
|
+
status: result.status_code,
|
|
142
|
+
error: result.status_code === "ERROR" ? result.status : void 0
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
var canPublishToInstagram = async (token) => {
|
|
146
|
+
const result = await getInstagramData(
|
|
147
|
+
token,
|
|
148
|
+
"me/content_publishing_limit",
|
|
149
|
+
{ params: { fields: "quota_usage" } }
|
|
150
|
+
);
|
|
151
|
+
if (!Array.isArray(result?.data)) {
|
|
152
|
+
console.error(
|
|
153
|
+
`[naystack] Instagram token cannot publish${result?.error ? `: ${result.error.message}` : ""}`
|
|
154
|
+
);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
};
|
|
110
159
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
160
|
0 && (module.exports = {
|
|
161
|
+
canPublishToInstagram,
|
|
162
|
+
getInstagramContainerStatus,
|
|
112
163
|
getInstagramConversation,
|
|
113
164
|
getInstagramConversationByUser,
|
|
114
165
|
getInstagramConversations,
|