diff --git a/README.md b/README.md index 8c87e78..4c76450 100644 --- a/README.md +++ b/README.md @@ -50,21 +50,45 @@ 1. Скопировать шаблон: - `copy .env.sample .env` (Windows) 2. Заполнить `.env` своими значениями. -3. Запустить: +3. Пройти аутентификацию Max (см. ниже). +4. Запустить: - `docker compose up -d --build` -4. Логи: +5. Логи: - `docker compose logs -f` +## Аутентификация Max + +Перед запуском приложения необходимо пройти аутентификацию Max, чтобы создать сессионный файл. + +### Локально (без Docker) + +1. Убедиться, что `.env` заполнен, особенно `MAX_PHONE`. +2. Запустить скрипт аутентификации: + - `python auth.py` +3. Следовать инструкциям в консоли (ввод кода подтверждения и т.д.). +4. После успешной аутентификации сессионный файл сохранится в директории `MAX_WORK_DIR` (по умолчанию `cache`). + +### В Docker + +1. Запустить контейнер с интерактивной сессией: + - `docker compose run --rm max2telegram python auth.py` +2. Следовать инструкциям в консоли. +3. После завершения запустить основное приложение: + - `docker compose up -d` + ## Запуск локально (без Docker) 1. Установить зависимости: - `pip install -r src/requirements.txt` 2. Создать `.env` на основе `.env.sample`. -3. Запустить приложение: +3. Пройти аутентификацию Max: + - `python auth.py` +4. Запустить приложение: - `python src/main.py` ## Структура проекта +- `auth.py` - скрипт аутентификации Max (создание сессии). - `src/main.py` - точка входа, инициализация клиентов. - `src/bridge.py` - основная логика маршрутизации и отправки. - `src/telegram_api.py` - Telegram Bot API клиент. diff --git a/auth.py b/auth.py new file mode 100644 index 0000000..078fe90 --- /dev/null +++ b/auth.py @@ -0,0 +1,34 @@ +import asyncio +import os +import sys + +from dotenv import load_dotenv +from pymax import MaxClient + + +def main() -> None: + load_dotenv() + + phone = os.getenv("MAX_PHONE", "").strip() + work_dir = os.getenv("MAX_WORK_DIR", "cache").strip() or "cache" + + if not phone: + print("Error: MAX_PHONE environment variable is required", file=sys.stderr) + sys.exit(1) + + client = MaxClient(phone=phone, work_dir=work_dir) + print(f"Starting Max authentication for {phone}") + print(f"Session will be stored in: {work_dir}") + + async def _run() -> None: + await client.start() + print(f"Authentication successful!") + print(f"Me: {client.me.username or client.me.first_name} (id={client.me.id})") + print("Session file saved. You can now run the main application.") + await client.stop() + + asyncio.run(_run()) + + +if __name__ == "__main__": + main()