File size: 4,574 Bytes
a8c5c8e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | import { chromium } from 'playwright';
import { saveSession, loadSession, hasSession, saveAuthToken } from './session.js';
import { checkAuthentication, startManualAuthentication } from './auth.js';
import { clearPagePool, getAuthToken } from '../api/chat.js';
let browserInstance = null;
let browserContext = null;
export let isAuthenticated = false;
export async function initBrowser(visibleMode = true, skipManualRestart = false) {
if (!browserInstance) {
console.log('Инициализация браузера...');
try {
browserInstance = await chromium.launch({
headless: !visibleMode,
slowMo: visibleMode ? 50 : 0,
});
browserContext = await browserInstance.newContext({
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
viewport: { width: 1280, height: 800 },
deviceScaleFactor: 1,
});
try {
browserContext.setDefaultNavigationTimeout?.(120000);
browserContext.setDefaultTimeout?.(120000);
} catch { }
console.log('Браузер инициализирован успешно');
if (visibleMode) {
await startManualAuthentication(browserContext, skipManualRestart);
} else {
const sessionLoaded = await loadSession(browserContext);
if (sessionLoaded) {
setAuthenticationStatus(true);
console.log('Сессия успешно загружена, статус авторизации установлен');
} else {
console.warn('Не удалось загрузить сохраненную сессию');
}
}
return true;
} catch (error) {
console.error('Ошибка при инициализации браузера:', error);
return false;
}
}
return true;
}
export async function restartBrowserInHeadlessMode() {
console.log('Перезапуск браузера в фоновом режиме...');
const token = getAuthToken();
if (token) {
console.log('Сохранение токена перед перезапуском браузера...');
saveAuthToken(token);
await new Promise(resolve => setTimeout(resolve, 1000));
} else {
console.warn('Предупреждение: Токен не был извлечен перед перезапуском браузера');
}
await saveSession(browserContext);
await new Promise(resolve => setTimeout(resolve, 1000));
await shutdownBrowser();
await new Promise(resolve => setTimeout(resolve, 1000));
await initBrowser(false);
console.log('Браузер перезапущен в фоновом режиме');
}
export async function shutdownBrowser() {
try {
// Сначала очищаем пул страниц
try {
await clearPagePool();
} catch (e) {
console.error('Ошибка при очистке пула страниц:', e);
}
// Закрываем контекст браузера
if (browserContext) {
try {
await browserContext.close().catch(() => { });
} catch (e) {
// Игнорируем ошибку, если контекст уже закрыт
}
}
// Закрываем браузер
if (browserInstance) {
try {
await browserInstance.close().catch(() => { });
} catch (e) {
// Игнорируем ошибку, если браузер уже закрыт
}
}
// Сбрасываем переменные
browserContext = null;
browserInstance = null;
console.log('Браузер закрыт');
} catch (error) {
console.error('Ошибка при завершении работы браузера:', error);
}
}
export function getBrowserContext() {
return browserContext;
}
// Установить статус авторизации
export function setAuthenticationStatus(status) {
isAuthenticated = status;
}
// Получить статус авторизации
export function getAuthenticationStatus() {
return isAuthenticated;
} |