@opencoredev/social-sdk 0.1.2 → 0.2.0
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 +6 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +235 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/common.d.ts +26 -0
- package/dist/cloud/common.d.ts.map +1 -0
- package/dist/cloud/common.js +335 -0
- package/dist/cloud/common.js.map +1 -0
- package/dist/cloud/lifecycle.d.ts +11 -0
- package/dist/cloud/lifecycle.d.ts.map +1 -0
- package/dist/cloud/lifecycle.js +113 -0
- package/dist/cloud/lifecycle.js.map +1 -0
- package/dist/cloud/media.d.ts +24 -0
- package/dist/cloud/media.d.ts.map +1 -0
- package/dist/cloud/media.js +101 -0
- package/dist/cloud/media.js.map +1 -0
- package/dist/cloud/outcomes.d.ts +10 -0
- package/dist/cloud/outcomes.d.ts.map +1 -0
- package/dist/cloud/outcomes.js +196 -0
- package/dist/cloud/outcomes.js.map +1 -0
- package/dist/cloud/post-for-me.d.ts +70 -0
- package/dist/cloud/post-for-me.d.ts.map +1 -0
- package/dist/cloud/post-for-me.js +397 -0
- package/dist/cloud/post-for-me.js.map +1 -0
- package/dist/cloud/zernio.d.ts +112 -0
- package/dist/cloud/zernio.d.ts.map +1 -0
- package/dist/cloud/zernio.js +633 -0
- package/dist/cloud/zernio.js.map +1 -0
- package/dist/core/adapter.d.ts +159 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +4 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/client.d.ts +142 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +1286 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/concurrency.d.ts +10 -0
- package/dist/core/concurrency.d.ts.map +1 -0
- package/dist/core/concurrency.js +80 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/errors.d.ts +45 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +51 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/idempotency.d.ts +34 -0
- package/dist/core/idempotency.d.ts.map +1 -0
- package/dist/core/idempotency.js +59 -0
- package/dist/core/idempotency.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pagination.d.ts +12 -0
- package/dist/core/pagination.d.ts.map +1 -0
- package/dist/core/pagination.js +82 -0
- package/dist/core/pagination.js.map +1 -0
- package/dist/core/types.d.ts +397 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +17 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/platforms/bluesky.d.ts +262 -0
- package/dist/platforms/bluesky.d.ts.map +1 -0
- package/dist/platforms/bluesky.js +1777 -0
- package/dist/platforms/bluesky.js.map +1 -0
- package/dist/platforms/instagram.d.ts +130 -0
- package/dist/platforms/instagram.d.ts.map +1 -0
- package/dist/platforms/instagram.js +1032 -0
- package/dist/platforms/instagram.js.map +1 -0
- package/dist/platforms/linkedin.d.ts +109 -0
- package/dist/platforms/linkedin.d.ts.map +1 -0
- package/dist/platforms/linkedin.js +891 -0
- package/dist/platforms/linkedin.js.map +1 -0
- package/dist/platforms/threads.d.ts +135 -0
- package/dist/platforms/threads.d.ts.map +1 -0
- package/dist/platforms/threads.js +946 -0
- package/dist/platforms/threads.js.map +1 -0
- package/dist/platforms/tiktok.d.ts +32 -0
- package/dist/platforms/tiktok.d.ts.map +1 -0
- package/dist/platforms/tiktok.js +594 -0
- package/dist/platforms/tiktok.js.map +1 -0
- package/dist/platforms/x-engagement.d.ts +17 -0
- package/dist/platforms/x-engagement.d.ts.map +1 -0
- package/dist/platforms/x-engagement.js +51 -0
- package/dist/platforms/x-engagement.js.map +1 -0
- package/dist/platforms/x.d.ts +300 -0
- package/dist/platforms/x.d.ts.map +1 -0
- package/dist/platforms/x.js +1288 -0
- package/dist/platforms/x.js.map +1 -0
- package/dist/platforms/youtube-upload.d.ts +33 -0
- package/dist/platforms/youtube-upload.d.ts.map +1 -0
- package/dist/platforms/youtube-upload.js +297 -0
- package/dist/platforms/youtube-upload.js.map +1 -0
- package/dist/platforms/youtube.d.ts +109 -0
- package/dist/platforms/youtube.d.ts.map +1 -0
- package/dist/platforms/youtube.js +1101 -0
- package/dist/platforms/youtube.js.map +1 -0
- package/dist/server/connections.d.ts +124 -0
- package/dist/server/connections.d.ts.map +1 -0
- package/dist/server/connections.js +336 -0
- package/dist/server/connections.js.map +1 -0
- package/dist/server/credentials.d.ts +52 -0
- package/dist/server/credentials.d.ts.map +1 -0
- package/dist/server/credentials.js +109 -0
- package/dist/server/credentials.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/oauth.d.ts +53 -0
- package/dist/server/oauth.d.ts.map +1 -0
- package/dist/server/oauth.js +554 -0
- package/dist/server/oauth.js.map +1 -0
- package/dist/server/webhooks.d.ts +58 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +205 -0
- package/dist/server/webhooks.js.map +1 -0
- package/dist/testing/index.d.ts +47 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +565 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/dist/transport/binary.d.ts +3 -0
- package/dist/transport/binary.d.ts.map +1 -0
- package/dist/transport/binary.js +30 -0
- package/dist/transport/binary.js.map +1 -0
- package/dist/transport/budget.d.ts +4 -0
- package/dist/transport/budget.d.ts.map +1 -0
- package/dist/transport/budget.js +27 -0
- package/dist/transport/budget.js.map +1 -0
- package/dist/transport/http.d.ts +45 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +260 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/json.d.ts +9 -0
- package/dist/transport/json.d.ts.map +1 -0
- package/dist/transport/json.js +17 -0
- package/dist/transport/json.js.map +1 -0
- package/dist/transport/upload.d.ts +26 -0
- package/dist/transport/upload.d.ts.map +1 -0
- package/dist/transport/upload.js +154 -0
- package/dist/transport/upload.js.map +1 -0
- package/dist/transport/validation.d.ts +6 -0
- package/dist/transport/validation.d.ts.map +1 -0
- package/dist/transport/validation.js +25 -0
- package/dist/transport/validation.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
/* oxlint-disable anti-slop/no-unknown-parameters -- validated external boundary or fixture contract. */
|
|
2
|
+
import { defineAdapter } from "../core/adapter.js";
|
|
3
|
+
import { SocialError } from "../core/errors.js";
|
|
4
|
+
import { managedHttp, publicFields } from "../cloud/common.js";
|
|
5
|
+
import { array, object, optionalNumber, optionalString, string } from "../transport/validation.js";
|
|
6
|
+
import { httpsUrl } from "../transport/upload.js";
|
|
7
|
+
const videoFields = [
|
|
8
|
+
"id",
|
|
9
|
+
"create_time",
|
|
10
|
+
"cover_image_url",
|
|
11
|
+
"share_url",
|
|
12
|
+
"title",
|
|
13
|
+
"video_description",
|
|
14
|
+
"duration",
|
|
15
|
+
"height",
|
|
16
|
+
"width",
|
|
17
|
+
"like_count",
|
|
18
|
+
"comment_count",
|
|
19
|
+
"share_count",
|
|
20
|
+
"view_count",
|
|
21
|
+
];
|
|
22
|
+
export function tiktok(options) {
|
|
23
|
+
const request = managedHttp("https://open.tiktokapis.com", {
|
|
24
|
+
apiKey: options.auth.accessToken,
|
|
25
|
+
// oxlint-disable-next-line anti-slop/no-conditional-empty-object-spread -- validated boundary or fixture contract.
|
|
26
|
+
...(options.fetch
|
|
27
|
+
? {
|
|
28
|
+
fetch: async (input, init) => {
|
|
29
|
+
const response = await options.fetch(input, init);
|
|
30
|
+
if (response.status < 400 || response.status >= 500)
|
|
31
|
+
return response;
|
|
32
|
+
const body = await response.clone().text();
|
|
33
|
+
try {
|
|
34
|
+
const parsed = JSON.parse(body);
|
|
35
|
+
const parsedObject = object(parsed);
|
|
36
|
+
const errorObject = object(parsedObject["error"]);
|
|
37
|
+
if (errorObject["code"] !== undefined)
|
|
38
|
+
return new Response(body, {
|
|
39
|
+
status: 200,
|
|
40
|
+
headers: response.headers,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Preserve ordinary HTTP error handling for non-JSON responses.
|
|
45
|
+
}
|
|
46
|
+
return response;
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
: {}),
|
|
50
|
+
});
|
|
51
|
+
const origins = new Set(options.verifiedMediaOrigins.map((value) => httpsUrl(value).origin));
|
|
52
|
+
const now = () => (options.clock?.() ?? new Date()).toISOString();
|
|
53
|
+
const authorize = (ref, context) => {
|
|
54
|
+
if (ref.backend !== context.backendInstance ||
|
|
55
|
+
ref.platform !== "tiktok" ||
|
|
56
|
+
ref.accountId !== options.auth.openId)
|
|
57
|
+
throw new SocialError({
|
|
58
|
+
code: "unauthorized",
|
|
59
|
+
operation: "tiktok",
|
|
60
|
+
message: "Account reference does not belong to this TikTok authorization.",
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- validated boundary or fixture contract.
|
|
64
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- validated boundary or fixture contract.
|
|
65
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- provider payload is validated at this adapter boundary.
|
|
66
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- validated external boundary or fixture contract.
|
|
67
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- validated external boundary or fixture contract.
|
|
68
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- validated external boundary or fixture contract.
|
|
69
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- validated external boundary or fixture contract.
|
|
70
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- validated external boundary or fixture contract.
|
|
71
|
+
const data = (value) => {
|
|
72
|
+
const response = object(value);
|
|
73
|
+
const error = object(response["error"]);
|
|
74
|
+
if (error["code"] !== "ok")
|
|
75
|
+
throw new SocialError({
|
|
76
|
+
code: error["code"] === "access_token_invalid"
|
|
77
|
+
? "reconnect_required"
|
|
78
|
+
: error["code"] === "scope_not_authorized" ||
|
|
79
|
+
error["code"] === "unaudited_client_can_only_post_to_private_accounts"
|
|
80
|
+
? "missing_permission"
|
|
81
|
+
: "upstream_failure",
|
|
82
|
+
operation: "tiktok",
|
|
83
|
+
message: "TikTok rejected the operation. Check creator eligibility, scope grants, and app audit status.",
|
|
84
|
+
upstreamCode: string(error["code"]),
|
|
85
|
+
});
|
|
86
|
+
return object(response["data"]);
|
|
87
|
+
};
|
|
88
|
+
const creatorInfo = async (account, context) => {
|
|
89
|
+
authorize(account, context);
|
|
90
|
+
const creator = data(await request("/v2/post/publish/creator_info/query/", context, {}));
|
|
91
|
+
return {
|
|
92
|
+
accountId: account.accountId,
|
|
93
|
+
backend: account.backend,
|
|
94
|
+
fetchedAt: now(),
|
|
95
|
+
username: string(creator["creator_username"]),
|
|
96
|
+
nickname: string(creator["creator_nickname"]),
|
|
97
|
+
privacyLevels: array(creator["privacy_level_options"]).map(string),
|
|
98
|
+
commentDisabled: creator["comment_disabled"] === true,
|
|
99
|
+
duetDisabled: creator["duet_disabled"] === true,
|
|
100
|
+
stitchDisabled: creator["stitch_disabled"] === true,
|
|
101
|
+
maxVideoDurationSeconds: optionalNumber(creator["max_video_post_duration_sec"]) ?? null,
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
const prepare = (target) => {
|
|
105
|
+
const issues = [];
|
|
106
|
+
const fail = (code, message) => issues.push({ code, message, severity: "error", targetIndex: target.targetIndex });
|
|
107
|
+
if (target.account.platform !== "tiktok" || target.account.accountId !== options.auth.openId)
|
|
108
|
+
fail("tiktok.account", "Select the configured TikTok creator.");
|
|
109
|
+
const config = target.options === undefined ? {} : object(target.options);
|
|
110
|
+
const draft = config["draft"] === true;
|
|
111
|
+
if (config["consentGiven"] !== true)
|
|
112
|
+
fail("tiktok.consent", "The creator must preview the content and explicitly consent before transfer.");
|
|
113
|
+
for (const key of [
|
|
114
|
+
"disableComments",
|
|
115
|
+
"disableDuet",
|
|
116
|
+
"disableStitch",
|
|
117
|
+
"brandedContent",
|
|
118
|
+
"ownBrand",
|
|
119
|
+
"aiGenerated",
|
|
120
|
+
"draft",
|
|
121
|
+
])
|
|
122
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
123
|
+
if (typeof config[key] !== "boolean")
|
|
124
|
+
fail(`tiktok.${key}`, `Explicit ${key} choice is required.`);
|
|
125
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
126
|
+
if (!draft && (!config["creatorInfo"] || typeof config["creatorInfo"] !== "object"))
|
|
127
|
+
fail("tiktok.creator_info", "Query creator information explicitly and render its choices before preparation.");
|
|
128
|
+
else if (!draft) {
|
|
129
|
+
const creator = object(config["creatorInfo"]);
|
|
130
|
+
if (creator["accountId"] !== target.account.accountId ||
|
|
131
|
+
creator["backend"] !== target.account.backend)
|
|
132
|
+
fail("tiktok.creator_mismatch", "Creator information belongs to a different account or backend.");
|
|
133
|
+
if (!array(creator["privacyLevels"]).includes(config["privacy"]))
|
|
134
|
+
fail("tiktok.privacy", "Choose a privacy level returned by this creator's information.");
|
|
135
|
+
}
|
|
136
|
+
const media = target.content.media ?? [];
|
|
137
|
+
const video = media.length === 1 && media[0]?.kind === "video";
|
|
138
|
+
if (!video &&
|
|
139
|
+
(media.length < 1 || media.length > 35 || media.some((item) => item.kind !== "image")))
|
|
140
|
+
fail("tiktok.media", "Choose one video or 1 to 35 photos; formats cannot be mixed.");
|
|
141
|
+
if ((target.content.text?.length ?? 0) > (video ? 2200 : 4000))
|
|
142
|
+
fail("tiktok.caption", "Caption exceeds TikTok's UTF-16 limit for this format.");
|
|
143
|
+
if (!video &&
|
|
144
|
+
config["title"] !== undefined &&
|
|
145
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
146
|
+
(typeof config["title"] !== "string" || config["title"].length > 90))
|
|
147
|
+
fail("tiktok.title", "Photo titles are limited to 90 UTF-16 code units.");
|
|
148
|
+
if (video && config["title"] !== undefined)
|
|
149
|
+
fail("tiktok.title", "Video captions use content.text; title is a photo-only option.");
|
|
150
|
+
if (!video &&
|
|
151
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
152
|
+
(typeof config["photoCoverIndex"] !== "number" ||
|
|
153
|
+
!Number.isInteger(config["photoCoverIndex"]) ||
|
|
154
|
+
config["photoCoverIndex"] < 0 ||
|
|
155
|
+
config["photoCoverIndex"] >= media.length))
|
|
156
|
+
fail("tiktok.cover", "Select a photo cover index within the attached images.");
|
|
157
|
+
for (const item of media) {
|
|
158
|
+
if (item.source.kind !== "https-url") {
|
|
159
|
+
fail("tiktok.source", "This slice uses verified PULL_FROM_URL media. Supply a URL on your TikTok-verified origin.");
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
if (!origins.has(httpsUrl(item.source.url).origin))
|
|
164
|
+
fail("tiktok.origin", "Media origin is not configured as verified for this TikTok app.");
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
fail("tiktok.url", "Media requires a public HTTPS URL.");
|
|
168
|
+
}
|
|
169
|
+
const mime = item.mimeType;
|
|
170
|
+
if (mime !== undefined &&
|
|
171
|
+
!(item.kind === "video"
|
|
172
|
+
? ["video/mp4", "video/quicktime", "video/webm"]
|
|
173
|
+
: ["image/jpeg", "image/webp"]).includes(mime))
|
|
174
|
+
fail("tiktok.mime", "Unsupported media MIME type for TikTok publishing.");
|
|
175
|
+
if (item.kind === "video" &&
|
|
176
|
+
(!Number.isFinite(item.durationSeconds) || (item.durationSeconds ?? 0) <= 0))
|
|
177
|
+
fail("tiktok.duration", "Provide known video duration to check the creator's duration limit.");
|
|
178
|
+
}
|
|
179
|
+
if (target.schedule || target.replyTo || target.content.link)
|
|
180
|
+
fail("tiktok.operation", "This publishing operation does not support schedules, replies, or structured links.");
|
|
181
|
+
return issues;
|
|
182
|
+
};
|
|
183
|
+
return defineAdapter({
|
|
184
|
+
id: "tiktok",
|
|
185
|
+
capabilities: {
|
|
186
|
+
schemaVersion: 1,
|
|
187
|
+
backend: "tiktok",
|
|
188
|
+
apiRevision: "Content Posting API v2",
|
|
189
|
+
runtime: ["node22", "node24", "bun"],
|
|
190
|
+
capabilities: [
|
|
191
|
+
{
|
|
192
|
+
platform: "tiktok",
|
|
193
|
+
operation: "posts.publish",
|
|
194
|
+
availability: "available",
|
|
195
|
+
formats: ["image", "video", "carousel"],
|
|
196
|
+
requiredScopes: ["video.publish"],
|
|
197
|
+
notes: "Verified URL source; explicit creator choices/consent. Public posting requires app audit. Draft mode uses video.upload.",
|
|
198
|
+
},
|
|
199
|
+
{ platform: "tiktok", operation: "posts.status", availability: "available" },
|
|
200
|
+
{
|
|
201
|
+
platform: "tiktok",
|
|
202
|
+
operation: "posts.read",
|
|
203
|
+
availability: "available",
|
|
204
|
+
requiredScopes: ["video.list"],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
platform: "tiktok",
|
|
208
|
+
operation: "posts.list",
|
|
209
|
+
availability: "available",
|
|
210
|
+
requiredScopes: ["video.list"],
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
platform: "tiktok",
|
|
214
|
+
operation: "posts.draft",
|
|
215
|
+
availability: "available",
|
|
216
|
+
requiredScopes: ["video.upload"],
|
|
217
|
+
},
|
|
218
|
+
{ platform: "tiktok", operation: "posts.status.poll", availability: "available" },
|
|
219
|
+
{
|
|
220
|
+
platform: "tiktok",
|
|
221
|
+
operation: "comments.read",
|
|
222
|
+
availability: "unsupported-by-platform",
|
|
223
|
+
notes: "Standard Content Posting and Display APIs do not expose comments.",
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
platform: "tiktok",
|
|
227
|
+
operation: "messages.read",
|
|
228
|
+
availability: "unsupported-by-platform",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
platform: "tiktok",
|
|
232
|
+
operation: "accounts.read",
|
|
233
|
+
availability: "available",
|
|
234
|
+
requiredScopes: ["user.info.basic"],
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
platform: "tiktok",
|
|
238
|
+
operation: "analytics.account.read",
|
|
239
|
+
availability: "available",
|
|
240
|
+
requiredScopes: ["user.info.stats"],
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
platform: "tiktok",
|
|
244
|
+
operation: "analytics.read",
|
|
245
|
+
availability: "available",
|
|
246
|
+
requiredScopes: ["video.list"],
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
accounts: {
|
|
251
|
+
async list(_input, context) {
|
|
252
|
+
const response = data(await request("/v2/user/info/", context, undefined, { fields: "open_id,display_name" }));
|
|
253
|
+
const user = object(response["user"]);
|
|
254
|
+
if (user["open_id"] !== options.auth.openId)
|
|
255
|
+
throw new SocialError({
|
|
256
|
+
code: "unauthorized",
|
|
257
|
+
operation: "accounts.read",
|
|
258
|
+
message: "TikTok returned a different authorized creator.",
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
items: [
|
|
262
|
+
{
|
|
263
|
+
ref: {
|
|
264
|
+
kind: "connected-account",
|
|
265
|
+
version: 1,
|
|
266
|
+
backend: context.backendInstance,
|
|
267
|
+
platform: "tiktok",
|
|
268
|
+
accountId: options.auth.openId,
|
|
269
|
+
},
|
|
270
|
+
displayName: string(user["display_name"]),
|
|
271
|
+
status: "connected",
|
|
272
|
+
},
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
},
|
|
276
|
+
async get(account, context) {
|
|
277
|
+
authorize(account, context);
|
|
278
|
+
const response = data(await request("/v2/user/info/", context, undefined, { fields: "open_id,display_name" }));
|
|
279
|
+
const user = object(response["user"]);
|
|
280
|
+
if (user["open_id"] !== account.accountId)
|
|
281
|
+
throw new SocialError({
|
|
282
|
+
code: "unauthorized",
|
|
283
|
+
operation: "accounts.read",
|
|
284
|
+
message: "TikTok creator identity mismatch.",
|
|
285
|
+
});
|
|
286
|
+
return {
|
|
287
|
+
ref: account,
|
|
288
|
+
displayName: string(user["display_name"]),
|
|
289
|
+
status: "connected",
|
|
290
|
+
};
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
posts: {
|
|
294
|
+
async get(ref, context) {
|
|
295
|
+
authorize(ref, context);
|
|
296
|
+
const result = data(await request("/v2/video/query/", context, { filters: { video_ids: [ref.postId] } }, {
|
|
297
|
+
fields: "id,create_time,cover_image_url,share_url,title,video_description,duration,height,width,like_count,comment_count,share_count,view_count",
|
|
298
|
+
}));
|
|
299
|
+
const row = array(result["videos"])
|
|
300
|
+
.map(object)
|
|
301
|
+
.find((video) => video["id"] === ref.postId);
|
|
302
|
+
if (!row)
|
|
303
|
+
throw new SocialError({
|
|
304
|
+
code: "upstream_failure",
|
|
305
|
+
operation: "posts.read",
|
|
306
|
+
message: "TikTok video was not found for this authorization.",
|
|
307
|
+
});
|
|
308
|
+
return publicFields(row, videoFields);
|
|
309
|
+
},
|
|
310
|
+
async list(account, input, context) {
|
|
311
|
+
authorize(account, context);
|
|
312
|
+
const limit = input.limit ?? 20;
|
|
313
|
+
const cursor = input.cursor === undefined ? 0 : Number(input.cursor);
|
|
314
|
+
if (!Number.isSafeInteger(limit) ||
|
|
315
|
+
limit < 1 ||
|
|
316
|
+
limit > 20 ||
|
|
317
|
+
!Number.isSafeInteger(cursor) ||
|
|
318
|
+
cursor < 0 ||
|
|
319
|
+
input.cursor === "")
|
|
320
|
+
throw new SocialError({
|
|
321
|
+
code: "invalid_input",
|
|
322
|
+
operation: "posts.read",
|
|
323
|
+
message: "TikTok requires a nonnegative cursor and page size from 1 to 20.",
|
|
324
|
+
});
|
|
325
|
+
const result = data(await request("/v2/video/list/", context, { cursor, max_count: limit }, {
|
|
326
|
+
fields: "id,create_time,cover_image_url,share_url,title,video_description,duration,height,width,like_count,comment_count,share_count,view_count",
|
|
327
|
+
}));
|
|
328
|
+
return {
|
|
329
|
+
items: array(result["videos"]).map((row) => publicFields(row, videoFields)),
|
|
330
|
+
// oxlint-disable-next-line anti-slop/no-conditional-empty-object-spread -- validated boundary or fixture contract.
|
|
331
|
+
...(result["has_more"] === true &&
|
|
332
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
333
|
+
typeof result["cursor"] === "number" &&
|
|
334
|
+
Number.isSafeInteger(result["cursor"]) &&
|
|
335
|
+
result["cursor"] >= 0
|
|
336
|
+
? { nextCursor: String(result["cursor"]) }
|
|
337
|
+
: {}),
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
prepareTarget: prepare,
|
|
341
|
+
async publishTarget(target, context) {
|
|
342
|
+
authorize(target.account, context);
|
|
343
|
+
const config = object(target.options);
|
|
344
|
+
const draft = config["draft"] === true;
|
|
345
|
+
const latest = draft ? undefined : await creatorInfo(target.account, context);
|
|
346
|
+
const media = target.content.media ?? [];
|
|
347
|
+
const first = media[0];
|
|
348
|
+
if (latest && !array(latest["privacyLevels"]).includes(config["privacy"]))
|
|
349
|
+
throw new SocialError({
|
|
350
|
+
code: "invalid_input",
|
|
351
|
+
operation: "posts.publish",
|
|
352
|
+
message: "Creator privacy choices changed. Refresh the preview and ask the creator to select again.",
|
|
353
|
+
});
|
|
354
|
+
for (const [remote, choice] of [
|
|
355
|
+
["commentDisabled", "disableComments"],
|
|
356
|
+
["duetDisabled", "disableDuet"],
|
|
357
|
+
["stitchDisabled", "disableStitch"],
|
|
358
|
+
])
|
|
359
|
+
if (first?.kind === "video" &&
|
|
360
|
+
latest &&
|
|
361
|
+
remote &&
|
|
362
|
+
choice &&
|
|
363
|
+
latest[remote] === true &&
|
|
364
|
+
config[choice] !== true)
|
|
365
|
+
throw new SocialError({
|
|
366
|
+
code: "invalid_input",
|
|
367
|
+
operation: "posts.publish",
|
|
368
|
+
message: "Creator interaction restrictions changed. Refresh the preview before publishing.",
|
|
369
|
+
});
|
|
370
|
+
if (!first || first.source.kind !== "https-url")
|
|
371
|
+
throw new SocialError({
|
|
372
|
+
code: "invalid_input",
|
|
373
|
+
operation: "posts.publish",
|
|
374
|
+
message: "Verified media URL required.",
|
|
375
|
+
});
|
|
376
|
+
if (first.kind === "video" &&
|
|
377
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
378
|
+
latest &&
|
|
379
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
380
|
+
typeof latest["maxVideoDurationSeconds"] === "number" &&
|
|
381
|
+
(first.durationSeconds ?? Infinity) > latest["maxVideoDurationSeconds"])
|
|
382
|
+
throw new SocialError({
|
|
383
|
+
code: "invalid_input",
|
|
384
|
+
operation: "posts.publish",
|
|
385
|
+
message: "Video exceeds this creator's allowed duration.",
|
|
386
|
+
});
|
|
387
|
+
const postInfo = {
|
|
388
|
+
title: target.content.text ?? "",
|
|
389
|
+
privacy_level: string(config["privacy"]),
|
|
390
|
+
disable_comment: config["disableComments"] === true,
|
|
391
|
+
brand_content_toggle: config["brandedContent"] === true,
|
|
392
|
+
brand_organic_toggle: config["ownBrand"] === true,
|
|
393
|
+
};
|
|
394
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- validated boundary or fixture contract.
|
|
395
|
+
let result;
|
|
396
|
+
if (first.kind === "video")
|
|
397
|
+
result = data(await request(draft ? "/v2/post/publish/inbox/video/init/" : "/v2/post/publish/video/init/", context, {
|
|
398
|
+
// oxlint-disable-next-line anti-slop/no-conditional-empty-object-spread -- validated boundary or fixture contract.
|
|
399
|
+
...(draft
|
|
400
|
+
? {}
|
|
401
|
+
: {
|
|
402
|
+
post_info: {
|
|
403
|
+
...postInfo,
|
|
404
|
+
disable_duet: config["disableDuet"] === true,
|
|
405
|
+
disable_stitch: config["disableStitch"] === true,
|
|
406
|
+
is_aigc: config["aiGenerated"] === true,
|
|
407
|
+
},
|
|
408
|
+
}),
|
|
409
|
+
source_info: { source: "PULL_FROM_URL", video_url: first.source.url },
|
|
410
|
+
}));
|
|
411
|
+
else
|
|
412
|
+
result = data(await request("/v2/post/publish/content/init/", context, {
|
|
413
|
+
post_info: {
|
|
414
|
+
...postInfo,
|
|
415
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
416
|
+
title: typeof config["title"] === "string" ? config["title"] : "",
|
|
417
|
+
description: target.content.text ?? "",
|
|
418
|
+
auto_add_music: false,
|
|
419
|
+
},
|
|
420
|
+
source_info: {
|
|
421
|
+
source: "PULL_FROM_URL",
|
|
422
|
+
photo_cover_index:
|
|
423
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
424
|
+
typeof config["photoCoverIndex"] === "number" ? config["photoCoverIndex"] : 0,
|
|
425
|
+
photo_images: media.map((item) => item.source.kind === "https-url" ? item.source.url : ""),
|
|
426
|
+
},
|
|
427
|
+
post_mode: draft ? "MEDIA_UPLOAD" : "DIRECT_POST",
|
|
428
|
+
media_type: "PHOTO",
|
|
429
|
+
is_aigc: config["aiGenerated"] === true,
|
|
430
|
+
}));
|
|
431
|
+
return {
|
|
432
|
+
state: "accepted",
|
|
433
|
+
account: target.account,
|
|
434
|
+
targetIndex: target.targetIndex,
|
|
435
|
+
observedAt: now(),
|
|
436
|
+
backendState: "INITIALIZED",
|
|
437
|
+
delivery: {
|
|
438
|
+
kind: "delivery",
|
|
439
|
+
version: 1,
|
|
440
|
+
backend: target.account.backend,
|
|
441
|
+
platform: "tiktok",
|
|
442
|
+
accountId: target.account.accountId,
|
|
443
|
+
deliveryId: string(result["publish_id"]),
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
},
|
|
447
|
+
async getDelivery(ref, context) {
|
|
448
|
+
authorize(ref, context);
|
|
449
|
+
const result = data(await request("/v2/post/publish/status/fetch/", context, { publish_id: ref.deliveryId }));
|
|
450
|
+
const state = string(result["status"]);
|
|
451
|
+
const base = {
|
|
452
|
+
account: {
|
|
453
|
+
kind: "connected-account",
|
|
454
|
+
version: 1,
|
|
455
|
+
backend: ref.backend,
|
|
456
|
+
platform: "tiktok",
|
|
457
|
+
accountId: ref.accountId,
|
|
458
|
+
},
|
|
459
|
+
targetIndex: 0,
|
|
460
|
+
observedAt: now(),
|
|
461
|
+
backendState: state,
|
|
462
|
+
delivery: { kind: "delivery", version: 1, ...ref },
|
|
463
|
+
};
|
|
464
|
+
if (state === "FAILED")
|
|
465
|
+
return {
|
|
466
|
+
...base,
|
|
467
|
+
state: "failed",
|
|
468
|
+
code: optionalString(result["fail_reason"]) ?? "upstream_failure",
|
|
469
|
+
message: "TikTok confirmed this publishing action failed.",
|
|
470
|
+
retryDisposition: ["internal", "video_pull_failed", "photo_pull_failed"].includes(optionalString(result["fail_reason"]) ?? "")
|
|
471
|
+
? { kind: "reconcile-first" }
|
|
472
|
+
: { kind: "never" },
|
|
473
|
+
};
|
|
474
|
+
if (state === "PROCESSING_UPLOAD" || state === "PROCESSING_DOWNLOAD")
|
|
475
|
+
return { ...base, state: "processing" };
|
|
476
|
+
if (state === "SEND_TO_USER_INBOX")
|
|
477
|
+
return { ...base, state: "accepted" };
|
|
478
|
+
if (state === "PUBLISH_COMPLETE") {
|
|
479
|
+
const ids = result["publicaly_available_post_id"];
|
|
480
|
+
const id = Array.isArray(ids) && ids.length === 1 ? ids[0] : undefined;
|
|
481
|
+
const nativeId =
|
|
482
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
483
|
+
typeof id === "string"
|
|
484
|
+
? id
|
|
485
|
+
: // oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
486
|
+
typeof id === "number" && Number.isSafeInteger(id)
|
|
487
|
+
? String(id)
|
|
488
|
+
: undefined;
|
|
489
|
+
if (nativeId)
|
|
490
|
+
return {
|
|
491
|
+
...base,
|
|
492
|
+
state: "published",
|
|
493
|
+
post: {
|
|
494
|
+
kind: "platform-post",
|
|
495
|
+
version: 1,
|
|
496
|
+
backend: ref.backend,
|
|
497
|
+
platform: "tiktok",
|
|
498
|
+
accountId: ref.accountId,
|
|
499
|
+
postId: nativeId,
|
|
500
|
+
},
|
|
501
|
+
};
|
|
502
|
+
return { ...base, state: "accepted" };
|
|
503
|
+
}
|
|
504
|
+
return {
|
|
505
|
+
...base,
|
|
506
|
+
state: "unknown",
|
|
507
|
+
reason: "unmapped-state",
|
|
508
|
+
diagnostic: "Native public identifier is unavailable or provider status is unmapped. Retain the publishing reference for reconciliation.",
|
|
509
|
+
};
|
|
510
|
+
},
|
|
511
|
+
},
|
|
512
|
+
analytics: {
|
|
513
|
+
async getPostMetrics(post, context) {
|
|
514
|
+
// https://developers.tiktok.com/doc/tiktok-api-v2-video-query/ (Display API video query)
|
|
515
|
+
authorize(post, context);
|
|
516
|
+
const result = data(await request("/v2/video/query/", context, { filters: { video_ids: [post.postId] } }, { fields: "id,like_count,comment_count,share_count,view_count" }));
|
|
517
|
+
const row = array(result["videos"])
|
|
518
|
+
.map(object)
|
|
519
|
+
.find((video) => video["id"] === post.postId);
|
|
520
|
+
if (!row)
|
|
521
|
+
return [];
|
|
522
|
+
const fetchedAt = now();
|
|
523
|
+
return ["like_count", "comment_count", "share_count", "view_count"].flatMap((field) =>
|
|
524
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
525
|
+
typeof row[field] === "number" && Number.isFinite(row[field])
|
|
526
|
+
? [
|
|
527
|
+
{
|
|
528
|
+
name: field,
|
|
529
|
+
// oxlint-disable-next-line anti-slop/require-safety-comment-for-type-assertion -- validated boundary or fixture contract.
|
|
530
|
+
value: row[field],
|
|
531
|
+
unit: "count",
|
|
532
|
+
period: "lifetime",
|
|
533
|
+
fetchedAt,
|
|
534
|
+
freshness: "unknown",
|
|
535
|
+
source: "tiktok:video.query",
|
|
536
|
+
},
|
|
537
|
+
]
|
|
538
|
+
: []);
|
|
539
|
+
},
|
|
540
|
+
async getAccountMetrics(account, context) {
|
|
541
|
+
// https://developers.tiktok.com/doc/tiktok-api-v2-user-info/
|
|
542
|
+
authorize(account, context);
|
|
543
|
+
const response = data(await request("/v2/user/info/", context, undefined, {
|
|
544
|
+
fields: "open_id,display_name,follower_count,following_count,likes_count,video_count",
|
|
545
|
+
}));
|
|
546
|
+
const user = object(response["user"]);
|
|
547
|
+
if (user["open_id"] !== account.accountId)
|
|
548
|
+
throw new SocialError({
|
|
549
|
+
code: "unauthorized",
|
|
550
|
+
operation: "analytics.account.read",
|
|
551
|
+
message: "TikTok creator identity mismatch.",
|
|
552
|
+
});
|
|
553
|
+
const fetchedAt = now();
|
|
554
|
+
return ["follower_count", "following_count", "likes_count", "video_count"].flatMap((field) =>
|
|
555
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- validated boundary or fixture contract.
|
|
556
|
+
typeof user[field] === "number" && Number.isFinite(user[field])
|
|
557
|
+
? [
|
|
558
|
+
{
|
|
559
|
+
name: field,
|
|
560
|
+
// oxlint-disable-next-line anti-slop/require-safety-comment-for-type-assertion -- validated boundary or fixture contract.
|
|
561
|
+
value: user[field],
|
|
562
|
+
unit: "count",
|
|
563
|
+
period: "lifetime",
|
|
564
|
+
fetchedAt,
|
|
565
|
+
freshness: "unknown",
|
|
566
|
+
source: "tiktok:user.info.stats",
|
|
567
|
+
},
|
|
568
|
+
]
|
|
569
|
+
: []);
|
|
570
|
+
},
|
|
571
|
+
},
|
|
572
|
+
native: {
|
|
573
|
+
creatorInfo,
|
|
574
|
+
async uploadDraft({ account, video, context }) {
|
|
575
|
+
authorize(account, context);
|
|
576
|
+
// oxlint-disable-next-line anti-slop/require-safety-comment-for-type-assertion -- validated boundary or fixture contract.
|
|
577
|
+
return data(await request("/v2/post/publish/inbox/video/init/", context, video));
|
|
578
|
+
},
|
|
579
|
+
async listVideos({ account, cursor, maxCount, context }) {
|
|
580
|
+
authorize(account, context);
|
|
581
|
+
const parsedCursor = cursor === undefined ? 0 : Number(cursor);
|
|
582
|
+
const result = data(await request("/v2/video/list/", context, { cursor: parsedCursor, max_count: maxCount ?? 20 }, { fields: videoFields.join(",") }));
|
|
583
|
+
// SAFETY: data() validates the provider response as a JSON object.
|
|
584
|
+
return result;
|
|
585
|
+
},
|
|
586
|
+
async publishStatus({ account, publishId, context }) {
|
|
587
|
+
authorize(account, context);
|
|
588
|
+
// oxlint-disable-next-line anti-slop/require-safety-comment-for-type-assertion -- validated boundary or fixture contract.
|
|
589
|
+
return data(await request("/v2/post/publish/status/fetch/", context, { publish_id: publishId }));
|
|
590
|
+
},
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
//# sourceMappingURL=tiktok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../../src/platforms/tiktok.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AdapterOperationContext, ConnectedAccountRef } from "../core/types.js";
|
|
2
|
+
/** Credential-ready helper. Applications must authorize the acting account before calling. */
|
|
3
|
+
export interface XEngagementOptions {
|
|
4
|
+
readonly userId: string;
|
|
5
|
+
readonly accessToken: string;
|
|
6
|
+
readonly fetch?: typeof globalThis.fetch;
|
|
7
|
+
}
|
|
8
|
+
export interface XEngagementResult {
|
|
9
|
+
readonly liked: boolean;
|
|
10
|
+
readonly tweetId: string;
|
|
11
|
+
readonly userId: string;
|
|
12
|
+
}
|
|
13
|
+
/** Requires like.write, tweet.read, users.read and the app's current API access. Never retries writes. */
|
|
14
|
+
export declare function xLike(tweetId: string, account: ConnectedAccountRef, options: XEngagementOptions, context: AdapterOperationContext): Promise<XEngagementResult>;
|
|
15
|
+
/** Deletes only the authenticated user's like; it does not delete the target post. */
|
|
16
|
+
export declare function xUnlike(tweetId: string, account: ConnectedAccountRef, options: XEngagementOptions, context: AdapterOperationContext): Promise<XEngagementResult>;
|
|
17
|
+
//# sourceMappingURL=x-engagement.d.ts.map
|