Add files via upload

This commit is contained in:
被遗忘的记忆
2025-03-14 05:55:36 +08:00
committed by GitHub
parent e1b38e1f11
commit bced536f8b
2 changed files with 158 additions and 67 deletions
+37 -32
View File
@@ -1,32 +1,37 @@
{ {
"name": "youchat-proxy", "name": "youchat-proxy",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"cookie": "^0.6.0", "async-mutex": "^0.5.0",
"docx": "^8.5.0", "cookie": "^0.6.0",
"express": "^4.19.2", "cookie-parser": "^1.4.7",
"form-data": "^4.0.0", "crypto-js": "^4.2.0",
"puppeteer-real-browser": "1.2.22", "dayjs": "^1.11.13",
"puppeteer-core": "^23.10.4", "docx": "^8.5.0",
"uuid": "^9.0.1", "express": "^4.19.2",
"localtunnel": "^2.0.2", "form-data": "^4.0.0",
"socks-proxy-agent": "^8.0.4", "geoip-lite": "^1.4.10",
"https-proxy-agent": "^7.0.5", "https-proxy-agent": "^7.0.5",
"ngrok": "^5.0.0-beta.2", "localtunnel": "^2.0.2",
"node-fetch": "^3.3.2", "ngrok": "^5.0.0-beta.2",
"socket.io-client": "^4.8.0", "node-fetch": "^3.3.2",
"crypto-js": "^4.2.0", "puppeteer-core": "^24.4.0",
"async-mutex": "^0.5.0", "puppeteer-real-browser": "^1.4.2",
"geoip-lite": "^1.4.10", "socket.io-client": "^4.8.0",
"cookie-parser": "^1.4.7", "socks-proxy-agent": "^8.0.4",
"winston": "^3.17.0", "unzipper": "^0.12.3",
"dayjs": "^1.11.13" "uuid": "^9.0.1",
} "winston": "^3.17.0",
} "ws": "^8.18.1"
},
"devDependencies": {
"playwright": "^1.51.0"
}
}
+121 -35
View File
@@ -2,8 +2,11 @@ import fs from 'fs';
import path from 'path'; import path from 'path';
import {Mutex} from 'async-mutex'; import {Mutex} from 'async-mutex';
import {detectBrowser} from './utils/browserDetector.mjs'; import {detectBrowser} from './utils/browserDetector.mjs';
import {createDirectoryIfNotExists} from './utils.mjs'; import {createDirectoryIfNotExists} from './utils/cookieUtils.mjs';
import {fileURLToPath} from 'url'; import {fileURLToPath} from 'url';
import {optimizeBrowserDisplay} from './utils/browserDisplayFixer.mjs';
import {launchEdgeBrowser} from './utils/edgeLauncher.mjs';
import {setupBrowserFingerprint} from './utils/browserFingerprint.mjs';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);
@@ -172,46 +175,129 @@ class SessionManager {
async launchSingleBrowser(browserId, userDataDir, browserPath) { async launchSingleBrowser(browserId, userDataDir, browserPath) {
let browser, page; let browser, page;
if (isHeadless === false) { const isEdge = browserPath.toLowerCase().includes('msedge') ||
// 使用 puppeteer-real-browser process.env.BROWSER_TYPE === 'edge';
const response = await connect({ if (isEdge) {
headless: 'auto', try {
turnstile: true, const debugPort = 9222 + parseInt(browserId.replace('browser_', ''), 10);
customConfig: { const result = await launchEdgeBrowser(userDataDir, browserPath, debugPort);
userDataDir: userDataDir, browser = result.browser;
page = result.page;
console.log(`Edge浏览器启动成功 (browserId=${browserId})`);
} catch (error) {
console.error(`原生启动Edge失败:`, error);
console.log(`回退标准方式启动浏览器...`);
}
}
if (!browser) {
if (isHeadless === false) {
// 使用 puppeteer-real-browser
const response = await connect({
headless: 'auto',
turnstile: true,
customConfig: {
userDataDir: userDataDir,
executablePath: browserPath,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--remote-debugging-address=::',
'--window-size=1280,850',
'--force-device-scale-factor=1',
],
},
});
browser = response.browser;
page = response.page;
} else {
// 使用 puppeteer-core
browser = await puppeteerModule.launch({
headless: this.isHeadless,
executablePath: browserPath, executablePath: browserPath,
userDataDir: userDataDir,
args: [ args: [
'--no-sandbox', '--no-sandbox',
'--disable-setuid-sandbox', '--disable-setuid-sandbox',
'--remote-debugging-address=::', '--disable-gpu',
'--disable-dev-shm-usage',
'--remote-debugging-port=0',
'--window-size=1280,850',
'--force-device-scale-factor=1',
], ],
}, });
}); page = await browser.newPage();
browser = response.browser; }
page = response.page;
} else {
// 使用 puppeteer-core
browser = await puppeteerModule.launch({
headless: this.isHeadless,
executablePath: browserPath,
userDataDir: userDataDir,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-gpu',
'--disable-dev-shm-usage',
'--remote-debugging-port=0',
],
});
page = await browser.newPage();
} }
return { const originalUserAgent = await page.evaluate(() => navigator.userAgent);
id: browserId, // console.log(`浏览器 ${browserId} 原始用户代理: ${originalUserAgent}`);
browser: browser,
page: page, const browserType = isEdge ? 'edge' : 'chrome';
locked: false, const fingerprint = await setupBrowserFingerprint(page, browserType);
};
try {
const newUserAgent = await page.evaluate(() => navigator.userAgent);
const newPlatform = await page.evaluate(() => navigator.platform);
const newCores = await page.evaluate(() => navigator.hardwareConcurrency);
// console.log(`浏览器 ${browserId} 应用指纹后:`);
// console.log(`- 用户代理: ${newUserAgent}`);
// console.log(`- 平台: ${newPlatform}`);
// console.log(`- CPU核心: ${newCores}`);
// console.log(`- 内存: ${fingerprint.ram}GB`);
// console.log(`- 设备名称: ${fingerprint.deviceName}`);
const isActuallyEdge = newUserAgent.includes('Edg');
// 应用显示优化
try {
await optimizeBrowserDisplay(page, {
width: 1280,
height: 850,
deviceScaleFactor: 1,
cssScale: 1,
fixHighDpi: true,
isHeadless: this.isHeadless
});
} catch (error) {
console.warn(`显示优化失败:`, error);
}
return {
id: browserId,
browser: browser,
page: page,
locked: false,
isEdgeBrowser: isActuallyEdge,
fingerprint: fingerprint // 存储指纹信息
};
} catch (error) {
console.error(`验证指纹时出错:`, error);
try {
await optimizeBrowserDisplay(page, {
width: 1280,
height: 850,
deviceScaleFactor: 1,
cssScale: 1,
fixHighDpi: true,
isHeadless: this.isHeadless
});
} catch (displayError) {
console.warn(`显示优化失败:`, displayError);
}
const isActuallyEdge = originalUserAgent.includes('Edg');
return {
id: browserId,
browser: browser,
page: page,
locked: false,
isEdgeBrowser: isActuallyEdge
};
}
} }
async getAvailableBrowser() { async getAvailableBrowser() {
@@ -420,4 +506,4 @@ function shuffleArray(array) {
} }
} }
export default SessionManager; export default SessionManager;