Add files via upload
This commit is contained in:
+37
-32
@@ -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
@@ -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;
|
||||||
Reference in New Issue
Block a user