VPN·HUB·CRACK Как у вас угонят бота: три дыры и защита от них · VPN HUB CRACK
Все статьи
Bot PRO

Как у вас угонят бота: три дыры и защита от них

Обновлено 26 августа 2026 Проверено

Как у вас угонят бота: три дыры и защита от них

Бот продаёт подписки и живёт годами, пока однажды не перестаёт отвечать. Telegram выдал ограничение, клиенты не могут оплатить, а вы даже не понимаете, за что.

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

📖 Незнакомые слова? Все термины простыми словами есть в Словаре терминов.

Дыра первая: бота добавляют в чужой чат

По умолчанию любой человек может добавить вашего бота в свою супергруппу. Если админку ему при этом не выдать, Telegram считает бота обычным участником, и на него распространяются те же санкции, что и на людей.

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

Закрывается в BotFather за минуту:

/mybots → ваш бот → Bot Settings → Allow Groups? → Turn groups off

Проверить, закрыта ли дыра у вас:

curl -s "https://api.telegram.org/bot<ТОКЕН>/getMe" | grep -o '"can_join_groups":[a-z]*'

Ответ должен быть "can_join_groups":false. Если true, идите в BotFather.

Заодно выключите там же Group Privacy и инлайн-режим, если не пользуетесь: чем меньше поверхности, тем меньше поводов для жалоб.

Дыра вторая: невидимые символы обходят ограничения

Telegram режет однотипные сообщения: одинаковый текст подряд получает FloodWait, и бот замолкает. На этом держится защита от спама.

Обходят её невидимыми символами. Отправляют не /start, а /start со склеенным символом-невидимкой. Для человека строки выглядят одинаково, для Telegram это разные сообщения, ограничение не срабатывает, а бот исправно отвечает на каждое.

Проверил, что именно работает:

Символ Пробельный Уберёт ли .strip()
U+2000 EN QUAD да да
U+3164 HANGUL FILLER нет нет
U+200B ZERO WIDTH SPACE нет нет
U+FEFF BOM нет нет
U+2800 BRAILLE PATTERN BLANK нет нет

Обычная очистка текста снимает только настоящие пробелы. Хангыльский филлер и его родня проходят насквозь. Нормализация NFKC тоже не спасает: она превращает U+3164 в другой невидимый символ, а не удаляет его.

Защита состоит из двух частей.

Первая: чистить входящий текст от невидимок перед любой обработкой.

import re, unicodedata

# Символы, которых в осмысленном пользовательском вводе не бывает:
# управляющие (Cf), суррогаты, филлеры и «пустые» глифы.
_INVISIBLE = re.compile(
    r"[---"
    r"ㅤᅟᅠ឴឵᠎⠀]"
)

def clean(text: str) -> str:
    text = unicodedata.normalize("NFKC", text or "")
    text = _INVISIBLE.sub("", text)
    # схлопываем любые пробельные подряд в один
    return re.sub(r"\s+", " ", text).strip()

Вторая: не полагаться на ограничения Telegram, держать свой счётчик.

import time
from collections import defaultdict

_hits: dict[int, list[float]] = defaultdict(list)
LIMIT, WINDOW = 20, 60          # 20 сообщений в минуту на человека

def too_fast(user_id: int) -> bool:
    now = time.time()
    hits = [t for t in _hits[user_id] if now - t < WINDOW]
    hits.append(now)
    _hits[user_id] = hits
    return len(hits) > LIMIT

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

Дальше в обработчике: почистили текст, проверили счётчик, и только потом работаете. Команды сверяйте с точным списком, а не по началу строки: /start и /startㅤ после очистки станут одинаковыми, а вот /startattack командой быть не должно.

Дыра третья: через бота проходит запрещённое

Если бот принимает текст от людей и куда-то его передаёт (в поддержку, в отзывы, в общий чат), через него можно пропустить что угодно: ссылки на фишинг, рекламу, оскорбления, упоминания запрещённого контента. Жалоба прилетит на бота.

Фильтр держите по категориям, а не одним списком:

BAN_PATTERNS = [
    r"t\.me/(spambot|premiumbot|botfather)\b",   # подделки под сервисы Telegram
    r"t\.me/\+?\d{10,}",                          # ссылки-приглашения по номеру
    r"\b(childporn|cp|порн\w*|детск\w+\s+порн\w*)\b",
    r"\b(scam|phishing|фишинг|скам)\b",
    r"\b(казино|ставк\w+|crypto\s*drop)\b",       # типовой спам
]

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

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

Проверьте свой бот за пять минут

TOKEN=<ваш токен>

# 1. Дыра с группами закрыта?
curl -s "https://api.telegram.org/bot$TOKEN/getMe" | python3 -m json.tool | grep can_

# 2. Бот не ограничен прямо сейчас?
curl -s "https://api.telegram.org/bot$TOKEN/getMe" | grep -q '"ok":true' && echo "живой"

# 3. Нет ли забытых вебхуков (частый след взлома)
curl -s "https://api.telegram.org/bot$TOKEN/getWebhookInfo" | python3 -m json.tool

В ответе getWebhookInfo смотрите на url. Чужой адрес там означает, что ваш токен у кого-то есть и обновления уходят на сторону.

Если бота уже ограничили

Пишите в @spambot с аккаунта владельца: он показывает статус и принимает апелляцию. До ответа закройте дыры, иначе ограничение вернётся.

Токен при подозрении на утечку меняйте сразу: BotFather → /revoke. Старый перестанет работать, не забудьте обновить его в конфигурации сервиса.

Коротко

  1. Запретите добавлять бота в группы: BotFather, Allow Groups? → off.
  2. Чистите входящий текст от невидимых символов до всякой логики.
  3. Держите свой счётчик сообщений, не надейтесь на лимиты Telegram.
  4. Фильтруйте пользовательский текст по категориям, проверяйте после очистки.
  5. Раз в месяц смотрите getWebhookInfo на чужие адреса.

Что дальше