douyin-downloader 0.1.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 (161) hide show
  1. package/README.md +114 -0
  2. package/dist/bin/dydl.d.ts +2 -0
  3. package/dist/bin/dydl.js +17 -0
  4. package/dist/bin/dydl.js.map +1 -0
  5. package/dist/src/cli/commands/check.d.ts +10 -0
  6. package/dist/src/cli/commands/check.js +102 -0
  7. package/dist/src/cli/commands/check.js.map +1 -0
  8. package/dist/src/cli/commands/info.d.ts +10 -0
  9. package/dist/src/cli/commands/info.js +106 -0
  10. package/dist/src/cli/commands/info.js.map +1 -0
  11. package/dist/src/cli/commands/list.d.ts +10 -0
  12. package/dist/src/cli/commands/list.js +85 -0
  13. package/dist/src/cli/commands/list.js.map +1 -0
  14. package/dist/src/cli/commands/login.d.ts +10 -0
  15. package/dist/src/cli/commands/login.js +158 -0
  16. package/dist/src/cli/commands/login.js.map +1 -0
  17. package/dist/src/cli/commands/open.d.ts +10 -0
  18. package/dist/src/cli/commands/open.js +141 -0
  19. package/dist/src/cli/commands/open.js.map +1 -0
  20. package/dist/src/cli/commands/video.d.ts +10 -0
  21. package/dist/src/cli/commands/video.js +209 -0
  22. package/dist/src/cli/commands/video.js.map +1 -0
  23. package/dist/src/cli/index.d.ts +15 -0
  24. package/dist/src/cli/index.js +134 -0
  25. package/dist/src/cli/index.js.map +1 -0
  26. package/dist/src/cli/progress-display.d.ts +80 -0
  27. package/dist/src/cli/progress-display.js +225 -0
  28. package/dist/src/cli/progress-display.js.map +1 -0
  29. package/dist/src/cli/utils.d.ts +31 -0
  30. package/dist/src/cli/utils.js +171 -0
  31. package/dist/src/cli/utils.js.map +1 -0
  32. package/dist/src/douyin/auth/cookie-path.d.ts +22 -0
  33. package/dist/src/douyin/auth/cookie-path.js +72 -0
  34. package/dist/src/douyin/auth/cookie-path.js.map +1 -0
  35. package/dist/src/douyin/auth/cookie-storage.d.ts +19 -0
  36. package/dist/src/douyin/auth/cookie-storage.js +65 -0
  37. package/dist/src/douyin/auth/cookie-storage.js.map +1 -0
  38. package/dist/src/douyin/auth/errors.d.ts +28 -0
  39. package/dist/src/douyin/auth/errors.js +49 -0
  40. package/dist/src/douyin/auth/errors.js.map +1 -0
  41. package/dist/src/douyin/auth/getDefaultCookiePath.d.ts +24 -0
  42. package/dist/src/douyin/auth/getDefaultCookiePath.js +90 -0
  43. package/dist/src/douyin/auth/getDefaultCookiePath.js.map +1 -0
  44. package/dist/src/douyin/auth/index.d.ts +16 -0
  45. package/dist/src/douyin/auth/index.js +68 -0
  46. package/dist/src/douyin/auth/index.js.map +1 -0
  47. package/dist/src/douyin/auth/isValidCookie.d.ts +18 -0
  48. package/dist/src/douyin/auth/isValidCookie.js +60 -0
  49. package/dist/src/douyin/auth/isValidCookie.js.map +1 -0
  50. package/dist/src/douyin/auth/loadAndValidateCookie.d.ts +17 -0
  51. package/dist/src/douyin/auth/loadAndValidateCookie.js +45 -0
  52. package/dist/src/douyin/auth/loadAndValidateCookie.js.map +1 -0
  53. package/dist/src/douyin/auth/loadCookie.d.ts +17 -0
  54. package/dist/src/douyin/auth/loadCookie.js +79 -0
  55. package/dist/src/douyin/auth/loadCookie.js.map +1 -0
  56. package/dist/src/douyin/auth/login.d.ts +33 -0
  57. package/dist/src/douyin/auth/login.js +157 -0
  58. package/dist/src/douyin/auth/login.js.map +1 -0
  59. package/dist/src/douyin/auth/saveCookie.d.ts +17 -0
  60. package/dist/src/douyin/auth/saveCookie.js +89 -0
  61. package/dist/src/douyin/auth/saveCookie.js.map +1 -0
  62. package/dist/src/douyin/auth/validate.d.ts +11 -0
  63. package/dist/src/douyin/auth/validate.js +104 -0
  64. package/dist/src/douyin/auth/validate.js.map +1 -0
  65. package/dist/src/douyin/browser/manager.d.ts +54 -0
  66. package/dist/src/douyin/browser/manager.js +344 -0
  67. package/dist/src/douyin/browser/manager.js.map +1 -0
  68. package/dist/src/douyin/download/download-manager.d.ts +25 -0
  69. package/dist/src/douyin/download/download-manager.js +107 -0
  70. package/dist/src/douyin/download/download-manager.js.map +1 -0
  71. package/dist/src/douyin/download/error-handler.d.ts +49 -0
  72. package/dist/src/douyin/download/error-handler.js +160 -0
  73. package/dist/src/douyin/download/error-handler.js.map +1 -0
  74. package/dist/src/douyin/download/index.d.ts +39 -0
  75. package/dist/src/douyin/download/index.js +156 -0
  76. package/dist/src/douyin/download/index.js.map +1 -0
  77. package/dist/src/douyin/download/path-formatter.d.ts +42 -0
  78. package/dist/src/douyin/download/path-formatter.js +107 -0
  79. package/dist/src/douyin/download/path-formatter.js.map +1 -0
  80. package/dist/src/douyin/download/video-downloader.d.ts +35 -0
  81. package/dist/src/douyin/download/video-downloader.js +223 -0
  82. package/dist/src/douyin/download/video-downloader.js.map +1 -0
  83. package/dist/src/douyin/index.d.ts +19 -0
  84. package/dist/src/douyin/index.js +52 -0
  85. package/dist/src/douyin/index.js.map +1 -0
  86. package/dist/src/douyin/info/batch-processor.d.ts +15 -0
  87. package/dist/src/douyin/info/batch-processor.js +65 -0
  88. package/dist/src/douyin/info/batch-processor.js.map +1 -0
  89. package/dist/src/douyin/info/browser-manager.d.ts +56 -0
  90. package/dist/src/douyin/info/browser-manager.js +225 -0
  91. package/dist/src/douyin/info/browser-manager.js.map +1 -0
  92. package/dist/src/douyin/info/error-handler.d.ts +36 -0
  93. package/dist/src/douyin/info/error-handler.js +172 -0
  94. package/dist/src/douyin/info/error-handler.js.map +1 -0
  95. package/dist/src/douyin/info/fetch-video-detail.d.ts +14 -0
  96. package/dist/src/douyin/info/fetch-video-detail.js +247 -0
  97. package/dist/src/douyin/info/fetch-video-detail.js.map +1 -0
  98. package/dist/src/douyin/info/index.d.ts +29 -0
  99. package/dist/src/douyin/info/index.js +85 -0
  100. package/dist/src/douyin/info/index.js.map +1 -0
  101. package/dist/src/douyin/info/text-processor.d.ts +15 -0
  102. package/dist/src/douyin/info/text-processor.js +47 -0
  103. package/dist/src/douyin/info/text-processor.js.map +1 -0
  104. package/dist/src/douyin/info/user.d.ts +26 -0
  105. package/dist/src/douyin/info/user.js +237 -0
  106. package/dist/src/douyin/info/user.js.map +1 -0
  107. package/dist/src/douyin/parser/containsDouyinLink.d.ts +18 -0
  108. package/dist/src/douyin/parser/containsDouyinLink.js +27 -0
  109. package/dist/src/douyin/parser/containsDouyinLink.js.map +1 -0
  110. package/dist/src/douyin/parser/extract-links.d.ts +23 -0
  111. package/dist/src/douyin/parser/extract-links.js +79 -0
  112. package/dist/src/douyin/parser/extract-links.js.map +1 -0
  113. package/dist/src/douyin/parser/extractDouyinLinks.d.ts +18 -0
  114. package/dist/src/douyin/parser/extractDouyinLinks.js +58 -0
  115. package/dist/src/douyin/parser/extractDouyinLinks.js.map +1 -0
  116. package/dist/src/douyin/parser/index.d.ts +35 -0
  117. package/dist/src/douyin/parser/index.js +70 -0
  118. package/dist/src/douyin/parser/index.js.map +1 -0
  119. package/dist/src/douyin/parser/link-patterns.d.ts +34 -0
  120. package/dist/src/douyin/parser/link-patterns.js +121 -0
  121. package/dist/src/douyin/parser/link-patterns.js.map +1 -0
  122. package/dist/src/douyin/parser/parse-batch.d.ts +26 -0
  123. package/dist/src/douyin/parser/parse-batch.js +67 -0
  124. package/dist/src/douyin/parser/parse-batch.js.map +1 -0
  125. package/dist/src/douyin/parser/parseDouyinLinks.d.ts +30 -0
  126. package/dist/src/douyin/parser/parseDouyinLinks.js +164 -0
  127. package/dist/src/douyin/parser/parseDouyinLinks.js.map +1 -0
  128. package/dist/src/douyin/parser/resolve-links.d.ts +25 -0
  129. package/dist/src/douyin/parser/resolve-links.js +131 -0
  130. package/dist/src/douyin/parser/resolve-links.js.map +1 -0
  131. package/dist/src/index.d.ts +16 -0
  132. package/dist/src/index.js +72 -0
  133. package/dist/src/index.js.map +1 -0
  134. package/dist/src/types.d.ts +217 -0
  135. package/dist/src/types.js +6 -0
  136. package/dist/src/types.js.map +1 -0
  137. package/dist/src/utils/browser.d.ts +73 -0
  138. package/dist/src/utils/browser.js +96 -0
  139. package/dist/src/utils/browser.js.map +1 -0
  140. package/dist/src/utils/error.d.ts +160 -0
  141. package/dist/src/utils/error.js +334 -0
  142. package/dist/src/utils/error.js.map +1 -0
  143. package/dist/src/utils/fetch.d.ts +41 -0
  144. package/dist/src/utils/fetch.js +155 -0
  145. package/dist/src/utils/fetch.js.map +1 -0
  146. package/dist/src/utils/file.d.ts +46 -0
  147. package/dist/src/utils/file.js +189 -0
  148. package/dist/src/utils/file.js.map +1 -0
  149. package/dist/src/utils/index.d.ts +11 -0
  150. package/dist/src/utils/index.js +29 -0
  151. package/dist/src/utils/index.js.map +1 -0
  152. package/dist/src/utils/logger.d.ts +161 -0
  153. package/dist/src/utils/logger.js +286 -0
  154. package/dist/src/utils/logger.js.map +1 -0
  155. package/dist/src/utils/performance.d.ts +98 -0
  156. package/dist/src/utils/performance.js +292 -0
  157. package/dist/src/utils/performance.js.map +1 -0
  158. package/dist/src/utils/retry.d.ts +56 -0
  159. package/dist/src/utils/retry.js +127 -0
  160. package/dist/src/utils/retry.js.map +1 -0
  161. package/package.json +61 -0
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ // Copied from src/auth/login.ts
3
+ // Original file path: src/auth/login.ts
4
+ /**
5
+ * 瀏覽器自動化登入
6
+ * 提供抖音自動化登入功能
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.login = login;
10
+ // import { browserManager, LoginBrowserResult } from '../../utils/browser'; // Removed old import
11
+ const cookie_storage_1 = require("./cookie-storage");
12
+ const cookie_path_1 = require("./cookie-path");
13
+ const errors_1 = require("./errors");
14
+ const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
15
+ const manager_1 = require("../../douyin/browser/manager"); // Import new login browser function and options type
16
+ // 抖音登入 URL
17
+ const LOGIN_URL = 'https://www.douyin.com/';
18
+ // 登入成功所需的所有必要 Cookie 名稱
19
+ const LOGIN_SUCCESS_COOKIE_NAMES = ['login_time', 'IsDouyinActive', 'passport_assist_user']; //['ttwid', 'sessionid', 'uid_tt', 'sid_tt'];
20
+ /**
21
+ * 登入抖音並獲取 Cookie
22
+ * 打開瀏覽器進行登入操作,獲取有效的 cookie 字串。
23
+ * @param savePath 可選的 Cookie 儲存路徑
24
+ * @param options 登入選項
25
+ * @returns Promise<string | LoginResult> 如果 autoCleanup 為 true,則只返回 cookie 字串;否則返回包含 cookie 和 cleanup 函數的對象
26
+ * @throws {LoginError} 如果登入過程中出現錯誤
27
+ */
28
+ async function login(savePath, options = {}) {
29
+ let browserResult = null;
30
+ let page = null; // Keep page variable for consistency
31
+ try {
32
+ logger_1.authLogger.info('開始登入抖音...');
33
+ // Map LoginOptions to LaunchOptions for launchLoginBrowser
34
+ const launchOpts = {
35
+ timeout: options.timeout,
36
+ userAgent: options.userAgent,
37
+ executablePath: options.executablePath, // Pass through if provided
38
+ userDataDir: options.userDataDir, // Pass through if provided
39
+ headless: false // Explicitly set headless to false for login
40
+ };
41
+ // Use the new launchLoginBrowser function
42
+ browserResult = await (0, manager_1.launchLoginBrowser)(launchOpts);
43
+ page = browserResult.page; // Assign page from the result
44
+ // 監聽控制台消息
45
+ page?.on('console', (msg) => logger_1.authLogger.debug('瀏覽器控制台:', msg.text()));
46
+ // 導航到登入頁面
47
+ logger_1.authLogger.info(`導航至 ${LOGIN_URL}...`);
48
+ if (!page)
49
+ throw new Error('無法獲取瀏覽器頁面');
50
+ // --- 在導航前設定初始 Cookie ---
51
+ if (options.initialCookie) {
52
+ logger_1.authLogger.info('正在設定初始 Cookie...');
53
+ try {
54
+ const cookiesToSet = options.initialCookie.split(';').map(pair => {
55
+ const parts = pair.trim().split('=');
56
+ if (parts.length >= 2) {
57
+ const name = parts[0].trim();
58
+ const value = parts.slice(1).join('=').trim(); // Keep original value
59
+ if (!name || value === undefined)
60
+ return null;
61
+ // Match reference/DouyinParser.ts: Use hardcoded domain
62
+ const domain = '.douyin.com';
63
+ return { name, value, domain };
64
+ }
65
+ return null;
66
+ }).filter(cookie => cookie !== null); // Simple filter
67
+ if (cookiesToSet.length > 0) {
68
+ // Use 'as any[]' like reference
69
+ await page.setCookie(...cookiesToSet);
70
+ logger_1.authLogger.info(`成功設定 ${cookiesToSet.length} 個初始 Cookie`);
71
+ }
72
+ else {
73
+ logger_1.authLogger.warn('提供的 initialCookie 字串解析後為空或無效');
74
+ }
75
+ }
76
+ catch (e) {
77
+ const cookieErr = e instanceof Error ? e : new Error(String(e));
78
+ logger_1.authLogger.error('設定初始 Cookie 時出錯:', cookieErr);
79
+ }
80
+ }
81
+ // --- 結束設定初始 Cookie ---
82
+ await page.goto(LOGIN_URL, { waitUntil: 'networkidle2', timeout: options.timeout || 60000 });
83
+ logger_1.authLogger.info('請在瀏覽器中完成登入...');
84
+ logger_1.authLogger.info(`等待登入完成,檢測到所有必要的 Cookie (${LOGIN_SUCCESS_COOKIE_NAMES.join(', ')}) 都存在後將自動獲取 Cookie`);
85
+ // 等待登入成功的標誌
86
+ if (!page)
87
+ throw new Error('無法獲取瀏覽器頁面');
88
+ await page.waitForFunction((cookieNames) => {
89
+ const cookieObj = {};
90
+ document.cookie.split(';').forEach(cookie => {
91
+ const parts = cookie.trim().split('=');
92
+ if (parts.length >= 2) {
93
+ const name = parts[0];
94
+ const value = parts.slice(1).join('=');
95
+ cookieObj[name] = decodeURIComponent(value);
96
+ }
97
+ });
98
+ // console.log('cookieObj', cookieObj); // Keep for debugging if needed
99
+ return cookieNames.every(name => cookieObj[name] !== undefined &&
100
+ cookieObj[name].trim() !== '');
101
+ }, { polling: 1000, timeout: options.timeout || 300000 }, LOGIN_SUCCESS_COOKIE_NAMES);
102
+ logger_1.authLogger.info('登入成功,正在獲取 Cookie...');
103
+ await new Promise(resolve => setTimeout(resolve, 2000));
104
+ // 獲取當前頁面的 Cookie
105
+ if (!page)
106
+ throw new Error('無法獲取瀏覽器頁面');
107
+ const cookies = await page.cookies();
108
+ // 格式化 Cookie 字串
109
+ const cookieString = cookies
110
+ .map(cookie => `${cookie.name}=${encodeURIComponent(cookie.value)}`)
111
+ .join('; ');
112
+ // 檢查所有必要的 Cookie 是否存在
113
+ const missingCookies = LOGIN_SUCCESS_COOKIE_NAMES.filter(name => !cookies.some(cookie => cookie.name === name));
114
+ if (missingCookies.length > 0) {
115
+ logger_1.authLogger.warn(`有些必要的 Cookie 缺失: ${missingCookies.join(', ')}`);
116
+ }
117
+ logger_1.authLogger.info(`成功獲取 Cookie,共 ${cookies.length} 個`);
118
+ // 儲存 Cookie
119
+ const finalSavePath = savePath || (0, cookie_path_1.getDefaultCookiePath)();
120
+ if (finalSavePath) { // Ensure savePath is valid before saving
121
+ await (0, cookie_storage_1.saveCookie)(cookieString, finalSavePath);
122
+ logger_1.authLogger.info(`Cookie 已儲存至 ${finalSavePath}`);
123
+ }
124
+ // Ensure browserResult is not null before accessing its properties
125
+ if (!browserResult) {
126
+ throw new Error("Browser result is unexpectedly null after successful login flow.");
127
+ }
128
+ // If autoCleanup is true (default), cleanup and return only the cookie string
129
+ if (options.autoCleanup !== false) {
130
+ logger_1.authLogger.debug('自動清理瀏覽器資源');
131
+ await browserResult.cleanup();
132
+ return cookieString;
133
+ }
134
+ // Return the structure matching LoginResult if autoCleanup is false
135
+ return { cookie: cookieString, cleanup: browserResult.cleanup };
136
+ }
137
+ catch (error) {
138
+ // 處理錯誤
139
+ const errorMessage = error instanceof Error ? error.message : String(error);
140
+ const errorObject = error instanceof Error ? error : new Error(String(error));
141
+ logger_1.authLogger.error('登入失敗:', errorObject);
142
+ // 嘗試清理資源
143
+ if (browserResult) {
144
+ try {
145
+ await browserResult.cleanup();
146
+ }
147
+ catch (cleanupError) {
148
+ const cleanupErr = cleanupError instanceof Error ? cleanupError : new Error(String(cleanupError));
149
+ logger_1.authLogger.error('清理登入瀏覽器資源失敗:', cleanupErr);
150
+ }
151
+ }
152
+ // 創建一個新的 LoginError
153
+ const err = new errors_1.LoginError(`登入失敗: ${errorMessage}`);
154
+ throw err;
155
+ }
156
+ }
157
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/douyin/auth/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 抖音 Cookie 儲存模組
3
+ * 儲存 Cookie 到檔案
4
+ *
5
+ * @remarks
6
+ * 參考來源:此功能改寫自原本存放於 src/auth/cookie-storage.ts 的功能
7
+ * 需要驗證:文件操作是否符合不同平台標準
8
+ */
9
+ /**
10
+ * 儲存 Cookie 到檔案
11
+ * @param cookie Cookie 字串
12
+ * @param cookiePath 可選的儲存路徑
13
+ *
14
+ * @remarks
15
+ * 基本的文件系統操作
16
+ */
17
+ export declare function saveCookie(cookie: string, cookiePath?: string): Promise<void>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * 抖音 Cookie 儲存模組
4
+ * 儲存 Cookie 到檔案
5
+ *
6
+ * @remarks
7
+ * 參考來源:此功能改寫自原本存放於 src/auth/cookie-storage.ts 的功能
8
+ * 需要驗證:文件操作是否符合不同平台標準
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.saveCookie = saveCookie;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const getDefaultCookiePath_1 = require("./getDefaultCookiePath");
48
+ /**
49
+ * 儲存 Cookie 到檔案
50
+ * @param cookie Cookie 字串
51
+ * @param cookiePath 可選的儲存路徑
52
+ *
53
+ * @remarks
54
+ * 基本的文件系統操作
55
+ */
56
+ async function saveCookie(cookie, cookiePath) {
57
+ try {
58
+ // 如果未提供路徑,使用默認路徑
59
+ const filePath = cookiePath || (0, getDefaultCookiePath_1.getDefaultCookiePath)();
60
+ // 確保目錄存在
61
+ await ensureDirectoryExists(path.dirname(filePath));
62
+ // 寫入 Cookie 到檔案
63
+ await fs.promises.writeFile(filePath, cookie, 'utf-8');
64
+ console.log(`Cookie 已保存至 ${filePath}`);
65
+ }
66
+ catch (error) {
67
+ console.error('保存 Cookie 時發生錯誤:', error);
68
+ throw new Error(`保存 Cookie 失敗: ${error instanceof Error ? error.message : String(error)}`);
69
+ }
70
+ }
71
+ /**
72
+ * 確保目錄存在,如不存在則創建
73
+ * @param dirPath 目錄路徑
74
+ *
75
+ * @remarks
76
+ * 常見的文件操作輔助函數
77
+ */
78
+ async function ensureDirectoryExists(dirPath) {
79
+ try {
80
+ // 檢查目錄是否存在
81
+ await fs.promises.access(dirPath);
82
+ }
83
+ catch (error) {
84
+ // 目錄不存在,創建目錄
85
+ await fs.promises.mkdir(dirPath, { recursive: true });
86
+ console.log(`已創建目錄: ${dirPath}`);
87
+ }
88
+ }
89
+ //# sourceMappingURL=saveCookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saveCookie.js","sourceRoot":"","sources":["../../../../src/douyin/auth/saveCookie.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcH,gCAgBC;AA5BD,uCAAyB;AACzB,2CAA6B;AAC7B,iEAA8D;AAE9D;;;;;;;GAOG;AACI,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,UAAmB;IAClE,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAA,2CAAoB,GAAE,CAAC;QAEtD,SAAS;QACT,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpD,gBAAgB;QAChB,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,qBAAqB,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,WAAW;QACX,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa;QACb,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cookie 驗證
3
+ * 提供 Cookie 有效性檢查功能
4
+ */
5
+ /**
6
+ * 檢查提供的 cookie 字串是否仍然有效
7
+ * @param cookie 要驗證的 cookie 字串
8
+ * @returns Promise<boolean> true 表示有效,false 表示無效
9
+ * @throws {CookieValidationError} 如果驗證過程中出現錯誤
10
+ */
11
+ export declare function isValidCookie(cookie: string): Promise<boolean>;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ // Copied from src/auth/validate.ts
3
+ // Original file path: src/auth/validate.ts
4
+ /**
5
+ * Cookie 驗證
6
+ * 提供 Cookie 有效性檢查功能
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isValidCookie = isValidCookie;
10
+ const manager_1 = require("../browser/manager"); // Import new browser functions
11
+ const errors_1 = require("./errors");
12
+ const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
13
+ /**
14
+ * 檢查提供的 cookie 字串是否仍然有效
15
+ * @param cookie 要驗證的 cookie 字串
16
+ * @returns Promise<boolean> true 表示有效,false 表示無效
17
+ * @throws {CookieValidationError} 如果驗證過程中出現錯誤
18
+ */
19
+ async function isValidCookie(cookie) {
20
+ if (!cookie || cookie.trim() === '') {
21
+ logger_1.authLogger.warn('提供的 Cookie 為空');
22
+ return false;
23
+ }
24
+ let browser = null;
25
+ let page = null;
26
+ try {
27
+ logger_1.authLogger.debug('正在驗證 Cookie 有效性...');
28
+ // 啟動瀏覽器
29
+ browser = await (0, manager_1.launchBrowser)({ headless: true }); // Or use appropriate options
30
+ // 創建一個頁面來測試 Cookie,禁用資源攔截
31
+ page = await (0, manager_1.newPage)(browser, { blockResources: false });
32
+ // 設定 Cookie
33
+ const targetUrl = 'https://www.douyin.com';
34
+ await (0, manager_1.setCookiesOnPage)(page, cookie, '.douyin.com');
35
+ // 導航到抖音首頁 (雖然 newPage 可能已經設定了 domain,但仍需導航)
36
+ await page.goto(targetUrl, {
37
+ waitUntil: 'domcontentloaded',
38
+ timeout: 30000
39
+ });
40
+ // 檢查是否存在登入後才會顯示的元素或檢查 Cookie
41
+ const isLoggedIn = await page.evaluate(() => {
42
+ // 檢查頁面上的登入狀態
43
+ // 1. 檢查 login.ts 中使用的所有關鍵 Cookie
44
+ const cookies = document.cookie;
45
+ const hasLoginTime = cookies.includes('login_time=');
46
+ const hasIsDouyinActive = cookies.includes('IsDouyinActive=');
47
+ const hasPassportAssistUser = cookies.includes('passport_assist_user=');
48
+ const hasRequiredCookies = hasLoginTime && hasIsDouyinActive && hasPassportAssistUser;
49
+ // 2. 檢查是否存在表示已登入的元素,例如用戶頭像連結或創作者中心入口
50
+ // 注意:這些選擇器可能需要根據實際頁面結構調整
51
+ // const hasAvatarLink = !!document.querySelector('span[data-e2e="live-avatar"]'); // 查找指向個人資料的連結中的圖片
52
+ // const hasCreatorLink = !!document.querySelector('a[href*="creator.douyin.com"]'); // 查找指向創作者中心的連結
53
+ const hasLoggedInIndicator = true; // !!hasAvatarLink;// || hasCreatorLink; // 或其他更可靠的選擇器
54
+ // 記錄檢查結果(在瀏覽器控制台)
55
+ console.log(`Cookie check (passport_assist_user): ${hasPassportAssistUser}`); // Corrected variable name
56
+ console.log(`DOM check (Avatar/Creator Link): ${hasLoggedInIndicator}`); // Keep DOM check log for info
57
+ // 僅依賴 DOM 檢查 (頭像連結)
58
+ // console.log(`DOM check (Avatar Link): ${hasAvatarLink}`); // 使用之前定義的 hasAvatarLink
59
+ // 暫時忽略 Cookie 檢查,因為 DOM 元素是更直接的視覺指標
60
+ // console.log(`Cookie check (login_time): ${hasLoginTime}`);
61
+ // console.log(`Cookie check (IsDouyinActive): ${hasIsDouyinActive}`);
62
+ // console.log(`Cookie check (passport_assist_user): ${hasPassportAssistUser}`);
63
+ return hasRequiredCookies;
64
+ });
65
+ logger_1.authLogger.info(`Cookie 驗證結果: ${isLoggedIn ? '有效' : '無效'}`);
66
+ return isLoggedIn;
67
+ }
68
+ catch (error) {
69
+ // 處理錯誤
70
+ const errorMessage = error instanceof Error ? error.message : String(error);
71
+ // 創建一個錯誤對象來傳遞給 logger.error
72
+ const errorObject = error instanceof Error ? error : new Error(String(error));
73
+ logger_1.authLogger.error('驗證 Cookie 時發生錯誤:', errorObject);
74
+ // 創建一個新的 CookieValidationError
75
+ const err = new errors_1.CookieValidationError(`驗證 Cookie 失敗: ${errorMessage}`);
76
+ throw err;
77
+ }
78
+ finally {
79
+ // 確保頁面被關閉
80
+ // 確保頁面被關閉
81
+ if (page) {
82
+ try {
83
+ await page.close();
84
+ logger_1.authLogger.debug('已關閉驗證用頁面');
85
+ }
86
+ catch (closeError) {
87
+ const err = closeError instanceof Error ? closeError : new Error(String(closeError));
88
+ logger_1.authLogger.error('關閉驗證頁面失敗:', err);
89
+ }
90
+ }
91
+ // 確保瀏覽器被關閉
92
+ if (browser) {
93
+ try {
94
+ await (0, manager_1.closeBrowser)(browser);
95
+ logger_1.authLogger.debug('已關閉驗證用瀏覽器');
96
+ }
97
+ catch (closeError) {
98
+ const err = closeError instanceof Error ? closeError : new Error(String(closeError));
99
+ logger_1.authLogger.error('關閉驗證瀏覽器失敗:', err);
100
+ }
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/douyin/auth/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { Browser, Page, PuppeteerLaunchOptions } from 'puppeteer';
2
+ /**
3
+ * 瀏覽器啟動選項
4
+ */
5
+ export interface LaunchOptions {
6
+ headless?: PuppeteerLaunchOptions['headless'] | 'new';
7
+ timeout?: number;
8
+ userAgent?: string;
9
+ executablePath?: string;
10
+ userDataDir?: string;
11
+ blockResources?: boolean;
12
+ args?: string[];
13
+ }
14
+ /**
15
+ * 啟動一個新的 Puppeteer 瀏覽器實例。
16
+ * @param options 啟動選項
17
+ * @returns Promise<Browser>
18
+ */
19
+ export declare function launchBrowser(options?: LaunchOptions): Promise<Browser>;
20
+ /**
21
+ * 在指定的瀏覽器實例中創建一個新頁面。
22
+ * 應用通用設定,如 User-Agent 和資源攔截。
23
+ * @param browser 瀏覽器實例
24
+ * @param options 創建頁面的選項 (可覆蓋瀏覽器啟動時的選項)
25
+ * @returns Promise<Page>
26
+ */
27
+ export declare function newPage(browser: Browser, options?: {
28
+ userAgent?: string;
29
+ blockResources?: boolean;
30
+ timeout?: number;
31
+ }): Promise<Page>;
32
+ /**
33
+ * 在指定的頁面上設置 Cookie。
34
+ * @param page Puppeteer 頁面實例
35
+ * @param cookieString Cookie 字串 (例如來自 document.cookie)
36
+ * @param domain 可選: Cookie 的域。如果未提供,則嘗試從頁面 URL 推斷。
37
+ */
38
+ export declare function setCookiesOnPage(page: Page, cookieString: string | undefined, domain?: string): Promise<void>;
39
+ /**
40
+ * 安全地關閉瀏覽器實例。
41
+ * @param browser 要關閉的瀏覽器實例
42
+ */
43
+ export declare function closeBrowser(browser: Browser | null): Promise<void>;
44
+ /**
45
+ * 創建一個專用於登入的瀏覽器實例 (非無頭模式)。
46
+ * 返回瀏覽器、頁面和一個清理函數。
47
+ * @param options 登入瀏覽器的特定啟動選項
48
+ * @returns Promise<{ browser: Browser; page: Page; cleanup: () => Promise<void> }>
49
+ */
50
+ export declare function launchLoginBrowser(options?: LaunchOptions): Promise<{
51
+ browser: Browser;
52
+ page: Page;
53
+ cleanup: () => Promise<void>;
54
+ }>;