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