Skip to content

Repository files navigation

tron-energy-bot

Личный Telegram-бот для дешёвых переводов USDT TRC-20 через сервис аренды энергии. Бот — надстройка для удобства над сторонним сервисом @TRXerer: проверяет получателя, считает тариф, собирает ссылки для TronLink, следит за приходом энергии и вовремя напоминает пополнить TRX.

Бот работает только с публичными данными: никаких приватных ключей и сид-фраз в проекте нет. Все подтверждения переводов — в кошельке TronLink.

Как пользоваться

Пришли боту адрес получателя и сумму USDT через пробел:

TAUN6FwrnwwmaEqYcckffC7wYmbaS6cBiX 25

Дальше бот сам:

  1. Проверит получателя: баланс USDT, активацию, нужный тариф аренды.
  2. Проверит твой кошелёк: хватает ли USDT на перевод и TRX на оплату аренды.
  3. Шаг 1 из 2 — пришлёт оплату аренды (1.5 или 3 TRX на адрес сервиса) с кнопками.
  4. Дождётся, когда энергия придёт на твой кошелёк (обычно секунды, следит до 3 минут; /cancel — отменить).
  5. Шаг 2 из 2 — пришлёт сам перевод USDT с кнопками.

Сумму можно не писать — тогда бот спросит её отдельным вопросом. На вопрос можно не отвечать: если ты просто проверял адрес или делаешь перевод вручную, ничего не сломается. Аренда энергии при этом всё равно предлагается — «только адрес» подходит и для сценария «куплю энергию, а перевод сделаю сам».

Кнопки под сообщениями

Кнопка Что делает
Открыть ссылку основной путь: страница-мостик мгновенно передаёт готовый перевод в TronLink (на телефоне — в приложение, на компьютере — в расширение)
QR ссылки та же ссылка картинкой — сканируй камерой телефона (удобно, когда Telegram на компьютере, а подтверждать хочешь с телефона)
QR приложения аварийный вариант: QR с чистым адресом для сканера внутри TronLink; сумму вводишь руками

Рядом с кнопками всегда есть адрес и сумма моноширинным текстом — копируются тапом, если хочется совсем вручную.

Тарифы аренды

Ситуация у получателя Энергия Цена
USDT уже есть на балансе 65 000 1.5 TRX
USDT нет или аккаунт не активирован 131 000 3 TRX

Если баланс получателя ненулевой, но меньше 1 USDT — бот предупредит: баланс могут обнулить, и к моменту перевода может понадобиться двойной тариф.

Обмен USDT → TRX

TRX нужны на оплату аренды. Когда запас тает (порог — TRX_LOW_BALANCE_WARN в .env), бот отдельным сообщением предупредит и предложит кнопку «Обменять USDT → TRX». Предупреждение показывается только рядом с шагом аренды — там, где TRX нужны; возле шага перевода лишних денежных кнопок нет, чтобы не перепутать перевод с обменом. Кнопка «Обменять»: спросит сумму и оформит обмен как обычный перевод по полной двухшаговой схеме (аренда энергии → перевод USDT на адрес обмена) — ведь перевод на обмен тоже требует энергию, без неё сеть сожгла бы ~13+ TRX комиссии. TRX вернутся автоматически. Если TRX не хватает уже на текущую аренду — предупреждение станет жёстким (⚠️), но кнопки аренды остаются.

Перед выдачей ссылки на перевод бот также сверяет твой баланс USDT: неудачный перевод откатился бы и сжёг арендованную энергию впустую.

Команды

  • /start — инструкция;
  • /wallet — задать или сменить свой кошелёк (диалогом; нужно один раз);
  • /config — тарифы, адреса, твой кошелёк;
  • /cancel — отменить всё, что бот сейчас ждёт (настройку кошелька, вопрос про сумму, обмен, ожидание энергии);
  • /help — список команд.

Новый пользователь

  1. Человек пишет боту → получает отказ со своим Telegram ID («сообщите его разработчику»).
  2. Ты добавляешь ID в ALLOWED_USER_IDS (локальный .envbash deploy.sh; список также перечитывается на лету раз в минуту).
  3. Бот сам пишет новичку «тебя добавили», присылает список команд и просит адрес его кошелька.
  4. Человек присылает адрес — готов к работе. Кошельки хранятся в wallets.json на сервере, у каждого пользователя свой.

Как это работает (техника)

  • Проверка получателя: TronGrid (getaccount — активация, triggerconstantcontract → balanceOf — баланс USDT официального контракта TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t); при недоступности — фолбэк на Tronscan. Адреса валидируются локально (base58check) без сети.
  • Ожидание энергии: опрос getaccountresource твоего кошелька каждые 2 с, до 3 минут. Уведомления шлются с повторами (5 попыток) — секундный сбой сети не теряет готовое сообщение. Ожидание всегда одно на пользователя: сервис аренды не суммирует энергию (одна аренда за раз), поэтому новый запрос явно отменяет прежнее ожидание — бот сообщает об этом и предупреждает не оплачивать аренду повторно.
  • Мостик (bridge/index.html, захощен на Cloudflare) — статическая страница-трамплин. Прямой deeplink TronLink action=transfer работает только для dApp из whitelist самого TronLink (иначе «cannot be called up»), поэтому используется action=open: страница открывается во встроенном браузере TronLink и передаёт перевод через стандартный dApp-API (window.tronLink). На компьютере тот же API даёт расширение TronLink. Страница проверяет, что в кошельке выбран адрес, заданный через /wallet, ничего не подписывает и не отправляет данные — подтверждение всегда в кошельке.
  • Движок бота: aiogram v3. Сетевые сбои переживаются молча: ретраи старта, повторы уведомлений, компактный лог вместо трейсбеков.

Установка с нуля

Настройки (.env)

Переменная Что это
TELEGRAM_BOT_TOKEN токен бота от @BotFather (обязательно)
ALLOWED_USER_IDS whitelist: Telegram ID через запятую; правки подхватываются за минуту без перезапуска
ENERGY_SERVICE_PAYMENT_ADDRESS платёжный адрес сервиса аренды (куда уходят 1.5/3 TRX)
EXCHANGE_PAYMENT_ADDRESS адрес автообмена USDT → TRX того же сервиса (опционально)
TRX_LOW_BALANCE_WARN порог предупреждения «запас TRX тает» (по умолчанию 30)
BRIDGE_BASE_URL адрес захощенной страницы-мостика
TRONGRID_API_KEY опционально, поднимает лимиты TronGrid
DEPLOY_HOST, DEPLOY_KEY для deploy.sh: IP сервера и путь к ssh-ключу (бот их не читает)

Кошельки пользователей в .env не хранятся — каждый задаёт свой через /wallet, бот пишет их в wallets.json.

Где брать актуальные адреса сервиса: группа Telegram @TRXerer (там посты с адресами аренды и обмена, курсом и тарифами), бот сервиса @TrxBaoBaobot, поддержка @erjie8. Автосинхронизации нет намеренно: адреса, по которым ходят деньги, обновляются только руками (автопроверку сделать нельзя: это группа, а не канал — веб-превью у неё нет, а посты в ней публикует их бот, которого чужие боты не видят). Если сервис сменит адрес аренды — оплата на старый просто не принесёт энергию, вотчер скажет «не дождался», и это сигнал свериться с группой.

Мостик (один раз)

Статическая страница bridge/index.html на любом https-хостинге. Проще всего Cloudflare: dash.cloudflare.com → Workers & Pages → Create → «Upload assets» → перетащить папку bridge/ → адрес вида https://имя.workers.dev вписать в BRIDGE_BASE_URL. Обновление страницы: страница проекта → Deployments → новая заливка той же папки (адрес не меняется). Без мостика бот тоже работает: адреса и суммы копируются текстом, QR приложения — для сканера TronLink.

Локально (Windows, для разработки)

Двойной клик по run.bat: сам создаст venv, поставит зависимости, создаст .env из шаблона при первом запуске. Не запускай локального бота, пока работает серверный — два бота на одном токене дерутся за сообщения (409 Conflict). Для отладки: останови сервис на сервере, работай локально, потом задеплой и запусти сервис обратно.

Сервер (Linux, продакшн)

Бот живёт на сервере в /root/tron-bot под systemd-сервисом tron-bot (автозапуск после ребута, авторестарт при падении). Нужен Python 3.10+ и пакет python3-venv. Юнит — по образцу:

[Unit]
Description=tron energy rental Telegram bot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/tron-bot
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONUTF8=1
ExecStart=/root/tron-bot/.venv/bin/python bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Эксплуатация

Дозаливка — с ноута, из Git Bash:

bash deploy.sh

Скрипт пакует код и .env, копирует на сервер, обновляет зависимости и перезапускает сервис. Правило «один писатель — один файл», чтобы не было рассинхрона:

Файл Кто пишет Источник истины
код (*.py, bridge/) разработчик локально
.env владелец, только локально локально (deploy перевозит)
wallets.json, users.json только бот сервер (deploy не трогает)

Если серверный .env правили напрямую, deploy остановится и покажет разницу (снимок последнего деплоя — .env.deployed); осознанно затереть: FORCE_ENV=1 bash deploy.sh.

Логи:

ssh -i ~/.ssh/<ключ> root@<сервер> 'journalctl -u tron-bot -f'

Плюс bot.log рядом с ботом (ротация 1 МБ × 3). Сетевые сбои Telegram — одна строка WARNING, это норма.

Структура проекта

  • bot.py — Telegram-слой: обработчики, диалоги, кнопки, вотчер энергии, приветствия, фоновая перечитка whitelist;
  • tron.py — валидация адресов, TronGrid/Tronscan, балансы и энергия;
  • deeplink.py — сборка deeplink-ссылок TronLink и ссылок на мостик;
  • bridge/index.html — страница-мостик (самодостаточная, без зависимостей);
  • config.py — инженерные константы (контракт USDT, тарифы, таймауты) и чтение .env;
  • wallets.py, users.py — json-хранилища кошельков и памяти о пользователях;
  • pluralize.py — склонение русских слов при числительных (1 перевод / 2 перевода / 7 переводов);
  • deploy.sh — дозаливка на сервер (адрес сервера и ключ берёт из .env: DEPLOY_HOST, DEPLOY_KEY); run.bat / run.sh — локальный запуск;
  • .env — настройки эксплуатации (не в git), .env.example — шаблон.

About

Бот-обёртка для @TRXerer

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages