Spaces:
Paused
Paused
| import { chromium } from 'playwright'; | |
| import fs from 'fs'; | |
| import config from './config.js'; | |
| import { fileURLToPath } from 'url'; | |
| import path from 'path'; | |
| import { loadCookies } from './utils/common-utils.js'; | |
| import { info, error } from './utils/logger.js'; | |
| async function login() { | |
| info('启动浏览器...'); | |
| const browser = await chromium.launch(config.browserOptions); | |
| const context = await browser.newContext(); | |
| const cookies = loadCookies(config.cookieFile, config.cookiesFromEnv); | |
| await context.addCookies(cookies); | |
| const page = await context.newPage(); | |
| try { | |
| info(`导航到登录页面:${config.webideUrl}...`); | |
| // 首先访问主页面,通常会重定向到登录页面 | |
| await page.goto(config.webideUrl); | |
| // 等待页面加载 | |
| await page.waitForTimeout(config.waitTimes.pageLoad); | |
| info('当前页面URL:', page.url()); | |
| info('页面标题:', await page.title()); | |
| // 检查是否已经登录(如果页面包含编辑器元素,说明已登录) | |
| const isLoggedIn = await page.locator(config.selectors.editor).count() > 0; | |
| if (isLoggedIn) { | |
| info('检测到已经登录状态,保存cookie...'); | |
| } else { | |
| info('需要登录,请在浏览器中手动完成登录过程...'); | |
| info('登录完成后,请按 Enter 键继续...'); | |
| // 等待用户手动登录 | |
| await waitForUserInput(); | |
| // 等待登录完成,检查是否出现编辑器界面 | |
| info('等待登录完成...'); | |
| try { | |
| await page.goto(config.webideUrl); | |
| await page.waitForSelector(config.selectors.editor, { | |
| timeout: 60000 | |
| }); | |
| } catch (err) { | |
| info('未检测到编辑器界面,但继续保存cookie...'); | |
| } | |
| } | |
| // 保存cookies | |
| const cookies = await context.cookies(); | |
| fs.writeFileSync(config.cookieFile, JSON.stringify(cookies, null, 2)); | |
| info(`Cookies已保存到 ${config.cookieFile}`); | |
| info(`保存了 ${cookies.length} 个cookies`); | |
| // 显示保存的cookie信息(仅显示名称,不显示值) | |
| info('保存的cookie名称:'); | |
| cookies.forEach(cookie => { | |
| info(` - ${cookie.name} (域名: ${cookie.domain})`); | |
| }); | |
| } catch (err) { | |
| error('登录过程中发生错误:', err); | |
| } finally { | |
| await browser.close(); | |
| } | |
| } | |
| // 等待用户输入的辅助函数 | |
| async function waitForUserInput() { | |
| const { default: readline } = await import('readline'); | |
| return new Promise((resolve) => { | |
| const rl = readline.createInterface({ | |
| input: process.stdin, | |
| output: process.stdout | |
| }); | |
| rl.question('', () => { | |
| rl.close(); | |
| resolve(); | |
| }); | |
| }); | |
| } | |
| // 运行命令执行脚本 | |
| const __filename = fileURLToPath(import.meta.url); | |
| const scriptPath = path.resolve(process.argv[1]); | |
| if (path.resolve(__filename) === scriptPath) { | |
| login().catch(error); | |
| } | |