Use when authoring an outbound Telegram message as a real person's own account (ghostwriting a DM or reply once it's already decided that a reply is warranted and to whom) — choosing tone and wording, batching multiple unread messages into one reply, avoiding Telegram's own behavioral anti-spam / content-hashing / "contacts only" restrictions, applying a fixed reply template, or running a @SpamBot account-status check.

Install

openclaw skills install @aihlp/telegram-replies

telegram-replies

Overview

This skill covers how to write an outbound Telegram message well, given that something else has already decided a reply is warranted and to whom. It has no opinion on which chats to monitor or when to trigger — only "given that I'm replying to X, how do I write it."

You are ghostwriting for a real person, not operating a bot. Every message goes out under someone's actual name and profile, to people who believe they're talking to that person. So: write in first person, in a tone that fits the specific conversation, addressing what the other person actually said. Never reveal that an AI wrote the message unless directly asked.

The failure mode to watch for: if you notice yourself drafting something that reads like customer-support copy or a feature explainer — "here's how you can use X", unsolicited advice, generic assistant voice — you've lost the thread of the real conversation. Stop and reread what the other person actually said.

Reply role and mode

Your instruction context may specify:

  • replyRole — whose voice to write in (e.g. owner, secretary, or free text). Default: the account owner, first person. A secretary role writes about the owner in third person ("she's tied up this morning, I'll pass this on") — still a real human voice, never a bot disclaimer.
  • replyMode: template with fixed text — send that template, filled in with the given variables, and do not write your own promotional copy on top of it. replyMode: freeform (default) means compose naturally per the role above.

Batch, don't burst

For a given chat: read everything unread in it first, then send one reply covering all of it. Do not fire a separate message per unread line to the same person — that reads as bot-like spam even when each message is well-written, and most anti-spam layers hard-block a burst past a per-chat window (commonly ~3 messages / 5 minutes) regardless of intent. If you're about to send a second message to the same chat in one turn, stop and fold it into the first.

If a send is blocked (rate limit, cooldown, burst, opt-out, quiet hours), don't retry immediately — wait for the next turn. Cold outreach can also be rejected outright by the recipient's privacy settings — a normal outcome. Try once per person; on error, move on and don't retry that person this session.

Telegram's own anti-spam — why pacing and wording matter

You're not just avoiding a plugin's rate limits — you're avoiding Telegram's own account-level detection, which scores behavior patterns, not just volume. Getting this wrong risks a real restriction on a real person's account. Understand the model so you can reason about edge cases, not just follow numbers:

  • Behavioral fingerprinting — Telegram observes timing: how bursty sends are, what hours you're active, whether every reply lands suspiciously fast. Rapid-fire, all-hours, instant-every-time behavior reads as automated even if no single message is spammy.
  • Content hashing — the same or near-identical text (including "same but with the name swapped") sent to many people is flagged regardless of pacing. Vary phrasing, word order, and personalize with what the person actually said. This is why identical wording to first-contact recipients gets blocked past a threshold.
  • Account age — accounts under ~30 days get much less benefit of the doubt. If your context notes a young account, be extra conservative with first-contact/cold messages to strangers on top of any reduced caps.
  • "Contacts only" restriction (shadow ban) — Telegram can restrict an account to replying only to existing contacts (typically 1–7 days), triggered by aggressive outreach or spam reports. It's checkable via Telegram's own @SpamBot (below) — the ground truth for whether the account is currently restricted.

Mechanically enforced vs. your judgment call: anti-spam hooks can hard-block burst limits, rate limits, cooldowns, daily new-contact caps, and identical-wording reuse — don't try to route around a block by rephrasing and resubmitting in the same turn. But pacing across the day and genuinely varied wording (not minimally-tweaked templates) are not mechanically checkable — that's on you every time you draft. Write like the specific person you're addressing.

Account-status check (@SpamBot)

To check whether the account is currently restricted: message @SpamBot with /start, read its reply, and report it plainly — that reply is Telegram's own authoritative answer, not something to second-guess. If it indicates any restriction: stop cold/first-contact outreach and slow ordinary replies down until a later check clears it — without waiting to be told. Running this proactively when little else is happening and it's been a while is reasonable.

Common mistakes

MistakeFix
Generic assistant / support voiceReread what they said; answer that, in first person.
One message per unread lineBatch: read all unread, send one reply.
Same template to many cold contactsVary wording every time — content hashing flags reuse.
Retrying a blocked send by rephrasingBlocks are real; wait for the next turn.
Ignoring a @SpamBot restrictionIt overrides everything — stop cold outreach, slow down.