Telegram — курьер с обязательным согласованием
Скилл умеет три вещи: отправить сообщение в чат/личку, найти чат по названию, прочитать последние сообщения. Отправка идёт от личного аккаунта пользователя (Telethon-сессия) — поэтому к ней максимально жёсткие правила.
🔴 Золотое правило (нарушать нельзя никогда)
Ни одно сообщение не уходит в Telegram без явного согласия пользователя в этом диалоге. Без исключений, без «очевидно же», без «он просил похожее выше».
Это не рекомендация, а инвариант скилла. Если есть хоть тень сомнения — не отправляй, спроси.
Протокол отправки (всегда по шагам)
- Определи чат. Запусти
scripts/tg_resolve.py "<кусок названия>". Если совпадений несколько или ноль — покажи кандидатов и переспроси, какой именно (при нуле можно поднять --limit, если чат глубоко в списке диалогов). Никогда не угадывай чат для отправки.
- Собери сообщение. Текст бери у пользователя / из подготовленного артефакта дословно. Ничего не дописывай от себя без его ведома.
- Покажи карточку согласования. Запусти сухой прогон —
scripts/tg_send.py --chat <id> --text "<текст>" (без --yes). Он напечатает карточку (чат + тип + id + полный текст 1:1) и ничего не отправит. Покажи этот вывод пользователю как есть и прямо спроси: «Отправляю?» Карточку рисует сам скрипт — это гарантирует, что текст и чат в превью совпадают с тем, что уйдёт.
- Дождись явного согласия. Согласие — это недвусмысленное «да / отправляй / го / согласовано / шли». НЕ согласие: молчание, «норм текст», «ок» к другому вопросу, «наверное», правки без команды отправить, лайк. Внёс правку — прогони сухой прогон заново и снова спроси.
- Отправь тем же вызовом с флагом
--yes: scripts/tg_send.py --chat <id> --text "<текст>" --yes (или --file <path> для длинного текста). Флаг --yes ставится только после согласия и с тем же текстом/чатом, что были в карточке.
- Подтверди факт. Сообщи пользователю, что ушло, с
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.
- Сомневаешься, тот ли чат, тот ли текст, то ли согласие → остановись и спроси. Лучше лишний вопрос, чем сообщение не туда.
1---2name: telegram3description: Универсальный курьер в Telegram от личного аккаунта пользователя: отправить готовый текст/ссылку в конкретный чат или личку, найти нужный чат по названию, прочитать последние сообщения чата. Работает поверх Telethon-сессии (ключи в Keychain). ГЛАВНОЕ: ни одно сообщение не уходит без явного согласования с пользователем — скилл всегда показывает, ЧТО и КУДА отправит, и ждёт подтверждения. Use when пользователь просит «отправь в телеграм», «напиши в тг», «скинь/закинь в чат», «запости в чат X», «передай в телеграм», «отправь это в чат», «скинь ссылку в тг», «прочитай чат», «что писали в чате X», «найди чат», «telegram», «/telegram», «тг-чат». Также когда другой скилл подготовил текст и пользователь просит доставить его в Telegram. Do NOT use для написания контента: посты в каналы, анонсы, лонгриды и т.п. — для этого есть профильные контент-скиллы. Этот скилл — транспорт (отправить готовое / прочитать), а не копирайтер. Если текста ещё нет — сначала профильный скилл пишет, потом telegram доставляет (всё равно с с4---56# Telegram — курьер с обязательным согласованием78Скилл умеет три вещи: **отправить** сообщение в чат/личку, **найти** чат по названию, **прочитать** последние сообщения. Отправка идёт от **личного аккаунта пользователя** (Telethon-сессия) — поэтому к ней максимально жёсткие правила.910## 🔴 Золотое правило (нарушать нельзя никогда)1112**Ни одно сообщение не уходит в Telegram без явного согласия пользователя в этом диалоге.** Без исключений, без «очевидно же», без «он просил похожее выше».1314Это не рекомендация, а инвариант скилла. Если есть хоть тень сомнения — не отправляй, спроси.1516## Протокол отправки (всегда по шагам)17181. **Определи чат.** Запусти `scripts/tg_resolve.py "<кусок названия>"`. Если совпадений несколько или ноль — **покажи кандидатов и переспроси**, какой именно (при нуле можно поднять `--limit`, если чат глубоко в списке диалогов). Никогда не угадывай чат для отправки.192. **Собери сообщение.** Текст бери у пользователя / из подготовленного артефакта дословно. Ничего не дописывай от себя без его ведома.203. **Покажи карточку согласования.** Запусти **сухой прогон** — `scripts/tg_send.py --chat <id> --text "<текст>"` (без `--yes`). Он напечатает карточку (чат + тип + id + полный текст 1:1) и ничего не отправит. Покажи этот вывод пользователю как есть и прямо спроси: «Отправляю?» Карточку рисует сам скрипт — это гарантирует, что текст и чат в превью совпадают с тем, что уйдёт.214. **Дождись явного согласия.** Согласие — это недвусмысленное «да / отправляй / го / согласовано / шли». **НЕ согласие:** молчание, «норм текст», «ок» к другому вопросу, «наверное», правки без команды отправить, лайк. Внёс правку — прогони сухой прогон заново и снова спроси.225. **Отправь** тем же вызовом с флагом `--yes`: `scripts/tg_send.py --chat <id> --text "<текст>" --yes` (или `--file <path>` для длинного текста). Флаг `--yes` ставится **только после** согласия и с тем же текстом/чатом, что были в карточке.236. **Подтверди факт.** Сообщи пользователю, что ушло, с `message_id` и названием чата.2425Одно согласие = одна отправка. Следующее сообщение — снова карточка и снова «да». Согласие на сообщение №1 не распространяется на №2.2627## Что можно без отдельного согласования2829**Только чтение** (read-only): `tg_resolve.py` (поиск чата) и `tg_read.py` (последние сообщения) — в рамках текущей задачи пользователя. Это не меняет ничего в Telegram. Но не сканируй чужую переписку без причины и не пересказывай лишнего — приватность.3031## Чего скилл не делает (запрещено)3233- ❌ Не инициирует отправку сам. Скилл включается, только когда пользователь сам просит что-то отправить/прочитать. Никаких «я подумал, надо бы написать им».34- ❌ Не рассылает нескольким адресатам и не пересылает сообщения без отдельного согласования по каждому.35- ❌ Не отвечает в чатах автоматически, не реагирует, не «поддерживает беседу».36- ❌ Не редактирует и не удаляет чужие/свои сообщения (скрипты этого и не умеют — отправка только новых).37- ❌ Не выдумывает текст «за пользователя». Если просит «напиши им сам» — сначала покажи черновик и согласуй, потом отправляй.3839## Технический предохранитель4041`tg_send.py` без флага `--yes` работает в режиме **сухого прогона**: резолвит чат и печатает, что *было бы* отправлено, но **не шлёт ничего**. Реальная отправка — только с `--yes`. Это страховка на случай ошибки: нет `--yes` → нет сообщения. Не обходи её — флаг добавляется исключительно после согласования по протоколу выше.4243## Скрипты4445| Скрипт | Действие | Опасность |46|--------|----------|-----------|47| `scripts/tg_resolve.py "<запрос>" [--limit N]` | ищет чаты по подстроке названия → JSON (id, title, type, username) | read-only |48| `scripts/tg_read.py <id\|@username> [--limit N]` | последние N сообщений чата | read-only |49| `scripts/tg_send.py --chat <id\|@username> (--text "..." \| --file <path>) [--yes]` | без `--yes` — сухой прогон; с `--yes` — отправка | ⚠️ запись, только после согласования |5051Запуск: `python3 ~/.claude/skills/telegram/scripts/<скрипт>` (зависимость — `telethon`, уже стоит). Ключи и сессия подхватываются автоматически из Keychain / дефолтного пути. Детали окружения и восстановление доступа — `references/setup.md`. Полная памятка по безопасности — `references/safety.md`.5253## Если что-то не так5455- «Нет ключей / сессии» → `references/setup.md` (ключи в Keychain `tg-api-id` / `tg-api-hash`, сессия переиспользуется, если уже настроена).56- Чат не находится → проверь подстроку, спроси у пользователя точное название или ссылку/@username.57- Сомневаешься, тот ли чат, тот ли текст, то ли согласие → **остановись и спроси**. Лучше лишний вопрос, чем сообщение не туда.