IKORG
English

← Практика · 2 сентября 2026

Как управлять сессией Claude Code из Телеграма

Подключаем бота к терминалу: пишете задачу с телефона, получаете ответ и файлы в чат. Разбираем настройку, ограничение «один бот — одна сессия» и запасной мост на случай, когда канал отваливается.

8 минут чтенияинструменты

Работа с нейросетью в терминале хороша всем, кроме одного: вы к нему привязаны. Долгая задача идёт двадцать минут, а вы не можете отойти от компьютера — вдруг понадобится ответить на вопрос.

Телеграм решает это за вечер настройки. Бот становится вторым входом в ту же сессию: пишете с телефона «проверь, поднялся ли сайт», получаете ответ в чат, вам приходят готовые файлы и скриншоты. Я так проверяю выкладки из автобуса.

Ниже — рабочая схема и, что важнее, честный список того, где она ломается.

Шаг 1. Свой бот

Открываете @BotFather, команда /newbot, придумываете имя и адрес. В ответ приходит токен вида 8805421456:AA…. Это пароль от бота, обращайтесь с ним как с паролем.

Свой бот нужен обязательно: чужого не бывает, а публичные «GPT-боты» — это чужой сервер между вами и вашим терминалом.

Узнать свой числовой идентификатор в Телеграме можно у @userinfobot — он понадобится, чтобы бот отвечал только вам.

Шаг 2. Канал в Claude Code

В Claude Code есть штатный канал для Телеграма — плагин telegram. Токен и список допущенных лежат в каталоге состояния:

~/.claude/channels/telegram/
  .env          ← TELEGRAM_BOT_TOKEN=8805421456:AA…
  access.json   ← кому можно писать боту
{
  "dmPolicy": "allowlist",
  "allowFrom": ["590123185"]
}

dmPolicy: allowlist — единственный разумный режим. Без него любой, кто найдёт вашего бота, получит доступ к вашему терминалу.

Запуск сессии с каналом:

claude --channels plugin:telegram@claude-plugins-official

Всё: сообщения из чата приходят в сессию как обычные реплики, ответы уходят обратно в чат.

Шаг 3. Несколько проектов — несколько ботов

И вот первое ограничение, которое стоит понять до того, как вы построите на схеме рабочий процесс.

Телеграм допускает только одного читателя на токен. Второй процесс, который начнёт читать сообщения того же бота, получит ошибку 409 Conflict, и они начнут отбирать сообщения друг у друга. Значит правило простое: один бот = одна сессия. Для трёх проектов нужны три бота.

Разводится это переменной окружения — каждой сессии свой каталог состояния:

#!/usr/bin/env bash
# ~/.local/bin/claude-tg <имя> [аргументы claude...]
set -euo pipefail
имя="${1:?использование: claude-tg <имя>}"; shift
export TELEGRAM_STATE_DIR="$HOME/.claude/channels/telegram-$имя"
[ -f "$TELEGRAM_STATE_DIR/.env" ] || { echo "нет токена в $TELEGRAM_STATE_DIR" >&2; exit 1; }
exec claude --channels plugin:telegram@claude-plugins-official "$@"
claude-tg сайт      # чат «Сайт» → сессия в папке сайта
claude-tg игра      # чат «Игра» → своя сессия, свой бот

Каталог telegram-<имя> создаётся копированием обычного: в нём свой .env со своим токеном и свой access.json.

Шаг 4. Отправка файлов и картинок

Самое приятное в этой схеме — не текст, а вложения. Сессия может прислать в чат готовый PDF, скриншот страницы, архив с выгрузкой. Скриншот сайта после выкладки приходит на телефон — и сразу видно, всё ли встало на место.

Если инструменты канала почему-то недоступны, файл всегда можно отправить напрямую через Bot API:

ТОКЕН=$(grep -o '[0-9]\{6,\}:[A-Za-z0-9_-]\+' ~/.claude/channels/telegram-сайт/.env)
ЧАТ=590123185
curl -s -F chat_id="$ЧАТ" -F caption="отчёт готов" \
     -F document=@отчёт.pdf \
     "https://api.telegram.org/bot$ТОКЕН/sendDocument"

Та же логика для картинки — метод sendPhoto и поле photo, для текста — sendMessage и поле text.

Что ломается на практике

Читатель входящих иногда умирает молча. Сессия работает неделями, а поллер, который забирает сообщения, в какой-то момент отваливается. Симптом коварный: вы пишете боту, ответа нет, а в терминале всё живо — ваши сообщения просто никто не читает. Проверяется одной командой:

curl -s "https://api.telegram.org/bot$ТОКЕН/getWebhookInfo" | python3 -m json.tool

Если pending_update_count больше нуля и не уменьшается — сообщения лежат непрочитанными. Лечится перезапуском сессии; контекст при этом не теряется, если запускать с --continue.

Прочитать вручную можно, но осторожно. getUpdates заберёт зависшие сообщения, но заодно вступит в конфликт с живым читателем. Пользуйтесь этим как разовой мерой, когда канал уже не работает, а не как способом «подглядеть».

Не пересылайте боту чужие персональные данные. Всё, что приходит в чат, уходит в сессию и может попасть в контекст модели. Простое правило: в бота — задачи и ссылки, не выгрузки с телефонами клиентов.

Не выкладывайте в чат токены и пароли. Кажется очевидным, но соблазн «пришли мне пароль от базы» велик. История чата живёт дольше, чем ваша память о том, что вы там писали.

Запасной мост

Раз читатель может умереть, полезно иметь второй, независимый путь. Мост — маленький скрипт, который сам опрашивает Телеграм и печатает пришедший текст прямо в сессию терминала через tmux send-keys, а ответ возвращает в чат.

Важно: у моста должен быть свой бот. Если запустить его на том же токене, что и плагин, они начнут драться за сообщения — и вы сломаете то, что работало.

#!/usr/bin/env bash
# ~/.local/bin/tg-bridge <имя> — мост «Телеграм → tmux-сессия»
set -euo pipefail
имя="${1:?использование: tg-bridge <имя>}"
файл="$HOME/.tg-bridge-$имя.env"       # TG_TOKEN=…  TG_CHAT=…  TG_SESSION=…
токен=$(grep -oP '(?<=^TG_TOKEN=)\S+' "$файл")

# не даём себе выстрелить в ногу: этот токен не должен быть занят плагином
if grep -rqF "$токен" "$HOME"/.claude/channels/telegram*/.env 2>/dev/null; then
  echo "этот токен уже занят каналом Claude Code — заведите отдельного бота" >&2
  exit 1
fi
setsid nohup python3 "$HOME/.local/bin/tg-bridge.py" "$файл" \
  >>"$HOME/.tg-bridge-$имя.log" 2>&1 & disown
echo "мост «$имя» поднят"

Сам мост в двадцать строк на Python: getUpdates в цикле, проверка идентификатора отправителя, tmux send-keys -t $TG_SESSION -l "$текст" плюс Enter, потом tmux capture-pane и отправка нового вывода обратно в чат.

Схема грубая, зато работает независимо от того, что случилось с плагином. У меня это именно страховка: основной путь — штатный канал, мост поднимается, когда основной замолчал.

Стоит ли оно того

Стоит, если вы работаете длинными задачами и не хотите сидеть возле терминала. Не стоит, если ваша работа — короткие интерактивные правки: там телефон только мешает.

И одно наблюдение под конец. Телеграм меняет манеру постановки задач: с телефона не напишешь простыню на пятнадцать строк, поэтому формулировки становятся короче и точнее. Иногда это идёт работе на пользу больше, чем сама мобильность.