fqa / src /browser /auth.js
xcolorday's picture
Upload 15 files
a8c5c8e verified
Raw
History Blame Contribute Delete
10.3 kB
// auth.js - Модуль для авторизации и проверки авторизации
import { saveSession } from './session.js';
import { setAuthenticationStatus, getAuthenticationStatus, restartBrowserInHeadlessMode } from './browser.js';
import { extractAuthToken } from '../api/chat.js';
const AUTH_URL = 'https://chat.qwen.ai/';
const AUTH_SIGNIN_URL = 'https://chat.qwen.ai/auth?action=signin';
const VERIFICATION_TIMEOUT = 300000;
async function promptUser(question) {
return new Promise(resolve => {
process.stdout.write(question);
const onData = (data) => {
const input = data.toString().trim();
process.stdin.removeListener('data', onData);
process.stdin.pause();
resolve(input);
};
process.stdin.resume();
process.stdin.once('data', onData);
});
}
export async function checkAuthentication(context) {
try {
if (getAuthenticationStatus()) {
return true;
}
const page = await context.newPage();
console.log('Проверка авторизации...');
await page.goto(AUTH_URL, { waitUntil: 'domcontentloaded', timeout: 120000 });
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const pageTitle = await page.title();
const hasVerification = pageTitle.includes('Verification');
if (hasVerification) {
console.log('Обнаружена страница верификации. Пожалуйста, пройдите верификацию вручную.');
await promptUser('После прохождения верификации нажмите ENTER для продолжения...');
console.log('Верификация подтверждена пользователем.');
}
const loginContainerCount = await page.locator('.login-container').count();
if (loginContainerCount === 0) {
console.log('======================================================');
console.log(' АВТОРИЗАЦИЯ ОБНАРУЖЕНА ');
console.log('======================================================');
setAuthenticationStatus(true);
await extractAuthToken(context, true);
await saveSession(context);
console.log('Сессия сохранена успешно!');
await page.close();
await restartBrowserInHeadlessMode();
return true;
} else {
console.log('------------------------------------------------------');
console.log(' НЕОБХОДИМА АВТОРИЗАЦИЯ ');
console.log('------------------------------------------------------');
console.log('Пожалуйста, выполните следующие действия:');
console.log('1. Войдите в систему через GitHub или другой способ в открытом браузере');
console.log('2. Если вас перенаправляет на GitHub, разрешите доступ');
console.log('3. Дождитесь завершения процесса авторизации в браузере');
console.log('4. После завершения авторизации нажмите ENTER в этой консоли');
console.log('------------------------------------------------------');
await promptUser('После успешной авторизации нажмите ENTER для продолжения...');
console.log('Пользователь подтвердил завершение авторизации.');
await page.reload({ waitUntil: 'domcontentloaded', timeout: 120000 });
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const loginElements = await page.locator('.login-container').count();
if (loginElements === 0) {
console.log('Авторизация подтверждена.');
setAuthenticationStatus(true);
await saveSession(context);
await extractAuthToken(context, true);
console.log('Сессия сохранена успешно!');
console.log('======================================================');
console.log(' АВТОРИЗАЦИЯ ВЫПОЛНЕНА! ');
console.log('======================================================');
console.log('Теперь вы можете использовать API через локальный прокси.');
console.log('======================================================');
await page.close();
await restartBrowserInHeadlessMode();
return true;
} else {
console.log('Предупреждение: Даже после подтверждения, система не обнаружила авторизацию.');
console.log('Возможно, авторизация не была завершена корректно.');
console.log('Попробуйте снова или проверьте страницу браузера.');
setAuthenticationStatus(false);
return false;
}
}
} catch (error) {
console.error('Ошибка при проверке авторизации:', error);
setAuthenticationStatus(false);
return false;
}
}
export async function startManualAuthentication(context, skipRestart = false) {
try {
const page = await context.newPage();
console.log('Открытие страницы для ручной авторизации...');
await page.goto(AUTH_SIGNIN_URL, { waitUntil: 'load', timeout: 120000 });
console.log('------------------------------------------------------');
console.log(' НЕОБХОДИМА АВТОРИЗАЦИЯ ');
console.log('------------------------------------------------------');
console.log('Пожалуйста, выполните следующие действия:');
console.log('1. Войдите в систему в открытом браузере');
console.log('2. Дождитесь завершения процесса авторизации в браузере');
console.log('3. После завершения авторизации нажмите ENTER в этой консоли');
console.log('------------------------------------------------------');
await promptUser('После успешной авторизации нажмите ENTER для продолжения...');
console.log('Пользователь подтвердил завершение авторизации. Подождите...');
await page.goto(AUTH_URL, { waitUntil: 'domcontentloaded', timeout: 120000 });
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(2000);
const loginElements = await page.locator('.login-container').count();
if (loginElements === 0) {
console.log('Авторизация подтверждена.');
setAuthenticationStatus(true);
await saveSession(context);
await extractAuthToken(context, true);
console.log('Сессия сохранена успешно!');
console.log('======================================================');
console.log(' АВТОРИЗАЦИЯ ВЫПОЛНЕНА! ');
console.log('======================================================');
console.log('Вы можете использовать API через локальный прокси.');
console.log('======================================================');
await page.close();
if (!skipRestart) {
await restartBrowserInHeadlessMode();
}
return true;
} else {
console.log('Предупреждение: Даже после подтверждения, система не обнаружила авторизацию.');
console.log('Возможно, авторизация не была завершена корректно.');
console.log('Попробуйте снова или проверьте страницу браузера.');
setAuthenticationStatus(false);
return false;
}
} catch (error) {
console.error('Ошибка при ручной авторизации:', error);
setAuthenticationStatus(false);
return false;
}
}
export async function checkVerification(page) {
try {
const pageTitle = await page.title();
const hasVerification = pageTitle.includes('Verification');
if (hasVerification) {
console.log('Обнаружена страница верификации');
console.log('Пожалуйста, пройдите верификацию вручную в открытом браузере...');
await promptUser('После прохождения верификации нажмите ENTER для продолжения...');
console.log('Верификация подтверждена пользователем.');
console.log('======================================================');
console.log(' ВЕРИФИКАЦИЯ ПРОЙДЕНА! ');
console.log('======================================================');
return true;
}
return false;
} catch (error) {
console.error('Ошибка при проверке верификации:', error);
return false;
}
}