@traceryn/tiktok-sdk 1.0.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/LICENSE +21 -0
- package/README.md +276 -0
- package/engineRequirements.js +7 -0
- package/lib/ProxiflyProvider.d.ts +24 -0
- package/lib/ProxiflyProvider.d.ts.map +1 -0
- package/lib/ProxiflyProvider.js +112 -0
- package/lib/ProxiflyProvider.js.map +1 -0
- package/lib/client.d.ts +42 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +377 -0
- package/lib/client.js.map +1 -0
- package/lib/core/CacheManager.d.ts +13 -0
- package/lib/core/CacheManager.d.ts.map +1 -0
- package/lib/core/CacheManager.js +49 -0
- package/lib/core/CacheManager.js.map +1 -0
- package/lib/core/CircuitBreaker.d.ts +21 -0
- package/lib/core/CircuitBreaker.d.ts.map +1 -0
- package/lib/core/CircuitBreaker.js +64 -0
- package/lib/core/CircuitBreaker.js.map +1 -0
- package/lib/core/Proxymanager.d.ts +32 -0
- package/lib/core/Proxymanager.d.ts.map +1 -0
- package/lib/core/Proxymanager.js +129 -0
- package/lib/core/Proxymanager.js.map +1 -0
- package/lib/core/RateLimiter.d.ts +17 -0
- package/lib/core/RateLimiter.d.ts.map +1 -0
- package/lib/core/RateLimiter.js +53 -0
- package/lib/core/RateLimiter.js.map +1 -0
- package/lib/core/RequestQueue.d.ts +17 -0
- package/lib/core/RequestQueue.d.ts.map +1 -0
- package/lib/core/RequestQueue.js +51 -0
- package/lib/core/RequestQueue.js.map +1 -0
- package/lib/core/RetryHandler.d.ts +13 -0
- package/lib/core/RetryHandler.d.ts.map +1 -0
- package/lib/core/RetryHandler.js +37 -0
- package/lib/core/RetryHandler.js.map +1 -0
- package/lib/core/SessionManager.d.ts +17 -0
- package/lib/core/SessionManager.d.ts.map +1 -0
- package/lib/core/SessionManager.js +57 -0
- package/lib/core/SessionManager.js.map +1 -0
- package/lib/core/Signer.d.ts +3 -0
- package/lib/core/Signer.d.ts.map +1 -0
- package/lib/core/Signer.js +26 -0
- package/lib/core/Signer.js.map +1 -0
- package/lib/index.d.ts +22 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +21 -0
- package/lib/index.js.map +1 -0
- package/lib/playwright.d.ts +46 -0
- package/lib/playwright.d.ts.map +1 -0
- package/lib/playwright.js +330 -0
- package/lib/playwright.js.map +1 -0
- package/lib/scrapers/CommentScraper.d.ts +6 -0
- package/lib/scrapers/CommentScraper.d.ts.map +1 -0
- package/lib/scrapers/CommentScraper.js +107 -0
- package/lib/scrapers/CommentScraper.js.map +1 -0
- package/lib/scrapers/ExtraScraper.d.ts +15 -0
- package/lib/scrapers/ExtraScraper.d.ts.map +1 -0
- package/lib/scrapers/ExtraScraper.js +244 -0
- package/lib/scrapers/ExtraScraper.js.map +1 -0
- package/lib/scrapers/FormatExtractor.d.ts +14 -0
- package/lib/scrapers/FormatExtractor.d.ts.map +1 -0
- package/lib/scrapers/FormatExtractor.js +110 -0
- package/lib/scrapers/FormatExtractor.js.map +1 -0
- package/lib/scrapers/ParserEngine.d.ts +17 -0
- package/lib/scrapers/ParserEngine.d.ts.map +1 -0
- package/lib/scrapers/ParserEngine.js +201 -0
- package/lib/scrapers/ParserEngine.js.map +1 -0
- package/lib/scrapers/SearchScraper.d.ts +5 -0
- package/lib/scrapers/SearchScraper.d.ts.map +1 -0
- package/lib/scrapers/SearchScraper.js +149 -0
- package/lib/scrapers/SearchScraper.js.map +1 -0
- package/lib/scrapers/UrlExtractor.d.ts +9 -0
- package/lib/scrapers/UrlExtractor.d.ts.map +1 -0
- package/lib/scrapers/UrlExtractor.js +34 -0
- package/lib/scrapers/UrlExtractor.js.map +1 -0
- package/lib/scrapers/UserScraper.d.ts +3 -0
- package/lib/scrapers/UserScraper.d.ts.map +1 -0
- package/lib/scrapers/UserScraper.js +137 -0
- package/lib/scrapers/UserScraper.js.map +1 -0
- package/lib/scrapers/VideoScraper.d.ts +3 -0
- package/lib/scrapers/VideoScraper.d.ts.map +1 -0
- package/lib/scrapers/VideoScraper.js +65 -0
- package/lib/scrapers/VideoScraper.js.map +1 -0
- package/lib/types.d.ts +483 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/CookieJar.d.ts +8 -0
- package/lib/utils/CookieJar.d.ts.map +1 -0
- package/lib/utils/CookieJar.js +51 -0
- package/lib/utils/CookieJar.js.map +1 -0
- package/lib/utils/HttpClient.d.ts +12 -0
- package/lib/utils/HttpClient.d.ts.map +1 -0
- package/lib/utils/HttpClient.js +39 -0
- package/lib/utils/HttpClient.js.map +1 -0
- package/lib/utils/constants.d.ts +41 -0
- package/lib/utils/constants.d.ts.map +1 -0
- package/lib/utils/constants.js +48 -0
- package/lib/utils/constants.js.map +1 -0
- package/lib/utils/errors.d.ts +31 -0
- package/lib/utils/errors.d.ts.map +1 -0
- package/lib/utils/errors.js +63 -0
- package/lib/utils/errors.js.map +1 -0
- package/lib/utils/helpers.d.ts +9 -0
- package/lib/utils/helpers.d.ts.map +1 -0
- package/lib/utils/helpers.js +41 -0
- package/lib/utils/helpers.js.map +1 -0
- package/lib/utils/xbogus.cjs +565 -0
- package/package.json +88 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { ofetch } from 'ofetch';
|
|
2
|
+
import { HEADERS } from '../utils/constants.js';
|
|
3
|
+
import { fetchTikTokCookies } from '../utils/CookieJar.js';
|
|
4
|
+
import { TikTokFetchError, TikTokWafError } from '../utils/errors.js';
|
|
5
|
+
const BASE = 'https://www.tiktok.com';
|
|
6
|
+
async function getCookies(_url, _proxy) {
|
|
7
|
+
return fetchTikTokCookies();
|
|
8
|
+
}
|
|
9
|
+
function parseVideo(data) {
|
|
10
|
+
return {
|
|
11
|
+
id: String(data.id ?? ''),
|
|
12
|
+
desc: String(data.desc ?? ''),
|
|
13
|
+
createTime: String(data.createTime ?? ''),
|
|
14
|
+
duration: Number(data.video?.duration ?? data.duration ?? 0),
|
|
15
|
+
playCount: Number(data.stats?.playCount ?? data.playCount ?? 0),
|
|
16
|
+
diggCount: Number(data.stats?.diggCount ?? data.diggCount ?? 0),
|
|
17
|
+
commentCount: Number(data.stats?.commentCount ?? data.commentCount ?? 0),
|
|
18
|
+
cover: String(data.video?.cover ?? data.cover ?? ''),
|
|
19
|
+
raw: data,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function guardResponse(res, endpoint) {
|
|
23
|
+
if (!res || typeof res !== 'object') {
|
|
24
|
+
throw new TikTokWafError(`TikTok API returned empty response for ${endpoint}. ` +
|
|
25
|
+
`Try using a PlaywrightSession — install with: npm install playwright`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function apiGet(url, cookieStr, referer, proxy) {
|
|
29
|
+
let res;
|
|
30
|
+
try {
|
|
31
|
+
res = await ofetch(url, {
|
|
32
|
+
headers: {
|
|
33
|
+
...HEADERS.api,
|
|
34
|
+
Referer: referer,
|
|
35
|
+
Cookie: cookieStr,
|
|
36
|
+
},
|
|
37
|
+
...(proxy ? { proxy } : {}),
|
|
38
|
+
timeout: 15000,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const ofetchErr = err;
|
|
43
|
+
throw new TikTokFetchError(`API request failed: ${err.message}`, ofetchErr.status);
|
|
44
|
+
}
|
|
45
|
+
const ep = url.split('?')[0]?.split('/').filter(Boolean).pop() ?? 'api';
|
|
46
|
+
guardResponse(res, ep);
|
|
47
|
+
return res;
|
|
48
|
+
}
|
|
49
|
+
export async function fetchHashtag(name, proxy) {
|
|
50
|
+
const cookieStr = await getCookies(`${BASE}/tag/${name}`, proxy);
|
|
51
|
+
const res = await apiGet(`${BASE}/api/challenge/detail/?aid=1988&challengeName=${encodeURIComponent(name)}`, cookieStr, `${BASE}/tag/${name}`, proxy);
|
|
52
|
+
const ci = res.challengeInfo ?? {};
|
|
53
|
+
const ch = ci.challenge ?? {};
|
|
54
|
+
const st = ci.stats ?? {};
|
|
55
|
+
const st2 = ci.statsV2 ?? {};
|
|
56
|
+
return {
|
|
57
|
+
by: 'Traceryn',
|
|
58
|
+
id: String(ch.id ?? ''),
|
|
59
|
+
title: String(ch.title ?? name),
|
|
60
|
+
desc: String(ch.desc ?? ''),
|
|
61
|
+
stats: {
|
|
62
|
+
videoCount: Number(st2.videoCount ?? st.videoCount ?? 0),
|
|
63
|
+
viewCount: Number(st2.viewCount ?? st.viewCount ?? 0),
|
|
64
|
+
},
|
|
65
|
+
raw: res,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export async function fetchSound(musicId, proxy, session) {
|
|
69
|
+
if (session?.isReady) {
|
|
70
|
+
const res = await session.request('/api/music/detail/', {
|
|
71
|
+
aid: '1988', musicId,
|
|
72
|
+
});
|
|
73
|
+
const mi = res.musicInfo ?? {};
|
|
74
|
+
const m = mi.music ?? {};
|
|
75
|
+
const s = mi.stats ?? {};
|
|
76
|
+
const a = mi.author ?? {};
|
|
77
|
+
return {
|
|
78
|
+
by: 'Traceryn',
|
|
79
|
+
id: String(m.id ?? musicId),
|
|
80
|
+
title: String(m.title ?? ''),
|
|
81
|
+
author: String(a.uniqueId ?? a.nickname ?? ''),
|
|
82
|
+
original: Boolean(m.original ?? false),
|
|
83
|
+
duration: Number(m.duration ?? 0),
|
|
84
|
+
playUrl: String(m.playUrl ?? ''),
|
|
85
|
+
coverLarge: String(m.coverLarge ?? ''),
|
|
86
|
+
coverMedium: String(m.coverMedium ?? ''),
|
|
87
|
+
coverThumb: String(m.coverThumb ?? ''),
|
|
88
|
+
stats: { videoCount: Number(s.videoCount ?? 0) },
|
|
89
|
+
raw: res,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const cookieStr = await getCookies(`${BASE}/music/${musicId}`, proxy);
|
|
93
|
+
const res = await apiGet(`${BASE}/api/music/detail/?aid=1988&musicId=${musicId}`, cookieStr, `${BASE}/music/${musicId}`, proxy);
|
|
94
|
+
const mi = res.musicInfo ?? {};
|
|
95
|
+
const m = mi.music ?? {};
|
|
96
|
+
const s = mi.stats ?? {};
|
|
97
|
+
const a = mi.author ?? {};
|
|
98
|
+
return {
|
|
99
|
+
by: 'Traceryn',
|
|
100
|
+
id: String(m.id ?? musicId),
|
|
101
|
+
title: String(m.title ?? ''),
|
|
102
|
+
author: String(a.uniqueId ?? a.nickname ?? ''),
|
|
103
|
+
original: Boolean(m.original ?? false),
|
|
104
|
+
duration: Number(m.duration ?? 0),
|
|
105
|
+
playUrl: String(m.playUrl ?? ''),
|
|
106
|
+
coverLarge: String(m.coverLarge ?? ''),
|
|
107
|
+
coverMedium: String(m.coverMedium ?? ''),
|
|
108
|
+
coverThumb: String(m.coverThumb ?? ''),
|
|
109
|
+
stats: { videoCount: Number(s.videoCount ?? 0) },
|
|
110
|
+
raw: res,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export async function fetchSoundVideos(musicId, cursor = 0, count = 30, proxy, session) {
|
|
114
|
+
if (session?.isReady) {
|
|
115
|
+
const res = await session.request('/api/music/item_list/', {
|
|
116
|
+
aid: '1988', musicID: musicId, count: String(count), cursor: String(cursor),
|
|
117
|
+
});
|
|
118
|
+
const items = res.itemList ?? [];
|
|
119
|
+
return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
|
|
120
|
+
}
|
|
121
|
+
const cookieStr = await getCookies(`${BASE}/music/${musicId}`, proxy);
|
|
122
|
+
const res = await apiGet(`${BASE}/api/music/item_list/?aid=1988&musicID=${musicId}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/music/${musicId}`, proxy);
|
|
123
|
+
const items = res.itemList ?? [];
|
|
124
|
+
return {
|
|
125
|
+
videos: items.map(parseVideo),
|
|
126
|
+
cursor: Number(res.cursor ?? cursor),
|
|
127
|
+
hasMore: Boolean(res.hasMore ?? false),
|
|
128
|
+
raw: res,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export async function fetchTrending(count = 30, proxy, session) {
|
|
132
|
+
if (session?.isReady) {
|
|
133
|
+
const res = await session.request('/api/recommend/item_list/', {
|
|
134
|
+
aid: '1988', from_page: 'fyp', count: String(count),
|
|
135
|
+
});
|
|
136
|
+
const items = res.itemList ?? [];
|
|
137
|
+
return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? 0), hasMore: Boolean(res.hasMore ?? false), raw: res };
|
|
138
|
+
}
|
|
139
|
+
const cookieStr = await getCookies(`${BASE}/foryou`, proxy);
|
|
140
|
+
const res = await apiGet(`${BASE}/api/recommend/item_list/?aid=1988&from_page=fyp&count=${count}`, cookieStr, `${BASE}/foryou`, proxy);
|
|
141
|
+
const items = res.itemList ?? [];
|
|
142
|
+
return {
|
|
143
|
+
videos: items.map(parseVideo),
|
|
144
|
+
cursor: Number(res.cursor ?? 0),
|
|
145
|
+
hasMore: Boolean(res.hasMore ?? false),
|
|
146
|
+
raw: res,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export async function fetchUserLikedVideos(secUid, cursor = 0, count = 30, proxy, session) {
|
|
150
|
+
if (session?.isReady) {
|
|
151
|
+
const res = await session.request('/api/favorite/item_list/', {
|
|
152
|
+
aid: '1988', secUid, count: String(count), cursor: String(cursor),
|
|
153
|
+
});
|
|
154
|
+
const items = res.itemList ?? [];
|
|
155
|
+
return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
|
|
156
|
+
}
|
|
157
|
+
const cookieStr = await getCookies(`${BASE}/`, proxy);
|
|
158
|
+
const res = await apiGet(`${BASE}/api/favorite/item_list/?aid=1988&secUid=${secUid}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
|
|
159
|
+
const items = res.itemList ?? [];
|
|
160
|
+
return {
|
|
161
|
+
videos: items.map(parseVideo),
|
|
162
|
+
cursor: Number(res.cursor ?? cursor),
|
|
163
|
+
hasMore: Boolean(res.hasMore ?? false),
|
|
164
|
+
raw: res,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export async function fetchUserPlaylists(secUid, cursor = 0, count = 30, proxy, session) {
|
|
168
|
+
if (session?.isReady) {
|
|
169
|
+
const res = await session.request('/api/user/playlist', {
|
|
170
|
+
aid: '1988', secUid, count: String(count), cursor: String(cursor),
|
|
171
|
+
});
|
|
172
|
+
const items = res.playList ?? [];
|
|
173
|
+
const plItems = res.playList ?? [];
|
|
174
|
+
return {
|
|
175
|
+
playlists: plItems.map((p) => ({
|
|
176
|
+
by: 'Traceryn', id: String(p.id ?? p.mixId ?? ''), name: String(p.name ?? p.mixName ?? ''),
|
|
177
|
+
videoCount: Number(p.videoCount ?? 0), coverUrl: String(p.cover ?? ''),
|
|
178
|
+
authorName: String(p.creator?.uniqueId ?? p.creator?.nickname ?? ''),
|
|
179
|
+
raw: p,
|
|
180
|
+
})),
|
|
181
|
+
cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const cookieStr = await getCookies(`${BASE}/`, proxy);
|
|
185
|
+
const res = await apiGet(`${BASE}/api/user/playlist?aid=1988&secUid=${secUid}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
|
|
186
|
+
const plItems = res.playList ?? [];
|
|
187
|
+
return {
|
|
188
|
+
playlists: plItems.map((p) => ({
|
|
189
|
+
by: 'Traceryn',
|
|
190
|
+
id: String(p.id ?? p.mixId ?? ''),
|
|
191
|
+
name: String(p.name ?? p.mixName ?? ''),
|
|
192
|
+
videoCount: Number(p.videoCount ?? 0),
|
|
193
|
+
coverUrl: String(p.cover ?? ''),
|
|
194
|
+
authorName: String(p.creator?.uniqueId ?? p.creator?.nickname ?? ''),
|
|
195
|
+
raw: p,
|
|
196
|
+
})),
|
|
197
|
+
cursor: Number(res.cursor ?? cursor),
|
|
198
|
+
hasMore: Boolean(res.hasMore ?? false),
|
|
199
|
+
raw: res,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
export async function fetchPlaylist(mixId, proxy, session) {
|
|
203
|
+
if (session?.isReady) {
|
|
204
|
+
const res = await session.request('/api/mix/detail/', { aid: '1988', mixId });
|
|
205
|
+
const mi = res.mixInfo ?? {};
|
|
206
|
+
return {
|
|
207
|
+
by: 'Traceryn', id: String(mi.id ?? mi.mixId ?? mixId), name: String(mi.name ?? mi.mixName ?? ''),
|
|
208
|
+
videoCount: Number(mi.videoCount ?? 0), coverUrl: String(mi.cover ?? ''),
|
|
209
|
+
authorName: String(mi.creator?.uniqueId ?? mi.creator?.nickname ?? ''),
|
|
210
|
+
raw: res,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const cookieStr = await getCookies(`${BASE}/`, proxy);
|
|
214
|
+
const res = await apiGet(`${BASE}/api/mix/detail/?aid=1988&mixId=${mixId}`, cookieStr, `${BASE}/`, proxy);
|
|
215
|
+
const mi = res.mixInfo ?? {};
|
|
216
|
+
return {
|
|
217
|
+
by: 'Traceryn',
|
|
218
|
+
id: String(mi.id ?? mi.mixId ?? mixId),
|
|
219
|
+
name: String(mi.name ?? mi.mixName ?? ''),
|
|
220
|
+
videoCount: Number(mi.videoCount ?? 0),
|
|
221
|
+
coverUrl: String(mi.cover ?? ''),
|
|
222
|
+
authorName: String(mi.creator?.uniqueId ?? mi.creator?.nickname ?? ''),
|
|
223
|
+
raw: res,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
export async function fetchPlaylistVideos(mixId, cursor = 0, count = 30, proxy, session) {
|
|
227
|
+
if (session?.isReady) {
|
|
228
|
+
const res = await session.request('/api/mix/item_list/', {
|
|
229
|
+
aid: '1988', mixId, count: String(count), cursor: String(cursor),
|
|
230
|
+
});
|
|
231
|
+
const items = res.itemList ?? [];
|
|
232
|
+
return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
|
|
233
|
+
}
|
|
234
|
+
const cookieStr = await getCookies(`${BASE}/`, proxy);
|
|
235
|
+
const res = await apiGet(`${BASE}/api/mix/item_list/?aid=1988&mixId=${mixId}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
|
|
236
|
+
const items = res.itemList ?? [];
|
|
237
|
+
return {
|
|
238
|
+
videos: items.map(parseVideo),
|
|
239
|
+
cursor: Number(res.cursor ?? cursor),
|
|
240
|
+
hasMore: Boolean(res.has_more ?? false),
|
|
241
|
+
raw: res,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=ExtraScraper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtraScraper.js","sourceRoot":"","sources":["../../src/scrapers/ExtraScraper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ItemStruct, FormatEntry } from '../types.js';
|
|
2
|
+
export declare function extractFormats(item: ItemStruct): FormatEntry[];
|
|
3
|
+
export declare function extractSubtitles(item: ItemStruct): Record<string, {
|
|
4
|
+
url: string;
|
|
5
|
+
ext: string;
|
|
6
|
+
}[]>;
|
|
7
|
+
export declare function findBestQuality(item: ItemStruct): {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
url: string;
|
|
11
|
+
codec: string;
|
|
12
|
+
bitrate: number;
|
|
13
|
+
} | null;
|
|
14
|
+
//# sourceMappingURL=FormatExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatExtractor.d.ts","sourceRoot":"","sources":["../../src/scrapers/FormatExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AAgBzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,CAuD9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU;SAIF,MAAM;SAAO,MAAM;KAUjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU;;;;;;SAsB/C"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
function pickFormatId(entry, index) {
|
|
2
|
+
const gear = entry.GearName ?? '';
|
|
3
|
+
const codec = entry.CodecType === 'h265_hvc1' ? 'bytevc1' : 'h264';
|
|
4
|
+
const resolution = gear.includes('720') ? '720p' : gear.includes('540') ? '540p' : 'unknown';
|
|
5
|
+
return `${codec}_${resolution}_${entry.Bitrate}-${index}`;
|
|
6
|
+
}
|
|
7
|
+
function pickFormatNote(entry) {
|
|
8
|
+
const codec = entry.CodecType === 'h265_hvc1' ? 'h265' : 'h264';
|
|
9
|
+
const gear = entry.GearName ?? '';
|
|
10
|
+
const resolution = gear.includes('720') ? '720x1280' : gear.includes('540') ? '576x1024' : 'unknown';
|
|
11
|
+
return `${codec} ${resolution}`;
|
|
12
|
+
}
|
|
13
|
+
export function extractFormats(item) {
|
|
14
|
+
const formats = [];
|
|
15
|
+
const wmUrl = item.video?.downloadAddr || item.video?.playAddr || '';
|
|
16
|
+
if (wmUrl) {
|
|
17
|
+
formats.push({
|
|
18
|
+
format_id: 'download',
|
|
19
|
+
format: 'download - unknown (watermarked)',
|
|
20
|
+
format_note: 'watermarked',
|
|
21
|
+
ext: 'mp4',
|
|
22
|
+
vcodec: 'h264', acodec: 'aac',
|
|
23
|
+
width: 0, height: 0, resolution: 'unknown',
|
|
24
|
+
tbr: 0, filesize: 0,
|
|
25
|
+
url: wmUrl, urls: [wmUrl],
|
|
26
|
+
quality: -2, dynamic_range: 'SDR', aspect_ratio: 0, protocol: 'https',
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const bitrateInfo = item.video?.bitrateInfo;
|
|
30
|
+
if (!bitrateInfo?.length)
|
|
31
|
+
return formats;
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
bitrateInfo.forEach((entry, i) => {
|
|
34
|
+
if (!entry)
|
|
35
|
+
return;
|
|
36
|
+
const w = entry.PlayAddr?.Width ?? 0;
|
|
37
|
+
const h = entry.PlayAddr?.Height ?? 0;
|
|
38
|
+
const urlList = entry.PlayAddr?.UrlList ?? [];
|
|
39
|
+
const url = urlList[0] ?? '';
|
|
40
|
+
const filesize = parseInt(entry.PlayAddr?.DataSize ?? '0', 10) || 0;
|
|
41
|
+
if (seen.has(entry.PlayAddr?.FileHash ?? ''))
|
|
42
|
+
return;
|
|
43
|
+
if (entry.PlayAddr?.FileHash)
|
|
44
|
+
seen.add(entry.PlayAddr.FileHash);
|
|
45
|
+
const formatId = pickFormatId(entry, i);
|
|
46
|
+
const codec = entry.CodecType === 'h265_hvc1' ? 'h265' : entry.CodecType || 'h264';
|
|
47
|
+
const tbr = Math.round(entry.Bitrate / 1000);
|
|
48
|
+
formats.push({
|
|
49
|
+
format_id: formatId,
|
|
50
|
+
format: `${formatId} - ${w}x${h}`,
|
|
51
|
+
format_note: pickFormatNote(entry),
|
|
52
|
+
ext: entry.Format || 'mp4',
|
|
53
|
+
vcodec: codec, acodec: 'aac',
|
|
54
|
+
width: w, height: h,
|
|
55
|
+
resolution: `${w}x${h}`,
|
|
56
|
+
tbr, filesize,
|
|
57
|
+
url, urls: urlList,
|
|
58
|
+
quality: entry.QualityType,
|
|
59
|
+
dynamic_range: 'SDR',
|
|
60
|
+
aspect_ratio: w > 0 && h > 0 ? +(w / h).toFixed(2) : 0,
|
|
61
|
+
protocol: 'https',
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
return formats;
|
|
65
|
+
}
|
|
66
|
+
export function extractSubtitles(item) {
|
|
67
|
+
const infos = item.video?.subtitleInfos;
|
|
68
|
+
if (!infos?.length)
|
|
69
|
+
return {};
|
|
70
|
+
const subtitles = {};
|
|
71
|
+
for (const sub of infos) {
|
|
72
|
+
const lang = sub.LanguageCodeName || 'unknown';
|
|
73
|
+
if (!subtitles[lang])
|
|
74
|
+
subtitles[lang] = [];
|
|
75
|
+
subtitles[lang].push({
|
|
76
|
+
url: sub.Url,
|
|
77
|
+
ext: sub.Format === 'webvtt' ? 'vtt' : sub.Format || 'vtt',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return subtitles;
|
|
81
|
+
}
|
|
82
|
+
export function findBestQuality(item) {
|
|
83
|
+
const bitrateInfo = item.video?.bitrateInfo;
|
|
84
|
+
if (!bitrateInfo?.length)
|
|
85
|
+
return null;
|
|
86
|
+
let best = null;
|
|
87
|
+
for (const entry of bitrateInfo) {
|
|
88
|
+
if (!entry)
|
|
89
|
+
continue;
|
|
90
|
+
if (!best) {
|
|
91
|
+
best = entry;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const entryArea = (entry.PlayAddr?.Width ?? 0) * (entry.PlayAddr?.Height ?? 0);
|
|
95
|
+
const bestArea = (best.PlayAddr?.Width ?? 0) * (best.PlayAddr?.Height ?? 0);
|
|
96
|
+
if (entryArea > bestArea || (entryArea === bestArea && entry.Bitrate > best.Bitrate)) {
|
|
97
|
+
best = entry;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!best)
|
|
101
|
+
return null;
|
|
102
|
+
return {
|
|
103
|
+
width: best.PlayAddr?.Width ?? 0,
|
|
104
|
+
height: best.PlayAddr?.Height ?? 0,
|
|
105
|
+
url: best.PlayAddr?.UrlList?.[0] ?? '',
|
|
106
|
+
codec: best.CodecType ?? '',
|
|
107
|
+
bitrate: best.Bitrate ?? 0,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=FormatExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatExtractor.js","sourceRoot":"","sources":["../../src/scrapers/FormatExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ItemStruct } from '../types.js';
|
|
2
|
+
export interface ParseResult {
|
|
3
|
+
itemStruct: ItemStruct;
|
|
4
|
+
strategy: string;
|
|
5
|
+
raw?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function extractUserPageData(html: string): {
|
|
8
|
+
user: Record<string, unknown>;
|
|
9
|
+
stats: Record<string, unknown>;
|
|
10
|
+
userInfo: Record<string, unknown>;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare class ParserEngine {
|
|
13
|
+
private strategies;
|
|
14
|
+
constructor();
|
|
15
|
+
parse(html: string): ParseResult;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ParserEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParserEngine.d.ts","sourceRoot":"","sources":["../../src/scrapers/ParserEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgKD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAkB7G;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAmB;;IAWrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;CAcjC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { TikTokParseError } from '../utils/errors.js';
|
|
2
|
+
function extractUniversalData(html) {
|
|
3
|
+
const match = html.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)<\/script>/s);
|
|
4
|
+
if (!match?.[1])
|
|
5
|
+
return null;
|
|
6
|
+
try {
|
|
7
|
+
const data = JSON.parse(match[1]);
|
|
8
|
+
const scope = data.__DEFAULT_SCOPE__ ?? data;
|
|
9
|
+
// Try known paths first
|
|
10
|
+
const knownPaths = [
|
|
11
|
+
() => scope?.['webapp.video-detail']?.itemInfo?.itemStruct,
|
|
12
|
+
() => scope?.webapp?.['video-detail']?.itemInfo?.itemStruct,
|
|
13
|
+
() => scope?.['video-detail']?.itemInfo?.itemStruct,
|
|
14
|
+
];
|
|
15
|
+
for (const getter of knownPaths) {
|
|
16
|
+
const result = getter();
|
|
17
|
+
if (result && result.id && result.video)
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
// Recursive search: find ANY object with id+video fields (TikTok's HTML varies by IP)
|
|
21
|
+
function findItemStruct(obj, depth = 0) {
|
|
22
|
+
if (depth > 8 || !obj || typeof obj !== 'object')
|
|
23
|
+
return null;
|
|
24
|
+
if (Array.isArray(obj)) {
|
|
25
|
+
for (const item of obj) {
|
|
26
|
+
const found = findItemStruct(item, depth + 1);
|
|
27
|
+
if (found)
|
|
28
|
+
return found;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const o = obj;
|
|
33
|
+
if (o.id && o.video && typeof o.video === 'object') {
|
|
34
|
+
return o;
|
|
35
|
+
}
|
|
36
|
+
for (const val of Object.values(o)) {
|
|
37
|
+
const found = findItemStruct(val, depth + 1);
|
|
38
|
+
if (found)
|
|
39
|
+
return found;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return findItemStruct(scope);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function extractSigiState(html) {
|
|
50
|
+
const match = html.match(/<script id="SIGI_STATE"[^>]*>(.*?)<\/script>/s);
|
|
51
|
+
if (!match?.[1])
|
|
52
|
+
return null;
|
|
53
|
+
try {
|
|
54
|
+
const data = JSON.parse(match[1]);
|
|
55
|
+
const modules = data.ItemModule;
|
|
56
|
+
if (modules) {
|
|
57
|
+
const keys = Object.keys(modules);
|
|
58
|
+
if (keys.length)
|
|
59
|
+
return modules[keys[0]];
|
|
60
|
+
}
|
|
61
|
+
const users = data.UserModule?.users;
|
|
62
|
+
if (users) {
|
|
63
|
+
const keys = Object.keys(users);
|
|
64
|
+
if (keys.length)
|
|
65
|
+
return users[keys[0]];
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function extractLDJson(html) {
|
|
74
|
+
const matches = html.matchAll(/<script type="application\/ld\+json"[^>]*>(.*?)<\/script>/gs);
|
|
75
|
+
for (const m of matches) {
|
|
76
|
+
try {
|
|
77
|
+
const data = JSON.parse(m[1]);
|
|
78
|
+
if (data?.['@type'] === 'VideoObject' || data?.['@type']?.includes?.('VideoObject')) {
|
|
79
|
+
const partial = {
|
|
80
|
+
id: data.identifier ?? data.url?.match(/\/(\d+)/)?.[1] ?? '',
|
|
81
|
+
desc: data.description ?? data.name ?? '',
|
|
82
|
+
createTime: data.datePublished
|
|
83
|
+
? Math.floor(new Date(data.datePublished).getTime() / 1000)
|
|
84
|
+
: 0,
|
|
85
|
+
video: {
|
|
86
|
+
id: data.identifier ?? '',
|
|
87
|
+
height: data.height ?? 0,
|
|
88
|
+
width: data.width ?? 0,
|
|
89
|
+
duration: parseISO8601Duration(data.duration ?? ''),
|
|
90
|
+
ratio: '',
|
|
91
|
+
cover: data.thumbnailUrl?.[0] ?? '',
|
|
92
|
+
originCover: data.thumbnailUrl?.[0] ?? '',
|
|
93
|
+
dynamicCover: '',
|
|
94
|
+
playAddr: data.contentUrl ?? '',
|
|
95
|
+
downloadAddr: '',
|
|
96
|
+
bitrate: 0,
|
|
97
|
+
encodedType: '',
|
|
98
|
+
format: 'mp4',
|
|
99
|
+
videoQuality: '',
|
|
100
|
+
codecType: '',
|
|
101
|
+
definition: '',
|
|
102
|
+
subtitleInfos: [],
|
|
103
|
+
size: 0,
|
|
104
|
+
PlayAddrStruct: { DataSize: '0', Width: 0, Height: 0, Uri: '', UrlList: [], UrlKey: '' },
|
|
105
|
+
zoomCover: {},
|
|
106
|
+
},
|
|
107
|
+
author: {
|
|
108
|
+
id: data.author?.identifier ?? '',
|
|
109
|
+
uniqueId: data.author?.name?.toLowerCase?.() ?? '',
|
|
110
|
+
nickname: data.author?.name ?? '',
|
|
111
|
+
signature: '',
|
|
112
|
+
verified: false,
|
|
113
|
+
secUid: '',
|
|
114
|
+
avatarLarger: '',
|
|
115
|
+
avatarMedium: '',
|
|
116
|
+
avatarThumb: '',
|
|
117
|
+
followerCount: 0,
|
|
118
|
+
followingCount: 0,
|
|
119
|
+
heartCount: 0,
|
|
120
|
+
videoCount: 0,
|
|
121
|
+
},
|
|
122
|
+
stats: { playCount: 0, diggCount: 0, commentCount: 0, shareCount: 0, collectCount: 0 },
|
|
123
|
+
};
|
|
124
|
+
return partial;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch { }
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
function parseISO8601Duration(dur) {
|
|
132
|
+
const match = dur.match(/PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/);
|
|
133
|
+
if (!match)
|
|
134
|
+
return 0;
|
|
135
|
+
const h = parseInt(match[1] ?? '0', 10);
|
|
136
|
+
const m = parseInt(match[2] ?? '0', 10);
|
|
137
|
+
const s = parseInt(match[3] ?? '0', 10);
|
|
138
|
+
return h * 3600 + m * 60 + s;
|
|
139
|
+
}
|
|
140
|
+
function extractFromScripts(html) {
|
|
141
|
+
const matches = html.matchAll(/<script[^>]*>(.*?)<\/script>/gs);
|
|
142
|
+
for (const m of matches) {
|
|
143
|
+
const text = m[1]?.trim();
|
|
144
|
+
if (!text)
|
|
145
|
+
continue;
|
|
146
|
+
if (!text.includes('itemInfo') && !text.includes('ItemModule'))
|
|
147
|
+
continue;
|
|
148
|
+
try {
|
|
149
|
+
const data = JSON.parse(text);
|
|
150
|
+
const item = data?.itemInfo?.itemStruct ??
|
|
151
|
+
(data?.ItemModule ? Object.values(data.ItemModule)[0] : null);
|
|
152
|
+
if (item)
|
|
153
|
+
return item;
|
|
154
|
+
}
|
|
155
|
+
catch { }
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
export function extractUserPageData(html) {
|
|
160
|
+
const match = html.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)<\/script>/s);
|
|
161
|
+
if (!match?.[1])
|
|
162
|
+
return null;
|
|
163
|
+
try {
|
|
164
|
+
const data = JSON.parse(match[1]);
|
|
165
|
+
const scope = data.__DEFAULT_SCOPE__;
|
|
166
|
+
const userInfo = scope?.['webapp.user-detail']?.userInfo;
|
|
167
|
+
if (!userInfo?.user)
|
|
168
|
+
return null;
|
|
169
|
+
return {
|
|
170
|
+
user: userInfo.user,
|
|
171
|
+
stats: userInfo.stats,
|
|
172
|
+
userInfo: userInfo,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export class ParserEngine {
|
|
180
|
+
strategies;
|
|
181
|
+
constructor() {
|
|
182
|
+
this.strategies = [
|
|
183
|
+
extractUniversalData,
|
|
184
|
+
extractSigiState,
|
|
185
|
+
extractFromScripts,
|
|
186
|
+
extractLDJson,
|
|
187
|
+
];
|
|
188
|
+
}
|
|
189
|
+
parse(html) {
|
|
190
|
+
let attempts = 0;
|
|
191
|
+
for (const strategy of this.strategies) {
|
|
192
|
+
attempts++;
|
|
193
|
+
const result = strategy(html);
|
|
194
|
+
if (result && result.id && result.video) {
|
|
195
|
+
return { itemStruct: result, strategy: strategy.name };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
throw new TikTokParseError(`Failed to parse TikTok page data after ${attempts} strategies`, attempts);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=ParserEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParserEngine.js","sourceRoot":"","sources":["../../src/scrapers/ParserEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TikTokUserSearchResults, SearchUserResult, AvatarInfo, Session } from '../types.js';
|
|
2
|
+
export declare function buildAvatarInfo(url: string): AvatarInfo;
|
|
3
|
+
export declare function parseSearchUser(data: Record<string, any>): SearchUserResult;
|
|
4
|
+
export declare function searchUsers(query: string, proxy: string, cursor?: number, count?: number, session?: Session): Promise<TikTokUserSearchResults>;
|
|
5
|
+
//# sourceMappingURL=SearchScraper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchScraper.d.ts","sourceRoot":"","sources":["../../src/scrapers/SearchScraper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqBlG,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAuBvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAyB3E;AAoBD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,SAAI,EACV,KAAK,SAAK,EACV,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,uBAAuB,CAAC,CAwElC"}
|