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.
- package/README.md +114 -0
- package/dist/bin/dydl.d.ts +2 -0
- package/dist/bin/dydl.js +17 -0
- package/dist/bin/dydl.js.map +1 -0
- package/dist/src/cli/commands/check.d.ts +10 -0
- package/dist/src/cli/commands/check.js +102 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/info.d.ts +10 -0
- package/dist/src/cli/commands/info.js +106 -0
- package/dist/src/cli/commands/info.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +10 -0
- package/dist/src/cli/commands/list.js +85 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/login.d.ts +10 -0
- package/dist/src/cli/commands/login.js +158 -0
- package/dist/src/cli/commands/login.js.map +1 -0
- package/dist/src/cli/commands/open.d.ts +10 -0
- package/dist/src/cli/commands/open.js +141 -0
- package/dist/src/cli/commands/open.js.map +1 -0
- package/dist/src/cli/commands/video.d.ts +10 -0
- package/dist/src/cli/commands/video.js +209 -0
- package/dist/src/cli/commands/video.js.map +1 -0
- package/dist/src/cli/index.d.ts +15 -0
- package/dist/src/cli/index.js +134 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/progress-display.d.ts +80 -0
- package/dist/src/cli/progress-display.js +225 -0
- package/dist/src/cli/progress-display.js.map +1 -0
- package/dist/src/cli/utils.d.ts +31 -0
- package/dist/src/cli/utils.js +171 -0
- package/dist/src/cli/utils.js.map +1 -0
- package/dist/src/douyin/auth/cookie-path.d.ts +22 -0
- package/dist/src/douyin/auth/cookie-path.js +72 -0
- package/dist/src/douyin/auth/cookie-path.js.map +1 -0
- package/dist/src/douyin/auth/cookie-storage.d.ts +19 -0
- package/dist/src/douyin/auth/cookie-storage.js +65 -0
- package/dist/src/douyin/auth/cookie-storage.js.map +1 -0
- package/dist/src/douyin/auth/errors.d.ts +28 -0
- package/dist/src/douyin/auth/errors.js +49 -0
- package/dist/src/douyin/auth/errors.js.map +1 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.d.ts +24 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js +90 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js.map +1 -0
- package/dist/src/douyin/auth/index.d.ts +16 -0
- package/dist/src/douyin/auth/index.js +68 -0
- package/dist/src/douyin/auth/index.js.map +1 -0
- package/dist/src/douyin/auth/isValidCookie.d.ts +18 -0
- package/dist/src/douyin/auth/isValidCookie.js +60 -0
- package/dist/src/douyin/auth/isValidCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js +45 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadCookie.js +79 -0
- package/dist/src/douyin/auth/loadCookie.js.map +1 -0
- package/dist/src/douyin/auth/login.d.ts +33 -0
- package/dist/src/douyin/auth/login.js +157 -0
- package/dist/src/douyin/auth/login.js.map +1 -0
- package/dist/src/douyin/auth/saveCookie.d.ts +17 -0
- package/dist/src/douyin/auth/saveCookie.js +89 -0
- package/dist/src/douyin/auth/saveCookie.js.map +1 -0
- package/dist/src/douyin/auth/validate.d.ts +11 -0
- package/dist/src/douyin/auth/validate.js +104 -0
- package/dist/src/douyin/auth/validate.js.map +1 -0
- package/dist/src/douyin/browser/manager.d.ts +54 -0
- package/dist/src/douyin/browser/manager.js +344 -0
- package/dist/src/douyin/browser/manager.js.map +1 -0
- package/dist/src/douyin/download/download-manager.d.ts +25 -0
- package/dist/src/douyin/download/download-manager.js +107 -0
- package/dist/src/douyin/download/download-manager.js.map +1 -0
- package/dist/src/douyin/download/error-handler.d.ts +49 -0
- package/dist/src/douyin/download/error-handler.js +160 -0
- package/dist/src/douyin/download/error-handler.js.map +1 -0
- package/dist/src/douyin/download/index.d.ts +39 -0
- package/dist/src/douyin/download/index.js +156 -0
- package/dist/src/douyin/download/index.js.map +1 -0
- package/dist/src/douyin/download/path-formatter.d.ts +42 -0
- package/dist/src/douyin/download/path-formatter.js +107 -0
- package/dist/src/douyin/download/path-formatter.js.map +1 -0
- package/dist/src/douyin/download/video-downloader.d.ts +35 -0
- package/dist/src/douyin/download/video-downloader.js +223 -0
- package/dist/src/douyin/download/video-downloader.js.map +1 -0
- package/dist/src/douyin/index.d.ts +19 -0
- package/dist/src/douyin/index.js +52 -0
- package/dist/src/douyin/index.js.map +1 -0
- package/dist/src/douyin/info/batch-processor.d.ts +15 -0
- package/dist/src/douyin/info/batch-processor.js +65 -0
- package/dist/src/douyin/info/batch-processor.js.map +1 -0
- package/dist/src/douyin/info/browser-manager.d.ts +56 -0
- package/dist/src/douyin/info/browser-manager.js +225 -0
- package/dist/src/douyin/info/browser-manager.js.map +1 -0
- package/dist/src/douyin/info/error-handler.d.ts +36 -0
- package/dist/src/douyin/info/error-handler.js +172 -0
- package/dist/src/douyin/info/error-handler.js.map +1 -0
- package/dist/src/douyin/info/fetch-video-detail.d.ts +14 -0
- package/dist/src/douyin/info/fetch-video-detail.js +247 -0
- package/dist/src/douyin/info/fetch-video-detail.js.map +1 -0
- package/dist/src/douyin/info/index.d.ts +29 -0
- package/dist/src/douyin/info/index.js +85 -0
- package/dist/src/douyin/info/index.js.map +1 -0
- package/dist/src/douyin/info/text-processor.d.ts +15 -0
- package/dist/src/douyin/info/text-processor.js +47 -0
- package/dist/src/douyin/info/text-processor.js.map +1 -0
- package/dist/src/douyin/info/user.d.ts +26 -0
- package/dist/src/douyin/info/user.js +237 -0
- package/dist/src/douyin/info/user.js.map +1 -0
- package/dist/src/douyin/parser/containsDouyinLink.d.ts +18 -0
- package/dist/src/douyin/parser/containsDouyinLink.js +27 -0
- package/dist/src/douyin/parser/containsDouyinLink.js.map +1 -0
- package/dist/src/douyin/parser/extract-links.d.ts +23 -0
- package/dist/src/douyin/parser/extract-links.js +79 -0
- package/dist/src/douyin/parser/extract-links.js.map +1 -0
- package/dist/src/douyin/parser/extractDouyinLinks.d.ts +18 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js +58 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/index.d.ts +35 -0
- package/dist/src/douyin/parser/index.js +70 -0
- package/dist/src/douyin/parser/index.js.map +1 -0
- package/dist/src/douyin/parser/link-patterns.d.ts +34 -0
- package/dist/src/douyin/parser/link-patterns.js +121 -0
- package/dist/src/douyin/parser/link-patterns.js.map +1 -0
- package/dist/src/douyin/parser/parse-batch.d.ts +26 -0
- package/dist/src/douyin/parser/parse-batch.js +67 -0
- package/dist/src/douyin/parser/parse-batch.js.map +1 -0
- package/dist/src/douyin/parser/parseDouyinLinks.d.ts +30 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js +164 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/resolve-links.d.ts +25 -0
- package/dist/src/douyin/parser/resolve-links.js +131 -0
- package/dist/src/douyin/parser/resolve-links.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +72 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types.d.ts +217 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/browser.d.ts +73 -0
- package/dist/src/utils/browser.js +96 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/error.d.ts +160 -0
- package/dist/src/utils/error.js +334 -0
- package/dist/src/utils/error.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +41 -0
- package/dist/src/utils/fetch.js +155 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/file.d.ts +46 -0
- package/dist/src/utils/file.js +189 -0
- package/dist/src/utils/file.js.map +1 -0
- package/dist/src/utils/index.d.ts +11 -0
- package/dist/src/utils/index.js +29 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +161 -0
- package/dist/src/utils/logger.js +286 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/performance.d.ts +98 -0
- package/dist/src/utils/performance.js +292 -0
- package/dist/src/utils/performance.js.map +1 -0
- package/dist/src/utils/retry.d.ts +56 -0
- package/dist/src/utils/retry.js +127 -0
- package/dist/src/utils/retry.js.map +1 -0
- 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
|
+
}>;
|