fix login crash

This commit is contained in:
被遗忘的记忆
2024-12-24 21:20:26 +08:00
committed by GitHub
parent 24b0bd4bb2
commit ba4e70c48a
+65 -33
View File
@@ -454,47 +454,80 @@ class YouProvider {
}
async waitForManualLogin(page) {
return new Promise((resolve) => {
return new Promise((resolve, reject) => {
let isResolved = false; // 标记是否已完成
let timeoutId;
const checkLoginStatus = async () => {
const loginInfo = await page.evaluate(() => {
const userProfileElement = document.querySelector('[data-testid="user-profile-button"]');
if (userProfileElement) {
const emailElement = userProfileElement.querySelector('.sc-19bbc80a-4');
return emailElement ? emailElement.textContent : null;
try {
const loginInfo = await page.evaluate(() => {
const userProfileElement = document.querySelector('[data-testid="user-profile-button"]');
if (userProfileElement) {
const emailElement = userProfileElement.querySelector('.sc-19bbc80a-4');
return emailElement ? emailElement.textContent : null;
}
return null;
});
if (loginInfo) {
console.log(`检测到自动登录成功: ${loginInfo}`);
const cookies = await page.cookies();
const sessionCookie = this.extractSessionCookie(cookies);
// 设置隐身模式 cookie
if (sessionCookie) {
await page.setCookie(...sessionCookie);
}
isResolved = true;
clearTimeout(timeoutId);
resolve({loginInfo, sessionCookie});
} else if (!isResolved) {
timeoutId = setTimeout(checkLoginStatus, 1000);
}
return null;
});
if (loginInfo) {
console.log(`检测到自动登录成功: ${loginInfo}`);
const cookies = await page.cookies();
const sessionCookie = this.extractSessionCookie(cookies);
// 设置 隐身模式 cookie
if (sessionCookie) {
await page.setCookie(...sessionCookie);
} catch (error) {
if (error.message.includes('Execution context was destroyed')) {
// 执行上下文被销毁,页面可能发生导航
page.once('load', () => {
if (!isResolved) {
checkLoginStatus();
}
});
} else {
console.error('检查登录状态时发生错误:', error);
if (!isResolved) {
isResolved = true;
clearTimeout(timeoutId);
reject(error);
}
}
resolve({loginInfo, sessionCookie});
} else {
setTimeout(checkLoginStatus, 1000);
}
};
page.on('request', async (request) => {
if (isResolved) return;
if (request.url().includes('https://you.com/api/instrumentation')) {
const cookies = await page.cookies();
const sessionCookie = this.extractSessionCookie(cookies);
// 设置 隐身模式 cookie
// 设置隐身模式 cookie
if (sessionCookie) {
await page.setCookie(...sessionCookie);
}
isResolved = true;
clearTimeout(timeoutId);
resolve({loginInfo: null, sessionCookie});
}
});
page.on('framenavigated', () => {
if (!isResolved) {
console.log('检测到页面导航,重新检查登录状态');
checkLoginStatus();
}
});
checkLoginStatus();
});
}
@@ -1121,7 +1154,7 @@ class YouProvider {
req_param.append("count", "10");
req_param.append("safeSearch", "Off");
req_param.append("mkt", "zh-HK");
req_param.append("enable_worklow_generation_ux", "false");
req_param.append("enable_worklow_generation_ux", proxyModel === "openai_o1" || proxyModel === "openai_o1_preview" ? "true" : "false");
req_param.append("domain", "youchat");
req_param.append("use_personalization_extraction", "false");
req_param.append("queryTraceId", traceId);
@@ -1319,6 +1352,8 @@ class YouProvider {
);
}
// 重新发送请求
const responseTimeoutTimer = proxyModel === "openai_o1" || proxyModel === "openai_o1_preview" ? 120000 : 60000;
// 重新发送请求
async function resendPreviousRequest() {
try {
@@ -1338,8 +1373,8 @@ class YouProvider {
responseTimeout = setTimeout(async () => {
if (!responseStarted) {
console.log("重试请求后仍未收到响应,终止请求");
emitter.emit("warning", new Error("在重试后仍未收到响应"));
console.log(`${responseTimeoutTimer / 1000}秒内没有收到响应,终止请求`);
emitter.emit("completion", traceId, ` (${responseTimeoutTimer / 1000}秒内没有收到响应,终止请求)`);
emitter.emit("end", traceId);
self.logger.logRequest({
email: username,
@@ -1350,9 +1385,7 @@ class YouProvider {
unusualQueryVolume: unusualQueryVolumeTriggered,
});
}
}, 60000);
await setupEventSource(page, url, traceId, customEndMarker);
}, responseTimeoutTimer);
if (stream) {
heartbeatInterval = setInterval(() => {
@@ -1364,7 +1397,7 @@ class YouProvider {
}
}, 5000);
}
await setupEventSource(page, url, traceId, customEndMarker);
return true;
} catch (error) {
console.error("重新发送请求时发生错误:", error);
@@ -1387,11 +1420,11 @@ class YouProvider {
responseTimeout = setTimeout(async () => {
if (!responseStarted && !clientState.isClosed()) {
console.log("60秒内没有收到响应,尝试重新发送请求");
console.log(`${responseTimeoutTimer / 1000}秒内没有收到响应,尝试重新发送请求`);
const retrySuccess = await resendPreviousRequest();
if (!retrySuccess) {
console.log("重试请求时发生错误,终止请求");
emitter.emit("warning", new Error("重试请求时发生错误"));
emitter.emit("completion", traceId, new Error("重试请求时发生错误"));
emitter.emit("end", traceId);
self.logger.logRequest({
email: username,
@@ -1415,7 +1448,7 @@ class YouProvider {
unusualQueryVolume: unusualQueryVolumeTriggered,
});
}
}, 60000);
}, responseTimeoutTimer);
if (stream) {
heartbeatInterval = setInterval(() => {
@@ -1427,7 +1460,6 @@ class YouProvider {
}
}, 5000);
}
// 初始执行 setupEventSource
await setupEventSource(page, url, traceId, customEndMarker);