8bd13b4dd5
Смена архитектуры с MTProto-юзербота (GramJS + строка сессии) на официальное бизнес-подключение Telegram (Bot API). Проект больше НЕ хранит сессию — работает только через бота с включённым Business Mode, подключённого в Настройках → Telegram для бизнеса → Чат-боты. Это соответствует ToS. Изменения: - удалено: scripts/login.js, src/userbot/client.js, модуль onetime - src/userbot/ → src/business/: events.js подписывает business_message / edited / deleted / connection и нормализует сообщение; context.js даёт ctx.api = bot.api - core/media.js: скачивание через getFile + fetch вместо GramJS - core/db.js: составной ключ PRIMARY KEY (chat_id, msg_id) — в Bot API message_id уникален только внутри чата - bot/panel.js: барьер владельца пропускает бизнес-апдейты (у них ctx.from это собеседник); убран UI одноразовых - index.js: сборка только на grammY, явный allowed_updates с бизнес-типами - config.js: убраны API_ID/API_HASH/SESSION, проверки на старте почищены - package.json: убраны зависимости telegram и input, скрипт login - README и .env.example переписаны под бизнес-подключение Границы: onetime невозможен через Business API (сервер отбрасывает self-destruct до доставки боту), медиа >~20 МБ не выгружаются (лимит getFile), перехват — только личные 1-на-1 чаты. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
21 lines
1.3 KiB
Bash
21 lines
1.3 KiB
Bash
# === Бот (единственный интерфейс + приёмник бизнес-апдейтов) ===
|
|
# Токен от @BotFather. Обязательно включите боту режим бизнеса:
|
|
# @BotFather → /mybots → выбрать бота → Bot Settings → Business Mode → Enable.
|
|
# Затем в приложении: Настройки → Telegram для бизнеса → Чат-боты → добавить бота.
|
|
# Сессия НЕ нужна — работаем только через официальное бизнес-подключение.
|
|
BOT_TOKEN=
|
|
# Ваш Telegram id (узнать: напишите @userinfobot). Только вы управляете ботом.
|
|
OWNER_ID=
|
|
|
|
# === Локальное хранилище ===
|
|
# Ключ шифрования: 64 hex-символа ИЛИ длинная парольная фраза (≥32 байт).
|
|
# Сгенерировать hex: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
|
ENCRYPTION_KEY=
|
|
# Сколько дней хранить перехваченное (0 — бессрочно)
|
|
RETENTION_DAYS=30
|
|
# Качать медиа входящих сразу, чтобы восстанавливать удалённые картинки (0 — выключить)
|
|
CACHE_MEDIA=1
|
|
|
|
# debug | info | warn | error
|
|
LOG_LEVEL=info
|