web-fetcher-mcp 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/README.md +185 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +278 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/click-element.d.ts +3 -0
- package/dist/tools/click-element.d.ts.map +1 -0
- package/dist/tools/click-element.js +166 -0
- package/dist/tools/click-element.js.map +1 -0
- package/dist/tools/focus-input.d.ts +3 -0
- package/dist/tools/focus-input.d.ts.map +1 -0
- package/dist/tools/focus-input.js +78 -0
- package/dist/tools/focus-input.js.map +1 -0
- package/dist/tools/tapd-bug-fetcher.d.ts +20 -0
- package/dist/tools/tapd-bug-fetcher.d.ts.map +1 -0
- package/dist/tools/tapd-bug-fetcher.js +376 -0
- package/dist/tools/tapd-bug-fetcher.js.map +1 -0
- package/dist/tools/type-input.d.ts +3 -0
- package/dist/tools/type-input.d.ts.map +1 -0
- package/dist/tools/type-input.js +97 -0
- package/dist/tools/type-input.js.map +1 -0
- package/dist/tools/utils/utils.d.ts +2 -0
- package/dist/tools/utils/utils.d.ts.map +1 -0
- package/dist/tools/utils/utils.js +7 -0
- package/dist/tools/utils/utils.js.map +1 -0
- package/dist/tools/web-page-fetcher.d.ts +3 -0
- package/dist/tools/web-page-fetcher.d.ts.map +1 -0
- package/dist/tools/web-page-fetcher.js +100 -0
- package/dist/tools/web-page-fetcher.js.map +1 -0
- package/dist/types/index.d.ts +73 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/browser.d.ts +6 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +95 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +11 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/cookies.d.ts +5 -0
- package/dist/utils/cookies.d.ts.map +1 -0
- package/dist/utils/cookies.js +46 -0
- package/dist/utils/cookies.js.map +1 -0
- package/dist/utils/images.d.ts +5 -0
- package/dist/utils/images.d.ts.map +1 -0
- package/dist/utils/images.js +59 -0
- package/dist/utils/images.js.map +1 -0
- package/dist/utils/login-check.d.ts +4 -0
- package/dist/utils/login-check.d.ts.map +1 -0
- package/dist/utils/login-check.js +110 -0
- package/dist/utils/login-check.js.map +1 -0
- package/dist/utils/page-content.d.ts +4 -0
- package/dist/utils/page-content.d.ts.map +1 -0
- package/dist/utils/page-content.js +139 -0
- package/dist/utils/page-content.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-page-fetcher.d.ts","sourceRoot":"","sources":["../../src/tools/web-page-fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAQrE,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,eAAe,GAAE,MAAe,EAChC,cAAc,GAAE,OAAc,EAC9B,SAAS,GAAE,MAAM,GAAG,QAAQ,GAAG,MAAe,EAC9C,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,eAAe,CAAC,CA4G1B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { getBrowser, getPage, closeBrowser } from '../utils/browser.js';
|
|
2
|
+
import { loadCookies, saveCookies } from '../utils/cookies.js';
|
|
3
|
+
import { checkLoginRequired, waitForManualLogin } from '../utils/login-check.js';
|
|
4
|
+
import { extractPageContent } from '../utils/page-content.js';
|
|
5
|
+
import { downloadAndConvertImage } from '../utils/images.js';
|
|
6
|
+
// 主函数:获取网页内容
|
|
7
|
+
export async function fetchWebPage(url, contentSelector = 'body', downloadImages = true, loginMode = 'skip', waitForLogin = false) {
|
|
8
|
+
let browserConnection = null;
|
|
9
|
+
try {
|
|
10
|
+
// 获取浏览器实例
|
|
11
|
+
browserConnection = await getBrowser();
|
|
12
|
+
const { browser, useExistingBrowser } = browserConnection;
|
|
13
|
+
// 获取页面
|
|
14
|
+
const page = await getPage(browser, useExistingBrowser);
|
|
15
|
+
console.error('正在访问网页...');
|
|
16
|
+
await page.goto(url, {
|
|
17
|
+
waitUntil: 'networkidle2',
|
|
18
|
+
timeout: 60000
|
|
19
|
+
});
|
|
20
|
+
// 检查是否需要登录
|
|
21
|
+
const needsLogin = await checkLoginRequired(page);
|
|
22
|
+
if (needsLogin && waitForLogin) {
|
|
23
|
+
console.error('检测到可能需要登录');
|
|
24
|
+
if (loginMode === 'auto') {
|
|
25
|
+
// 尝试加载保存的 Cookie
|
|
26
|
+
const cookies = await loadCookies();
|
|
27
|
+
if (cookies.length > 0) {
|
|
28
|
+
console.error('尝试使用保存的 Cookie 自动登录...');
|
|
29
|
+
await page.setCookie(...cookies);
|
|
30
|
+
await page.reload({ waitUntil: 'networkidle2', timeout: 60000 });
|
|
31
|
+
const stillNeedsLogin = await checkLoginRequired(page);
|
|
32
|
+
if (stillNeedsLogin) {
|
|
33
|
+
console.error('Cookie 已过期,需要手动登录');
|
|
34
|
+
await saveCookies([]);
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: 'Cookie 已过期,需要手动登录。请使用 loginMode: "manual" 重新调用此工具。',
|
|
38
|
+
loginRequired: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
error: '需要登录才能访问此页面。请使用 loginMode: "manual" 重新调用此工具,在浏览器中完成登录后,Cookie 会被保存。',
|
|
46
|
+
loginRequired: true
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (loginMode === 'manual') {
|
|
51
|
+
const loggedIn = await waitForManualLogin(page);
|
|
52
|
+
if (!loggedIn) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: '登录超时,请重新调用工具',
|
|
56
|
+
loginRequired: true
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// 保存 Cookie
|
|
60
|
+
const cookies = await page.cookies();
|
|
61
|
+
await saveCookies(cookies);
|
|
62
|
+
// 重新加载页面
|
|
63
|
+
await page.reload({ waitUntil: 'networkidle2', timeout: 60000 });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// 提取页面内容
|
|
67
|
+
console.error('正在提取页面内容...');
|
|
68
|
+
const pageContent = await extractPageContent(page, contentSelector);
|
|
69
|
+
// 下载图片
|
|
70
|
+
const downloadedImages = [];
|
|
71
|
+
if (downloadImages && pageContent.images.length > 0) {
|
|
72
|
+
console.error(`找到 ${pageContent.images.length} 张图片,开始下载...`);
|
|
73
|
+
const cookies = await page.cookies();
|
|
74
|
+
for (const imageUrl of pageContent.images) {
|
|
75
|
+
const downloadedImage = await downloadAndConvertImage(imageUrl, cookies, url);
|
|
76
|
+
if (downloadedImage) {
|
|
77
|
+
downloadedImages.push(downloadedImage);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
console.error(`成功下载 ${downloadedImages.length} 张图片`);
|
|
81
|
+
}
|
|
82
|
+
// 关闭浏览器
|
|
83
|
+
await closeBrowser(browser, useExistingBrowser);
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
content: {
|
|
87
|
+
...pageContent,
|
|
88
|
+
downloadedImages
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('获取页面内容失败:', error);
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
error: error.message || '未知错误'
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=web-page-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-page-fetcher.js","sourceRoot":"","sources":["../../src/tools/web-page-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface FormElement {
|
|
2
|
+
tagName: string;
|
|
3
|
+
type?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
id?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
selector: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PageContent {
|
|
12
|
+
text: string;
|
|
13
|
+
images: string[];
|
|
14
|
+
downloadedImages: DownloadedImage[];
|
|
15
|
+
formElements?: FormElement[];
|
|
16
|
+
htmlSkeleton?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DownloadedImage {
|
|
19
|
+
originalUrl: string;
|
|
20
|
+
localPath: string;
|
|
21
|
+
base64: string;
|
|
22
|
+
filename: string;
|
|
23
|
+
}
|
|
24
|
+
export interface FetchPageResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
content?: PageContent;
|
|
27
|
+
error?: string;
|
|
28
|
+
loginRequired?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface FocusInputResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
error?: string;
|
|
33
|
+
elementInfo?: {
|
|
34
|
+
tagName: string;
|
|
35
|
+
type?: string;
|
|
36
|
+
name?: string;
|
|
37
|
+
id?: string;
|
|
38
|
+
className?: string;
|
|
39
|
+
placeholder?: string;
|
|
40
|
+
value?: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface BrowserConnection {
|
|
44
|
+
browser: import('puppeteer').Browser;
|
|
45
|
+
useExistingBrowser: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface TypeInputResult {
|
|
48
|
+
success: boolean;
|
|
49
|
+
error?: string;
|
|
50
|
+
elementInfo?: {
|
|
51
|
+
tagName: string;
|
|
52
|
+
type?: string;
|
|
53
|
+
name?: string;
|
|
54
|
+
id?: string;
|
|
55
|
+
className?: string;
|
|
56
|
+
placeholder?: string;
|
|
57
|
+
value?: string;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export interface ClickElementResult {
|
|
61
|
+
success: boolean;
|
|
62
|
+
error?: string;
|
|
63
|
+
elementInfo?: {
|
|
64
|
+
tagName: string;
|
|
65
|
+
type?: string;
|
|
66
|
+
name?: string;
|
|
67
|
+
id?: string;
|
|
68
|
+
className?: string;
|
|
69
|
+
text?: string;
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,WAAW,EAAE,OAAO,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Browser, Page } from 'puppeteer';
|
|
2
|
+
import { BrowserConnection } from '../types/index.js';
|
|
3
|
+
export declare function getBrowser(): Promise<BrowserConnection>;
|
|
4
|
+
export declare function getPage(browser: Browser, useExistingBrowser: boolean, url?: string): Promise<Page>;
|
|
5
|
+
export declare function closeBrowser(browser: Browser, useExistingBrowser: boolean, keepOpen?: boolean): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAatD,wBAAsB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAqC7D;AAGD,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxG;AAGD,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1H"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import puppeteer from 'puppeteer';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { CHROME_PATH, DEBUGGING_PORT, USER_DATA_DIR, DATA_DIR } from './config.js';
|
|
4
|
+
// 确保数据目录存在
|
|
5
|
+
function ensureDataDir() {
|
|
6
|
+
if (!fs.existsSync(DATA_DIR)) {
|
|
7
|
+
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
8
|
+
}
|
|
9
|
+
if (!fs.existsSync(USER_DATA_DIR)) {
|
|
10
|
+
fs.mkdirSync(USER_DATA_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// 连接到已有 Chrome 实例或启动新实例
|
|
14
|
+
export async function getBrowser() {
|
|
15
|
+
ensureDataDir();
|
|
16
|
+
// 优先尝试连接已有的 Chrome 实例
|
|
17
|
+
try {
|
|
18
|
+
console.error('尝试连接到已有的 Chrome 实例 (端口 9222)...');
|
|
19
|
+
const browser = await puppeteer.connect({
|
|
20
|
+
browserURL: `http://127.0.0.1:${DEBUGGING_PORT}`,
|
|
21
|
+
defaultViewport: null
|
|
22
|
+
});
|
|
23
|
+
console.error('成功连接到已有的 Chrome 实例!');
|
|
24
|
+
return { browser, useExistingBrowser: true };
|
|
25
|
+
}
|
|
26
|
+
catch (connectError) {
|
|
27
|
+
console.error('无法连接到已有 Chrome 实例,将启动独立实例...');
|
|
28
|
+
console.error('提示:如需使用日常浏览器的书签和登录状态,请先用以下命令启动 Chrome:');
|
|
29
|
+
console.error(` "${CHROME_PATH}" --remote-debugging-port=${DEBUGGING_PORT}`);
|
|
30
|
+
}
|
|
31
|
+
// 启动独立的 Chrome 实例
|
|
32
|
+
try {
|
|
33
|
+
const browser = await puppeteer.launch({
|
|
34
|
+
headless: false,
|
|
35
|
+
executablePath: fs.existsSync(CHROME_PATH) ? CHROME_PATH : undefined,
|
|
36
|
+
userDataDir: USER_DATA_DIR,
|
|
37
|
+
args: [
|
|
38
|
+
'--no-sandbox',
|
|
39
|
+
'--disable-setuid-sandbox',
|
|
40
|
+
'--disable-dev-shm-usage',
|
|
41
|
+
'--disable-gpu'
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
console.error('已启动独立的 Chrome 实例');
|
|
45
|
+
return { browser, useExistingBrowser: false };
|
|
46
|
+
}
|
|
47
|
+
catch (launchError) {
|
|
48
|
+
console.error('Chrome 启动失败:', launchError.message);
|
|
49
|
+
throw new Error(`无法启动浏览器:${launchError.message}。请确保已安装 Google Chrome 浏览器。`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 获取或创建页面
|
|
53
|
+
export async function getPage(browser, useExistingBrowser, url) {
|
|
54
|
+
let page;
|
|
55
|
+
if (useExistingBrowser) {
|
|
56
|
+
const pages = await browser.pages();
|
|
57
|
+
page = pages.length > 0 ? pages[0] : await browser.newPage();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
page = await browser.newPage();
|
|
61
|
+
}
|
|
62
|
+
// 设置较大的视口
|
|
63
|
+
await page.setViewport({ width: 1920, height: 1080 });
|
|
64
|
+
// 如果需要导航到指定 URL
|
|
65
|
+
if (url && url !== 'current') {
|
|
66
|
+
const currentUrl = page.url();
|
|
67
|
+
if (currentUrl !== url) {
|
|
68
|
+
console.error(`导航到: ${url}`);
|
|
69
|
+
await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return page;
|
|
73
|
+
}
|
|
74
|
+
// 关闭浏览器或断开连接
|
|
75
|
+
export async function closeBrowser(browser, useExistingBrowser, keepOpen = false) {
|
|
76
|
+
if (keepOpen) {
|
|
77
|
+
console.error('浏览器保持打开状态');
|
|
78
|
+
if (useExistingBrowser) {
|
|
79
|
+
browser.disconnect();
|
|
80
|
+
console.error('已断开与 Chrome 的连接');
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (useExistingBrowser) {
|
|
85
|
+
browser.disconnect();
|
|
86
|
+
console.error('已断开与 Chrome 的连接');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const pages = await browser.pages();
|
|
90
|
+
if (pages.length > 0) {
|
|
91
|
+
await pages[pages.length - 1].close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,SAA4B,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnF,WAAW;AACX,SAAS,aAAa;IACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,aAAa,EAAE,CAAC;IAEhB,sBAAsB;IACtB,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YACtC,UAAU,EAAE,oBAAoB,cAAc,EAAE;YAChD,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,OAAO,YAAiB,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,MAAM,WAAW,6BAA6B,cAAc,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;YACrC,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACpE,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE;gBACJ,cAAc;gBACd,0BAA0B;gBAC1B,yBAAyB;gBACzB,eAAe;aAChB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,WAAgB,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,CAAC,OAAO,4BAA4B,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,UAAU;AACV,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAgB,EAAE,kBAA2B,EAAE,GAAY;IACvF,IAAI,IAAU,CAAC;IAEf,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,UAAU;IACV,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,gBAAgB;IAChB,IAAI,GAAG,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;YAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,aAAa;AACb,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,kBAA2B,EAAE,WAAoB,KAAK;IACzG,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACnC,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DATA_DIR: string;
|
|
2
|
+
export declare const COOKIE_FILE: string;
|
|
3
|
+
export declare const IMAGES_DIR: string;
|
|
4
|
+
export declare const CHROME_PATH = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
|
|
5
|
+
export declare const DEBUGGING_PORT = 9222;
|
|
6
|
+
export declare const USER_DATA_DIR: string;
|
|
7
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,QAA8C,CAAC;AACpE,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,UAAU,QAAgC,CAAC;AAGxD,eAAO,MAAM,WAAW,+DAA+D,CAAC;AACxF,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,aAAa,QAA0C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
// 数据存储目录
|
|
4
|
+
export const DATA_DIR = path.join(os.homedir(), '.web-fetcher-mcp');
|
|
5
|
+
export const COOKIE_FILE = path.join(DATA_DIR, 'cookies.json');
|
|
6
|
+
export const IMAGES_DIR = path.join(DATA_DIR, 'images');
|
|
7
|
+
// Chrome 配置
|
|
8
|
+
export const CHROME_PATH = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe';
|
|
9
|
+
export const DEBUGGING_PORT = 9222;
|
|
10
|
+
export const USER_DATA_DIR = path.join(DATA_DIR, 'chrome-user-data');
|
|
11
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,SAAS;AACT,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAExD,YAAY;AACZ,MAAM,CAAC,MAAM,WAAW,GAAG,4DAA4D,CAAC;AACxF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAGD,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAWlD;AAGD,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { COOKIE_FILE, DATA_DIR } from './config.js';
|
|
3
|
+
// 确保数据目录存在
|
|
4
|
+
export function ensureDataDir() {
|
|
5
|
+
if (!fs.existsSync(DATA_DIR)) {
|
|
6
|
+
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
// 保存 Cookie 到文件
|
|
10
|
+
export async function saveCookies(cookies) {
|
|
11
|
+
try {
|
|
12
|
+
ensureDataDir();
|
|
13
|
+
fs.writeFileSync(COOKIE_FILE, JSON.stringify(cookies, null, 2));
|
|
14
|
+
console.error('Cookie 已保存到:', COOKIE_FILE);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error('保存 Cookie 失败:', error);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// 从文件加载 Cookie
|
|
21
|
+
export async function loadCookies() {
|
|
22
|
+
try {
|
|
23
|
+
if (fs.existsSync(COOKIE_FILE)) {
|
|
24
|
+
const cookies = JSON.parse(fs.readFileSync(COOKIE_FILE, 'utf-8'));
|
|
25
|
+
console.error('已从文件加载 Cookie');
|
|
26
|
+
return cookies;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error('加载 Cookie 失败:', error);
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
// 清除 Cookie
|
|
35
|
+
export async function clearCookies() {
|
|
36
|
+
try {
|
|
37
|
+
if (fs.existsSync(COOKIE_FILE)) {
|
|
38
|
+
fs.unlinkSync(COOKIE_FILE);
|
|
39
|
+
console.error('Cookie 已清除');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('清除 Cookie 失败:', error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpD,WAAW;AACX,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAc;IAC9C,IAAI,CAAC;QACH,aAAa,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,eAAe;AACf,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,YAAY;AACZ,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DownloadedImage } from '../types/index.js';
|
|
2
|
+
export declare function ensureImagesDir(): void;
|
|
3
|
+
export declare function resolveImageUrl(imageUrl: string, pageUrl: string): string;
|
|
4
|
+
export declare function downloadAndConvertImage(imageUrl: string, cookies: any[], pageUrl: string): Promise<DownloadedImage | null>;
|
|
5
|
+
//# sourceMappingURL=images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/utils/images.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQzE;AAGD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,EAAE,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0CjC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
import { IMAGES_DIR } from './config.js';
|
|
5
|
+
// 确保图片目录存在
|
|
6
|
+
export function ensureImagesDir() {
|
|
7
|
+
if (!fs.existsSync(IMAGES_DIR)) {
|
|
8
|
+
fs.mkdirSync(IMAGES_DIR, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
// 处理相对 URL
|
|
12
|
+
export function resolveImageUrl(imageUrl, pageUrl) {
|
|
13
|
+
if (imageUrl.startsWith('//')) {
|
|
14
|
+
return 'https:' + imageUrl;
|
|
15
|
+
}
|
|
16
|
+
else if (imageUrl.startsWith('/')) {
|
|
17
|
+
const urlObj = new URL(pageUrl);
|
|
18
|
+
return `${urlObj.protocol}//${urlObj.host}${imageUrl}`;
|
|
19
|
+
}
|
|
20
|
+
return imageUrl;
|
|
21
|
+
}
|
|
22
|
+
// 下载并转换图片为 Base64
|
|
23
|
+
export async function downloadAndConvertImage(imageUrl, cookies, pageUrl) {
|
|
24
|
+
try {
|
|
25
|
+
console.error(`正在下载图片:${imageUrl}`);
|
|
26
|
+
ensureImagesDir();
|
|
27
|
+
// 生成文件名
|
|
28
|
+
const filename = `image_${Date.now()}_${Math.random().toString(36).substring(7)}.png`;
|
|
29
|
+
const localPath = path.join(IMAGES_DIR, filename);
|
|
30
|
+
// 处理相对 URL
|
|
31
|
+
const fullUrl = resolveImageUrl(imageUrl, pageUrl);
|
|
32
|
+
// 构建 Cookie 字符串
|
|
33
|
+
const cookieString = cookies.map((c) => `${c.name}=${c.value}`).join('; ');
|
|
34
|
+
const response = await axios.get(fullUrl, {
|
|
35
|
+
responseType: 'arraybuffer',
|
|
36
|
+
headers: {
|
|
37
|
+
'Cookie': cookieString,
|
|
38
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
|
|
39
|
+
},
|
|
40
|
+
timeout: 30000
|
|
41
|
+
});
|
|
42
|
+
// 保存为本地文件
|
|
43
|
+
fs.writeFileSync(localPath, response.data);
|
|
44
|
+
console.error(`图片已保存到:${localPath}`);
|
|
45
|
+
// 转换为 Base64
|
|
46
|
+
const base64 = Buffer.from(response.data).toString('base64');
|
|
47
|
+
return {
|
|
48
|
+
originalUrl: imageUrl,
|
|
49
|
+
localPath,
|
|
50
|
+
base64,
|
|
51
|
+
filename
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`下载图片失败 ${imageUrl}:`, error.message);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/utils/images.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,WAAW;AACX,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,WAAW;AACX,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IAC/D,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,OAAc,EACd,OAAe;IAEf,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAEpC,eAAe,EAAE,CAAC;QAElB,QAAQ;QACR,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACtF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAElD,WAAW;QACX,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,gBAAgB;QAChB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE;YACxC,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE;gBACP,QAAQ,EAAE,YAAY;gBACtB,YAAY,EAAE,8DAA8D;aAC7E;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,UAAU;QACV,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;QAErC,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE7D,OAAO;YACL,WAAW,EAAE,QAAQ;YACrB,SAAS;YACT,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-check.d.ts","sourceRoot":"","sources":["../../src/utils/login-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA8EjC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CA2CrE;AAGD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,GAAE,MAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBjG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// 从页面提取表单元素信息(与 page-content.ts 中的逻辑一致)
|
|
2
|
+
async function extractFormElements(page) {
|
|
3
|
+
return await page.evaluate(() => {
|
|
4
|
+
const formElements = [];
|
|
5
|
+
const allInputs = document.querySelectorAll('input, button, textarea, select, [role="button"]');
|
|
6
|
+
allInputs.forEach((el, index) => {
|
|
7
|
+
const element = el;
|
|
8
|
+
const tagName = element.tagName.toLowerCase();
|
|
9
|
+
const inputType = element.getAttribute('type') || '';
|
|
10
|
+
const id = element.id || '';
|
|
11
|
+
const className = element.className || '';
|
|
12
|
+
const name = element.getAttribute('name') || '';
|
|
13
|
+
const placeholder = element.getAttribute('placeholder') || '';
|
|
14
|
+
const textContent = element.textContent?.trim() || '';
|
|
15
|
+
// 生成推荐的选择器
|
|
16
|
+
let selectorStr = '';
|
|
17
|
+
if (id) {
|
|
18
|
+
selectorStr = `#${id}`;
|
|
19
|
+
}
|
|
20
|
+
else if (name) {
|
|
21
|
+
selectorStr = `${tagName}[name="${name}"]`;
|
|
22
|
+
}
|
|
23
|
+
else if (className) {
|
|
24
|
+
const classes = className.split(' ').filter(c => c).join('.');
|
|
25
|
+
selectorStr = `.${classes}`;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
selectorStr = `${tagName}:nth-of-type(${index + 1})`;
|
|
29
|
+
}
|
|
30
|
+
// 只保留重要的表单元素
|
|
31
|
+
const isImportant = tagName === 'button' ||
|
|
32
|
+
tagName === 'input' && ['text', 'password', 'email', 'tel', 'checkbox', 'submit', 'button'].includes(inputType) ||
|
|
33
|
+
tagName === 'textarea' ||
|
|
34
|
+
tagName === 'select' ||
|
|
35
|
+
element.getAttribute('role') === 'button' ||
|
|
36
|
+
/登录|Login|提交|Submit|同意|Agree|注册|Register/i.test(textContent);
|
|
37
|
+
if (isImportant) {
|
|
38
|
+
formElements.push({
|
|
39
|
+
tagName,
|
|
40
|
+
type: inputType || undefined,
|
|
41
|
+
name: name || undefined,
|
|
42
|
+
id: id || undefined,
|
|
43
|
+
className: className || undefined,
|
|
44
|
+
placeholder: placeholder || undefined,
|
|
45
|
+
value: element.value || textContent || undefined,
|
|
46
|
+
selector: selectorStr
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return formElements;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// 检测是否需要登录(通过检查页面特征)
|
|
54
|
+
export async function checkLoginRequired(page) {
|
|
55
|
+
try {
|
|
56
|
+
// 检查 URL 是否包含登录相关关键词
|
|
57
|
+
const currentUrl = page.url().toLowerCase();
|
|
58
|
+
if (currentUrl.includes('login') || currentUrl.includes('signin') || currentUrl.includes('auth')) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
// 获取页面表单元素
|
|
62
|
+
const formElements = await extractFormElements(page);
|
|
63
|
+
// 检查是否有密码输入框
|
|
64
|
+
const hasPasswordInput = formElements.some(el => el.tagName === 'input' && el.type === 'password');
|
|
65
|
+
if (hasPasswordInput) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// 检查是否有登录相关按钮
|
|
69
|
+
const hasLoginButton = formElements.some(el => {
|
|
70
|
+
const text = el.value || '';
|
|
71
|
+
const className = el.className || '';
|
|
72
|
+
return /登录|Login|登入|Sign in/i.test(text) ||
|
|
73
|
+
/登录|Login|登入|Sign in/i.test(className);
|
|
74
|
+
});
|
|
75
|
+
if (hasLoginButton) {
|
|
76
|
+
// 检查页面标题或内容是否包含登录相关文本
|
|
77
|
+
const title = await page.title();
|
|
78
|
+
const pageText = await page.evaluate(() => document.body.innerText.slice(0, 500));
|
|
79
|
+
const loginKeywords = ['登录', 'login', 'sign in', 'signin', '用户名', 'username', '密码', 'password'];
|
|
80
|
+
if (loginKeywords.some(kw => title.toLowerCase().includes(kw) || pageText.toLowerCase().includes(kw))) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error('检测登录状态失败:', error);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 等待用户手动登录
|
|
92
|
+
export async function waitForManualLogin(page, maxWaitMinutes = 5) {
|
|
93
|
+
console.error('请在打开的浏览器中完成登录...');
|
|
94
|
+
console.error('登录完成后,系统将自动保存 Cookie 以便下次使用。');
|
|
95
|
+
const maxAttempts = maxWaitMinutes * 12; // 每 5 秒检查一次
|
|
96
|
+
let attempts = 0;
|
|
97
|
+
while (attempts < maxAttempts) {
|
|
98
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
99
|
+
const nowLoggedIn = !(await checkLoginRequired(page));
|
|
100
|
+
if (nowLoggedIn) {
|
|
101
|
+
console.error('检测到登录成功!');
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
attempts++;
|
|
105
|
+
console.error(`等待登录中... (${attempts * 5 / 60}分钟)`);
|
|
106
|
+
}
|
|
107
|
+
console.error('登录等待超时');
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=login-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-check.js","sourceRoot":"","sources":["../../src/utils/login-check.ts"],"names":[],"mappings":"AAEA,wCAAwC;AACxC,KAAK,UAAU,mBAAmB,CAAC,IAAU;IAU3C,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC9B,MAAM,YAAY,GASb,EAAE,CAAC;QAER,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kDAAkD,CAAC,CAAC;QAEhG,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,EAAiB,CAAC;YAClC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAEtD,WAAW;YACX,IAAI,WAAW,GAAG,EAAE,CAAC;YACrB,IAAI,EAAE,EAAE,CAAC;gBACP,WAAW,GAAG,IAAI,EAAE,EAAE,CAAC;YACzB,CAAC;iBAAM,IAAI,IAAI,EAAE,CAAC;gBAChB,WAAW,GAAG,GAAG,OAAO,UAAU,IAAI,IAAI,CAAC;YAC7C,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9D,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,GAAG,OAAO,gBAAgB,KAAK,GAAG,CAAC,GAAG,CAAC;YACvD,CAAC;YAED,aAAa;YACb,MAAM,WAAW,GACf,OAAO,KAAK,QAAQ;gBACpB,OAAO,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC/G,OAAO,KAAK,UAAU;gBACtB,OAAO,KAAK,QAAQ;gBACpB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,QAAQ;gBACzC,0CAA0C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE/D,IAAI,WAAW,EAAE,CAAC;gBAChB,YAAY,CAAC,IAAI,CAAC;oBAChB,OAAO;oBACP,IAAI,EAAE,SAAS,IAAI,SAAS;oBAC5B,IAAI,EAAE,IAAI,IAAI,SAAS;oBACvB,EAAE,EAAE,EAAE,IAAI,SAAS;oBACnB,SAAS,EAAE,SAAS,IAAI,SAAS;oBACjC,WAAW,EAAE,WAAW,IAAI,SAAS;oBACrC,KAAK,EAAG,OAA4B,CAAC,KAAK,IAAI,WAAW,IAAI,SAAS;oBACtE,QAAQ,EAAE,WAAW;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU;IACjD,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,WAAW;QACX,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAErD,aAAa;QACb,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC9C,EAAE,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,CACjD,CAAC;QAEF,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,cAAc;QACd,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;YACrC,OAAO,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjC,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,cAAc,EAAE,CAAC;YACnB,sBAAsB;YACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAClF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YAChG,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtG,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,WAAW;AACX,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU,EAAE,iBAAyB,CAAC;IAC7E,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,cAAc,GAAG,EAAE,CAAC,CAAC,YAAY;IACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,aAAa,QAAQ,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-content.d.ts","sourceRoot":"","sources":["../../src/utils/page-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAehD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,GAAE,MAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAsJ3G"}
|