| |
| 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; |
| } |
| } |