require('dotenv').config(); const fs = require('node:fs/promises'); const readline = require('node:readline'); const { getTelegramConfig, missingTelegramConfig, assertExternalSessionFile } = require('../src/config/telegram'); const { publicError } = require('../src/services/telegramImportService'); function ask(prompt, hidden = false) { return new Promise((resolve, reject) => { const rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true }); rl.question(prompt, answer => { rl.close(); process.stdout.write('\n'); resolve(answer.trim()); }); if (hidden) rl._writeToOutput = () => {}; rl.on('SIGINT', () => { rl.close(); reject(new Error('LOGIN_CANCELLED')); }); }); } async function main() { const config = getTelegramConfig(); if (!process.stdin.isTTY) throw new Error('LOGIN_REQUIRES_TERMINAL'); if (missingTelegramConfig(config).length) throw new Error('LOGIN_CONFIG_REQUIRED'); // The operator creates a private directory outside the checkout first. const file = await assertExternalSessionFile(config.sessionFile); let session = ''; try { session = (await fs.readFile(file, 'utf8')).trim(); } catch (error) { if (error.code !== 'ENOENT') throw error; } const { TelegramClient } = require('teleproto'); const { StringSession } = require('teleproto/sessions'); const { Logger } = require('teleproto/extensions/Logger'); const client = new TelegramClient(new StringSession(session), config.apiId, config.apiHash, { baseLogger: new Logger('none'), connectionRetries: 2 }); try { await client.start({ phoneNumber: () => ask('Номер отдельного Telegram-аккаунта: '), phoneCode: () => ask('Код из Telegram: ', true), password: () => ask('Пароль двухэтапной проверки: ', true), // Do not register a new account or accept registration terms from this utility. firstAndLastNames: () => { throw new Error('USE_EXISTING_ACCOUNT'); }, onError: () => true }); if (!await client.checkAuthorization() || (await client.getMe()).bot) throw new Error('USER_ACCOUNT_REQUIRED'); const handle = await fs.open(file, session ? 'w' : 'wx', 0o600); try { await handle.writeFile(client.session.save()); await handle.sync(); } finally { await handle.close(); } console.log('Авторизация сохранена в защищённый файл. Теперь можно включить TELEGRAM_IMPORT_ENABLED=true.'); } finally { await client.destroy(); } } main().catch(error => { const local = ['LOGIN_CANCELLED', 'LOGIN_REQUIRES_TERMINAL', 'LOGIN_CONFIG_REQUIRED', 'USE_EXISTING_ACCOUNT']; console.error(`Авторизация не завершена (${local.includes(error.message) ? error.message : publicError(error)}).`); process.exitCode = 1; });