# Telegram

> Универсальный курьер в Telegram от личного аккаунта пользователя: отправить готовый текст/ссылку в конкретный чат или личку, найти нужный чат по названию, прочитать последние сообщения чата. Работает поверх Telethon-сессии (ключи в Keychain). ГЛАВНОЕ: ни одно сообщение не уходит без явного согласования с пользователем — скилл всегда показывает, ЧТО и КУДА отправит, и ждёт подтверждения. Use when пользователь просит «отправь в телеграм», «напиши в тг», «скинь/закинь в чат», «запости в чат X», «передай в телеграм», «отправь это в чат», «скинь ссылку в тг», «прочитай чат», «что писали в чате X», «найди чат», «telegram», «/telegram», «тг-чат». Также когда другой скилл подготовил текст и пользователь просит доставить его в Telegram. Do NOT use для написания контента: посты в каналы, анонсы, лонгриды и т.п. — для этого есть профильные контент-скиллы. Этот скилл — транспорт (отправить готовое / прочитать), а не копирайтер. Если текста ещё нет — сначала профильный скилл пишет, потом telegram доставляет (всё равно с с

- Skill: `timurugulava/telegram` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add timurugulava/telegram`
- Raw SKILL.md: https://api.skillmd.com/api/skills/timurugulava/telegram/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: TimurUgulava (https://skillmd.com/u/timurugulava)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/timurugulava/telegram

---


# Telegram — курьер с обязательным согласованием

Скилл умеет три вещи: **отправить** сообщение в чат/личку, **найти** чат по названию, **прочитать** последние сообщения. Отправка идёт от **личного аккаунта пользователя** (Telethon-сессия) — поэтому к ней максимально жёсткие правила.

## 🔴 Золотое правило (нарушать нельзя никогда)

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

Это не рекомендация, а инвариант скилла. Если есть хоть тень сомнения — не отправляй, спроси.

## Протокол отправки (всегда по шагам)

1. **Определи чат.** Запусти `scripts/tg_resolve.py "<кусок названия>"`. Если совпадений несколько или ноль — **покажи кандидатов и переспроси**, какой именно (при нуле можно поднять `--limit`, если чат глубоко в списке диалогов). Никогда не угадывай чат для отправки.
2. **Собери сообщение.** Текст бери у пользователя / из подготовленного артефакта дословно. Ничего не дописывай от себя без его ведома.
3. **Покажи карточку согласования.** Запусти **сухой прогон** — `scripts/tg_send.py --chat <id> --text "<текст>"` (без `--yes`). Он напечатает карточку (чат + тип + id + полный текст 1:1) и ничего не отправит. Покажи этот вывод пользователю как есть и прямо спроси: «Отправляю?» Карточку рисует сам скрипт — это гарантирует, что текст и чат в превью совпадают с тем, что уйдёт.
4. **Дождись явного согласия.** Согласие — это недвусмысленное «да / отправляй / го / согласовано / шли». **НЕ согласие:** молчание, «норм текст», «ок» к другому вопросу, «наверное», правки без команды отправить, лайк. Внёс правку — прогони сухой прогон заново и снова спроси.
5. **Отправь** тем же вызовом с флагом `--yes`: `scripts/tg_send.py --chat <id> --text "<текст>" --yes` (или `--file <path>` для длинного текста). Флаг `--yes` ставится **только после** согласия и с тем же текстом/чатом, что были в карточке.
6. **Подтверди факт.** Сообщи пользователю, что ушло, с `message_id` и названием чата.

Одно согласие = одна отправка. Следующее сообщение — снова карточка и снова «да». Согласие на сообщение №1 не распространяется на №2.

## Что можно без отдельного согласования

**Только чтение** (read-only): `tg_resolve.py` (поиск чата) и `tg_read.py` (последние сообщения) — в рамках текущей задачи пользователя. Это не меняет ничего в Telegram. Но не сканируй чужую переписку без причины и не пересказывай лишнего — приватность.

## Чего скилл не делает (запрещено)

- ❌ Не инициирует отправку сам. Скилл включается, только когда пользователь сам просит что-то отправить/прочитать. Никаких «я подумал, надо бы написать им».
- ❌ Не рассылает нескольким адресатам и не пересылает сообщения без отдельного согласования по каждому.
- ❌ Не отвечает в чатах автоматически, не реагирует, не «поддерживает беседу».
- ❌ Не редактирует и не удаляет чужие/свои сообщения (скрипты этого и не умеют — отправка только новых).
- ❌ Не выдумывает текст «за пользователя». Если просит «напиши им сам» — сначала покажи черновик и согласуй, потом отправляй.

## Технический предохранитель

`tg_send.py` без флага `--yes` работает в режиме **сухого прогона**: резолвит чат и печатает, что *было бы* отправлено, но **не шлёт ничего**. Реальная отправка — только с `--yes`. Это страховка на случай ошибки: нет `--yes` → нет сообщения. Не обходи её — флаг добавляется исключительно после согласования по протоколу выше.

## Скрипты

| Скрипт | Действие | Опасность |
|--------|----------|-----------|
| `scripts/tg_resolve.py "<запрос>" [--limit N]` | ищет чаты по подстроке названия → JSON (id, title, type, username) | read-only |
| `scripts/tg_read.py <id\|@username> [--limit N]` | последние N сообщений чата | read-only |
| `scripts/tg_send.py --chat <id\|@username> (--text "..." \| --file <path>) [--yes]` | без `--yes` — сухой прогон; с `--yes` — отправка | ⚠️ запись, только после согласования |

Запуск: `python3 ~/.claude/skills/telegram/scripts/<скрипт>` (зависимость — `telethon`, уже стоит). Ключи и сессия подхватываются автоматически из Keychain / дефолтного пути. Детали окружения и восстановление доступа — `references/setup.md`. Полная памятка по безопасности — `references/safety.md`.

## Если что-то не так

- «Нет ключей / сессии» → `references/setup.md` (ключи в Keychain `tg-api-id` / `tg-api-hash`, сессия переиспользуется, если уже настроена).
- Чат не находится → проверь подстроку, спроси у пользователя точное название или ссылку/@username.
- Сомневаешься, тот ли чат, тот ли текст, то ли согласие → **остановись и спроси**. Лучше лишний вопрос, чем сообщение не туда.

