fix login crash

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