@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.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +276 -0
  3. package/engineRequirements.js +7 -0
  4. package/lib/ProxiflyProvider.d.ts +24 -0
  5. package/lib/ProxiflyProvider.d.ts.map +1 -0
  6. package/lib/ProxiflyProvider.js +112 -0
  7. package/lib/ProxiflyProvider.js.map +1 -0
  8. package/lib/client.d.ts +42 -0
  9. package/lib/client.d.ts.map +1 -0
  10. package/lib/client.js +377 -0
  11. package/lib/client.js.map +1 -0
  12. package/lib/core/CacheManager.d.ts +13 -0
  13. package/lib/core/CacheManager.d.ts.map +1 -0
  14. package/lib/core/CacheManager.js +49 -0
  15. package/lib/core/CacheManager.js.map +1 -0
  16. package/lib/core/CircuitBreaker.d.ts +21 -0
  17. package/lib/core/CircuitBreaker.d.ts.map +1 -0
  18. package/lib/core/CircuitBreaker.js +64 -0
  19. package/lib/core/CircuitBreaker.js.map +1 -0
  20. package/lib/core/Proxymanager.d.ts +32 -0
  21. package/lib/core/Proxymanager.d.ts.map +1 -0
  22. package/lib/core/Proxymanager.js +129 -0
  23. package/lib/core/Proxymanager.js.map +1 -0
  24. package/lib/core/RateLimiter.d.ts +17 -0
  25. package/lib/core/RateLimiter.d.ts.map +1 -0
  26. package/lib/core/RateLimiter.js +53 -0
  27. package/lib/core/RateLimiter.js.map +1 -0
  28. package/lib/core/RequestQueue.d.ts +17 -0
  29. package/lib/core/RequestQueue.d.ts.map +1 -0
  30. package/lib/core/RequestQueue.js +51 -0
  31. package/lib/core/RequestQueue.js.map +1 -0
  32. package/lib/core/RetryHandler.d.ts +13 -0
  33. package/lib/core/RetryHandler.d.ts.map +1 -0
  34. package/lib/core/RetryHandler.js +37 -0
  35. package/lib/core/RetryHandler.js.map +1 -0
  36. package/lib/core/SessionManager.d.ts +17 -0
  37. package/lib/core/SessionManager.d.ts.map +1 -0
  38. package/lib/core/SessionManager.js +57 -0
  39. package/lib/core/SessionManager.js.map +1 -0
  40. package/lib/core/Signer.d.ts +3 -0
  41. package/lib/core/Signer.d.ts.map +1 -0
  42. package/lib/core/Signer.js +26 -0
  43. package/lib/core/Signer.js.map +1 -0
  44. package/lib/index.d.ts +22 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +21 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/playwright.d.ts +46 -0
  49. package/lib/playwright.d.ts.map +1 -0
  50. package/lib/playwright.js +330 -0
  51. package/lib/playwright.js.map +1 -0
  52. package/lib/scrapers/CommentScraper.d.ts +6 -0
  53. package/lib/scrapers/CommentScraper.d.ts.map +1 -0
  54. package/lib/scrapers/CommentScraper.js +107 -0
  55. package/lib/scrapers/CommentScraper.js.map +1 -0
  56. package/lib/scrapers/ExtraScraper.d.ts +15 -0
  57. package/lib/scrapers/ExtraScraper.d.ts.map +1 -0
  58. package/lib/scrapers/ExtraScraper.js +244 -0
  59. package/lib/scrapers/ExtraScraper.js.map +1 -0
  60. package/lib/scrapers/FormatExtractor.d.ts +14 -0
  61. package/lib/scrapers/FormatExtractor.d.ts.map +1 -0
  62. package/lib/scrapers/FormatExtractor.js +110 -0
  63. package/lib/scrapers/FormatExtractor.js.map +1 -0
  64. package/lib/scrapers/ParserEngine.d.ts +17 -0
  65. package/lib/scrapers/ParserEngine.d.ts.map +1 -0
  66. package/lib/scrapers/ParserEngine.js +201 -0
  67. package/lib/scrapers/ParserEngine.js.map +1 -0
  68. package/lib/scrapers/SearchScraper.d.ts +5 -0
  69. package/lib/scrapers/SearchScraper.d.ts.map +1 -0
  70. package/lib/scrapers/SearchScraper.js +149 -0
  71. package/lib/scrapers/SearchScraper.js.map +1 -0
  72. package/lib/scrapers/UrlExtractor.d.ts +9 -0
  73. package/lib/scrapers/UrlExtractor.d.ts.map +1 -0
  74. package/lib/scrapers/UrlExtractor.js +34 -0
  75. package/lib/scrapers/UrlExtractor.js.map +1 -0
  76. package/lib/scrapers/UserScraper.d.ts +3 -0
  77. package/lib/scrapers/UserScraper.d.ts.map +1 -0
  78. package/lib/scrapers/UserScraper.js +137 -0
  79. package/lib/scrapers/UserScraper.js.map +1 -0
  80. package/lib/scrapers/VideoScraper.d.ts +3 -0
  81. package/lib/scrapers/VideoScraper.d.ts.map +1 -0
  82. package/lib/scrapers/VideoScraper.js +65 -0
  83. package/lib/scrapers/VideoScraper.js.map +1 -0
  84. package/lib/types.d.ts +483 -0
  85. package/lib/types.d.ts.map +1 -0
  86. package/lib/types.js +2 -0
  87. package/lib/types.js.map +1 -0
  88. package/lib/utils/CookieJar.d.ts +8 -0
  89. package/lib/utils/CookieJar.d.ts.map +1 -0
  90. package/lib/utils/CookieJar.js +51 -0
  91. package/lib/utils/CookieJar.js.map +1 -0
  92. package/lib/utils/HttpClient.d.ts +12 -0
  93. package/lib/utils/HttpClient.d.ts.map +1 -0
  94. package/lib/utils/HttpClient.js +39 -0
  95. package/lib/utils/HttpClient.js.map +1 -0
  96. package/lib/utils/constants.d.ts +41 -0
  97. package/lib/utils/constants.d.ts.map +1 -0
  98. package/lib/utils/constants.js +48 -0
  99. package/lib/utils/constants.js.map +1 -0
  100. package/lib/utils/errors.d.ts +31 -0
  101. package/lib/utils/errors.d.ts.map +1 -0
  102. package/lib/utils/errors.js +63 -0
  103. package/lib/utils/errors.js.map +1 -0
  104. package/lib/utils/helpers.d.ts +9 -0
  105. package/lib/utils/helpers.d.ts.map +1 -0
  106. package/lib/utils/helpers.js +41 -0
  107. package/lib/utils/helpers.js.map +1 -0
  108. package/lib/utils/xbogus.cjs +565 -0
  109. package/package.json +88 -0
@@ -0,0 +1,330 @@
1
+ const WEBGL_VENDOR = 'Intel Inc.';
2
+ const WEBGL_RENDERER = 'Intel Iris OpenGL Engine';
3
+ const stealthPreamble = `(() => {
4
+ const $ = (v) => v;
5
+
6
+ Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
7
+
8
+ Object.defineProperty(navigator, 'plugins', {
9
+ get: () => [
10
+ { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer' },
11
+ { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai' },
12
+ { name: 'Native Client', filename: 'internal-nacl-plugin' },
13
+ ],
14
+ });
15
+ Object.defineProperty(navigator, 'mimeTypes', {
16
+ get: () => [
17
+ { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
18
+ { type: 'text/pdf', suffixes: 'pdf', description: 'Portable Document Format' },
19
+ ],
20
+ });
21
+
22
+ window.chrome = window.chrome || {};
23
+ window.chrome.runtime = {
24
+ connect: () => ({ onMessage: { addListener: () => {} }, onDisconnect: { addListener: () => {} }, postMessage: () => {} }),
25
+ sendMessage: () => Promise.resolve(),
26
+ onMessage: { addListener: () => {} },
27
+ onConnect: { addListener: () => {} },
28
+ onInstalled: { addListener: () => {} },
29
+ id: 'aapnijgdinmhnhmmojgejbnbhkfodcji',
30
+ };
31
+
32
+ if (navigator.permissions && navigator.permissions.query) {
33
+ const origQuery = navigator.permissions.query.bind(navigator.permissions);
34
+ navigator.permissions.query = (desc) => {
35
+ if (desc.name === 'notifications') return Promise.resolve({ state: 'prompt' });
36
+ if (desc.name === 'clipboard-read' || desc.name === 'clipboard-write') return Promise.resolve({ state: 'granted' });
37
+ return origQuery(desc);
38
+ };
39
+ }
40
+
41
+ if (navigator.connection) {
42
+ Object.defineProperty(navigator.connection, 'rtt', { get: () => 100 });
43
+ Object.defineProperty(navigator.connection, 'downlink', { get: () => 10 });
44
+ Object.defineProperty(navigator.connection, 'effectiveType', { get: () => '4g' });
45
+ }
46
+
47
+ const patchGL = (proto) => {
48
+ if (!proto) return;
49
+ const orig = proto.getParameter;
50
+ proto.getParameter = function(p) {
51
+ if (p === 37445) return '${WEBGL_VENDOR}';
52
+ if (p === 37446) return '${WEBGL_RENDERER}';
53
+ return orig.call(this, p);
54
+ };
55
+ };
56
+ patchGL(WebGLRenderingContext.prototype);
57
+ patchGL(document.createElement('canvas').getContext('webgl2')?.__proto__);
58
+
59
+ const origToString = Function.prototype.toString;
60
+ Function.prototype.toString = function() {
61
+ if (this === window.byted_acrawler?.frontierSign) return 'function frontierSign() { [native code] }';
62
+ return origToString.call(this);
63
+ };
64
+ })();`;
65
+ function navigatorOverrideScript(overrides) {
66
+ const json = JSON.stringify(overrides);
67
+ return `(() => {
68
+ const overrides = ${json};
69
+ const navProto = (() => {
70
+ try {
71
+ return Object.getOwnPropertyDescriptor(Navigator.prototype, 'userAgent')?.configurable ? Navigator.prototype : null;
72
+ } catch { return null; }
73
+ })();
74
+ for (const key of Object.keys(overrides)) {
75
+ const val = overrides[key];
76
+ Object.defineProperty(navigator, key, {
77
+ get: () => val,
78
+ configurable: true,
79
+ enumerable: true,
80
+ });
81
+ if (navProto) {
82
+ try { Object.defineProperty(navProto, key, { get: () => val, configurable: true }); } catch {}
83
+ }
84
+ }
85
+ })();`;
86
+ }
87
+ export function buildStealthScript(overrides) {
88
+ const parts = [stealthPreamble];
89
+ if (overrides)
90
+ parts.push(navigatorOverrideScript(overrides));
91
+ return parts.join('\n\n');
92
+ }
93
+ const defaultNavOverrides = {
94
+ platform: 'Win32',
95
+ vendor: 'Google Inc.',
96
+ hardwareConcurrency: 8,
97
+ language: 'en-US',
98
+ languages: ['en-US', 'en'],
99
+ deviceMemory: 8,
100
+ appVersion: '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
101
+ maxTouchPoints: 0,
102
+ appName: 'Netscape',
103
+ appCodeName: 'Mozilla',
104
+ product: 'Gecko',
105
+ productSub: '20030107',
106
+ oscpu: 'Windows NT 10.0',
107
+ };
108
+ export class PlaywrightSession {
109
+ state = null;
110
+ _browser = null;
111
+ _playwrightMod = null;
112
+ options;
113
+ constructor(options = {}) {
114
+ this.options = {
115
+ headless: true,
116
+ numSessions: 1,
117
+ ...options,
118
+ };
119
+ }
120
+ get msToken() {
121
+ return this.state?.msToken ?? '';
122
+ }
123
+ get params() {
124
+ return this.state?.params ?? {};
125
+ }
126
+ get isReady() {
127
+ return this._browser !== null;
128
+ }
129
+ async ensurePage() {
130
+ // browser is gone, stop here
131
+ if (!this._browser)
132
+ throw new Error('Browser not launched. Call init() first.');
133
+ // If page crashed, recreate context + page + navigate to TikTok for acrawler
134
+ if (!this.state || this.state.crashed) {
135
+ const context = await this._browser.newContext({
136
+ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
137
+ locale: 'en-US', timezoneId: 'America/New_York',
138
+ viewport: { width: 1920, height: 1080 }, deviceScaleFactor: 1,
139
+ hasTouch: false, javaScriptEnabled: true, bypassCSP: true,
140
+ });
141
+ const page = await context.newPage();
142
+ page.on('crash', () => { if (this.state)
143
+ this.state.crashed = true; });
144
+ page.on('close', () => { if (this.state)
145
+ this.state.crashed = true; });
146
+ const overrides = { ...defaultNavOverrides, ...this.options.navigatorOverrides };
147
+ await page.addInitScript({ content: buildStealthScript(overrides) });
148
+ let msToken = '', csrfToken = '';
149
+ for (let attempt = 0; attempt < 3; attempt++) {
150
+ await page.goto('https://www.tiktok.com/foryou', { waitUntil: 'domcontentloaded', timeout: 20000 }).catch(() => { });
151
+ if (attempt < 2)
152
+ await page.waitForTimeout(3000);
153
+ try {
154
+ const cookies = await context.cookies();
155
+ msToken = cookies.find((c) => c.name === 'msToken')?.value ?? '';
156
+ csrfToken = cookies.find((c) => c.name === 'csrf_token')?.value ?? '';
157
+ }
158
+ catch { }
159
+ if (msToken)
160
+ break;
161
+ }
162
+ const deviceId = String(Math.floor(Math.random() * 9e18) + 1e18);
163
+ const params = {
164
+ aid: '1988', app_language: 'en', app_name: 'tiktok_web',
165
+ browser_language: 'en', browser_name: 'Mozilla', browser_online: 'true',
166
+ browser_platform: 'Win32',
167
+ browser_version: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36',
168
+ channel: 'tiktok_web', cookie_enabled: 'true', device_id: deviceId,
169
+ device_platform: 'web_pc', focus_state: 'true', from_page: 'user',
170
+ history_len: '1', is_fullscreen: 'false', is_page_visible: 'true',
171
+ language: 'en', os: 'windows', priority_region: '', referer: '',
172
+ region: 'US', screen_height: '1080', screen_width: '1920',
173
+ tz_name: 'America/New_York', webcast_language: 'en',
174
+ };
175
+ this.state = { page, context, browser: this._browser, msToken, csrfToken, params, crashed: false };
176
+ }
177
+ return { page: this.state.page, context: this.state.context };
178
+ }
179
+ async init(videoUrl) {
180
+ let playwright;
181
+ try {
182
+ playwright = await import('playwright');
183
+ }
184
+ catch {
185
+ throw new Error('Playwright is required for PlaywrightSession. Install it with: npm install playwright');
186
+ }
187
+ this._playwrightMod = playwright;
188
+ let browser;
189
+ try {
190
+ browser = await playwright.chromium.launch({
191
+ headless: this.options.headless,
192
+ proxy: this.options.proxy
193
+ ? { server: this.options.proxy }
194
+ : undefined,
195
+ args: [
196
+ '--no-sandbox',
197
+ '--disable-blink-features=AutomationControlled',
198
+ '--disable-gpu',
199
+ '--disable-dev-shm-usage',
200
+ '--no-first-run',
201
+ '--no-default-browser-check',
202
+ '--disable-web-security',
203
+ '--disable-features=IsolateOrigins,site-per-process',
204
+ ],
205
+ });
206
+ }
207
+ catch (e) {
208
+ const msg = e.message;
209
+ if (msg.includes('Executable') || msg.includes('browser') || msg.includes('chromium')) {
210
+ throw new Error(`Chromium binary not found. We ship the playwright package but skip the 300MB browser download. ` +
211
+ `To enable browser APIs, run: npx playwright install chromium\n` +
212
+ `(Original error: ${msg})`, { cause: e });
213
+ }
214
+ throw e;
215
+ }
216
+ this._browser = browser;
217
+ // Create initial page state (ensures page + context exist)
218
+ await this.ensurePage();
219
+ }
220
+ /**
221
+ * Wait for window.byted_acrawler to show up.
222
+ * TikTok can be slow here, so give it a few shots.
223
+ */
224
+ async ensureAcrawler(page) {
225
+ for (let attempt = 0; attempt < 3; attempt++) {
226
+ try {
227
+ await page.waitForFunction(() => typeof window.byted_acrawler?.frontierSign === 'function', { timeout: 10000, polling: 500 });
228
+ return;
229
+ }
230
+ catch {
231
+ if (attempt < 2) {
232
+ await page.goto('https://www.tiktok.com/foryou', { waitUntil: 'domcontentloaded', timeout: 10000 }).catch(() => { });
233
+ await page.waitForTimeout(2000);
234
+ }
235
+ }
236
+ }
237
+ throw new Error('byted_acrawler not available after 3 attempts');
238
+ }
239
+ async sign(url) {
240
+ const { page } = await this.ensurePage();
241
+ // try the easy path first, since acrawler might already be ready
242
+ let result;
243
+ try {
244
+ result = await page.evaluate((u) => {
245
+ const w = window;
246
+ return w.byted_acrawler?.frontierSign?.(u) ?? null;
247
+ }, url);
248
+ }
249
+ catch {
250
+ result = null;
251
+ }
252
+ // if that flops, wait for acrawler and try again
253
+ if (!result) {
254
+ await this.ensureAcrawler(page);
255
+ result = await page.evaluate((u) => {
256
+ return window.byted_acrawler.frontierSign(u);
257
+ }, url);
258
+ }
259
+ if (!result)
260
+ throw new Error('Failed to generate X-Bogus signature');
261
+ const xBogus = result['X-Bogus'];
262
+ if (!xBogus)
263
+ throw new Error('X-Bogus missing from sign response');
264
+ const separator = url.includes('?') ? '&' : '?';
265
+ return `${url}${separator}X-Bogus=${xBogus}`;
266
+ }
267
+ async request(path, extraParams = {}) {
268
+ const { page } = await this.ensurePage();
269
+ if (!this.state)
270
+ throw new Error('Session not initialized');
271
+ const { msToken, params } = this.state;
272
+ const allParams = { ...params, msToken, ...extraParams };
273
+ const query = new URLSearchParams(allParams).toString();
274
+ const baseUrl = `https://www.tiktok.com${path}`;
275
+ const signedUrl = await this.sign(`${baseUrl}?${query}`);
276
+ // fetch from inside the browser so it looks like normal page traffic
277
+ const result = await page.evaluate(async (url) => {
278
+ try {
279
+ const res = await fetch(url, {
280
+ credentials: 'include',
281
+ headers: {
282
+ Accept: 'application/json, text/plain, */*',
283
+ Referer: 'https://www.tiktok.com/',
284
+ },
285
+ });
286
+ if (!res.ok)
287
+ throw new Error(`HTTP ${res.status}`);
288
+ return await res.json();
289
+ }
290
+ catch (err) {
291
+ return { __fetchError: err.message };
292
+ }
293
+ }, signedUrl);
294
+ if (!result)
295
+ throw new Error('Empty response from browser fetch');
296
+ if (result.__fetchError)
297
+ throw new Error(`Browser fetch failed: ${result.__fetchError}`);
298
+ return result;
299
+ }
300
+ async render(url) {
301
+ const { context } = await this.ensurePage();
302
+ const tempPage = await context.newPage();
303
+ try {
304
+ await tempPage.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
305
+ await tempPage.waitForTimeout(3000);
306
+ const html = await tempPage.evaluate(() => {
307
+ const el = document.getElementById('__UNIVERSAL_DATA_FOR_REHYDRATION__');
308
+ return el?.textContent || document.documentElement.outerHTML;
309
+ });
310
+ return html;
311
+ }
312
+ finally {
313
+ await tempPage.close().catch(() => { });
314
+ }
315
+ }
316
+ async close() {
317
+ this.state = null;
318
+ if (this._browser) {
319
+ try {
320
+ await this._browser.close();
321
+ }
322
+ catch { }
323
+ this._browser = null;
324
+ }
325
+ }
326
+ get browser() {
327
+ return this._browser;
328
+ }
329
+ }
330
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TikTokCommentList, CommentUser, CommentImage, CommentLabel } from '../types.js';
2
+ export declare function parseCommentUser(raw: Record<string, any>): CommentUser;
3
+ export declare function parseCommentImages(raw: Record<string, any> | undefined): CommentImage[];
4
+ export declare function parseLabels(raw: Record<string, any>[] | undefined): CommentLabel[];
5
+ export declare function fetchComments(videoId: string, authorUsername: string, cursor?: number, count?: number, proxy?: string): Promise<TikTokCommentList>;
6
+ //# sourceMappingURL=CommentScraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentScraper.d.ts","sourceRoot":"","sources":["../../src/scrapers/CommentScraper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ7G,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,CAQtE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,YAAY,EAAE,CAQvF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,YAAY,EAAE,CAMlF;AAoBD,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,MAAM,SAAI,EACV,KAAK,SAAK,EACV,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAiE5B"}
@@ -0,0 +1,107 @@
1
+ import { ofetch } from 'ofetch';
2
+ import { HEADERS } from '../utils/constants.js';
3
+ import { CookieJar } from '../utils/CookieJar.js';
4
+ import { TikTokFetchError } from '../utils/errors.js';
5
+ const VIDEO_BASE = 'https://www.tiktok.com';
6
+ const COMMENT_API = 'https://www.tiktok.com/api/comment/list/';
7
+ export function parseCommentUser(raw) {
8
+ return {
9
+ uid: String(raw.uid ?? ''),
10
+ uniqueId: String(raw.unique_id ?? ''),
11
+ nickname: String(raw.nickname ?? ''),
12
+ secUid: String(raw.sec_uid ?? ''),
13
+ avatarThumb: String(raw.avatar_thumb?.url_list?.[0] ?? raw.avatar_thumd ?? ''),
14
+ };
15
+ }
16
+ export function parseCommentImages(raw) {
17
+ if (!raw)
18
+ return [];
19
+ const list = Array.isArray(raw) ? raw : [raw];
20
+ return list.map((img) => ({
21
+ url: String(img.origin_url?.url_list?.[0] ?? img.crop_url?.url_list?.[0] ?? ''),
22
+ width: Number(img.origin_url?.width ?? img.crop_url?.width ?? 0),
23
+ height: Number(img.origin_url?.height ?? img.crop_url?.height ?? 0),
24
+ })).filter((img) => img.url);
25
+ }
26
+ export function parseLabels(raw) {
27
+ if (!raw)
28
+ return [];
29
+ return raw.map((l) => ({
30
+ text: String(l.text ?? ''),
31
+ type: Number(l.type ?? 0),
32
+ }));
33
+ }
34
+ async function fetchVideoCookies(videoId, authorUsername, proxy) {
35
+ const jar = new CookieJar();
36
+ try {
37
+ await ofetch(`${VIDEO_BASE}/@${authorUsername}/video/${videoId}`, {
38
+ headers: HEADERS.desktop,
39
+ ...(proxy ? { proxy } : {}),
40
+ parseResponse: (t) => t,
41
+ timeout: 15000,
42
+ onResponse(ctx) {
43
+ if (ctx.response?.headers)
44
+ jar.setFromHeaders(ctx.response.headers);
45
+ },
46
+ });
47
+ }
48
+ catch {
49
+ // cookies might already be in place from an earlier hit
50
+ }
51
+ return Object.entries(jar.all).map(([k, v]) => `${k}=${v}`).join('; ');
52
+ }
53
+ export async function fetchComments(videoId, authorUsername, cursor = 0, count = 20, proxy) {
54
+ const cookieStr = await fetchVideoCookies(videoId, authorUsername, proxy);
55
+ const params = new URLSearchParams({
56
+ aid: '1988',
57
+ aweme_id: videoId,
58
+ count: String(count),
59
+ cursor: String(cursor),
60
+ });
61
+ const url = `${COMMENT_API}?${params}`;
62
+ let res;
63
+ try {
64
+ res = await ofetch(url, {
65
+ headers: {
66
+ ...HEADERS.api,
67
+ Referer: `${VIDEO_BASE}/@${authorUsername}/video/${videoId}`,
68
+ Cookie: cookieStr,
69
+ },
70
+ ...(proxy ? { proxy } : {}),
71
+ timeout: 15000,
72
+ });
73
+ }
74
+ catch (err) {
75
+ const ofetchErr = err;
76
+ throw new TikTokFetchError(`Comment API failed: ${err.message}`, ofetchErr.status);
77
+ }
78
+ if (res.status_code !== 0) {
79
+ throw new TikTokFetchError(`Comment API returned error: ${res.status_msg ?? res.status_code}`, res.status_code);
80
+ }
81
+ const rawComments = res.comments ?? [];
82
+ const comments = rawComments.map((c) => ({
83
+ by: 'Traceryn',
84
+ cid: String(c.cid ?? ''),
85
+ text: String(c.text ?? ''),
86
+ createTime: new Date((c.create_time ?? 0) * 1000).toISOString(),
87
+ timestamp: Number(c.create_time ?? 0),
88
+ likes: Number(c.digg_count ?? 0),
89
+ replyTotal: Number(c.reply_comment_total ?? 0),
90
+ status: Number(c.status ?? 0),
91
+ user: parseCommentUser(c.user ?? {}),
92
+ isAuthorDigged: Boolean(c.is_author_digged ?? false),
93
+ labels: parseLabels(c.label_list),
94
+ images: parseCommentImages(c.image_list),
95
+ stickPosition: Number(c.stick_position ?? 0),
96
+ raw: c,
97
+ }));
98
+ return {
99
+ comments,
100
+ total: Number(res.total ?? 0),
101
+ cursor: Number(res.cursor ?? cursor),
102
+ hasMore: Boolean(res.has_more ?? false),
103
+ hasFilteredComments: Boolean(res.has_filtered_comments ?? false),
104
+ raw: res,
105
+ };
106
+ }
107
+ //# sourceMappingURL=CommentScraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentScraper.js","sourceRoot":"","sources":["../../src/scrapers/CommentScraper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { HashtagInfo, SoundInfo, SoundItemList, TrendingVideos, PlaylistInfo, PlaylistItemList, LikedVideos, Session } from '../types.js';
2
+ export declare function fetchHashtag(name: string, proxy?: string): Promise<HashtagInfo>;
3
+ export declare function fetchSound(musicId: string, proxy?: string, session?: Session): Promise<SoundInfo>;
4
+ export declare function fetchSoundVideos(musicId: string, cursor?: number, count?: number, proxy?: string, session?: Session): Promise<SoundItemList>;
5
+ export declare function fetchTrending(count?: number, proxy?: string, session?: Session): Promise<TrendingVideos>;
6
+ export declare function fetchUserLikedVideos(secUid: string, cursor?: number, count?: number, proxy?: string, session?: Session): Promise<LikedVideos>;
7
+ export declare function fetchUserPlaylists(secUid: string, cursor?: number, count?: number, proxy?: string, session?: Session): Promise<{
8
+ playlists: PlaylistInfo[];
9
+ cursor: number;
10
+ hasMore: boolean;
11
+ raw?: Record<string, unknown>;
12
+ }>;
13
+ export declare function fetchPlaylist(mixId: string, proxy?: string, session?: Session): Promise<PlaylistInfo>;
14
+ export declare function fetchPlaylistVideos(mixId: string, cursor?: number, count?: number, proxy?: string, session?: Session): Promise<PlaylistItemList>;
15
+ //# sourceMappingURL=ExtraScraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtraScraper.d.ts","sourceRoot":"","sources":["../../src/scrapers/ExtraScraper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAAE,SAAS,EAAE,aAAa,EACrC,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAC9C,WAAW,EAAE,OAAO,EACrB,MAAM,aAAa,CAAC;AA+DrB,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBrF;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CA+CvG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBzI;AAED,wBAAsB,aAAa,CAAC,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAoB1G;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB1I;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAqC3N;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B3G;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoB7I"}