← Все статьи

🤖 Как устроен бот внутри: очень простая схема

🤖 Как устроен бот внутри: очень простая схема

Представьте бота как конвейер из трёх шагов:

🧑 Пользователь пишет сообщение
🤖 Бот (ваше приложение) получает событие от Telegram
🖥 Ваш сервер решает, что ответить, и шлёт ответ обратно

Мини‑схема:
Пользователь ➜ Telegram ➜ Ваш сервер ➜ Telegram ➜ Пользователь

🔍Что происходит под капотом по шагам

1. Пользователь отправляет сообщение боту в чате.
2. Telegram формирует «update» (кто, что, когда, вложения).
3. Ваше приложение получает update:
3.1. Long Polling - «спрашиваем» у Telegram новые события.
3.2. Webhook - Telegram сам постучится к вам на URL.
4. Логика: парсим текст/кнопки, выбираем ответ, при необходимости ходим в БД или API.
5. Отправляем ответ через Bot API (sendMessage, sendPhoto и т.д.).
6. Telegram доставляет его пользователю.


Почему это просто
Бот - это токен + ваше приложение. Вся магия - в коде на сервере.
Достаточно одного файла и простого хостинга.
Масштабирование добавляется по мере роста: БД, кэш, очереди - позже.

Два способа получать события

🌀 Long Polling - проще для старта (без публичного домена, всего один скрипт).
🚀 Webhook - быстрее и экономичнее в проде (нужен URL/сервер).

Минимальный стек

Язык: Python / Node.js / Go - что ближе.
Для старта: Long Polling; для продакшна: Webhook.
Состояние: сначала словарь/файл, позже — SQLite/PostgreSQL.

Простейший пример: Long Polling на Python (без серверов) 🐍

import os, time, requests

TOKEN = os.getenv("TG_TOKEN")
if not TOKEN:
raise RuntimeError("Установите переменную окружения TG_TOKEN с токеном бота")

API = f"https://api.telegram.org/bot{TOKEN}"

def get_updates(offset=None):
r = requests.get(f"{API}/getUpdates", params={"offset": offset, "timeout": 25}, timeout=30)
r.raise_for_status()
return r.json().get("result", [])

def send(chat_id, text):
requests.post(f"{API}/sendMessage", json={"chat_id": chat_id, "text": text}, timeout=10)

print("Bot is running…")
offset = None
while True:
try:
for upd in get_updates(offset):
msg = upd.get("message") or {}
chat_id = msg.get("chat", {}).get("id")
text = msg.get("text", "")

if chat_id:
if text.startswith("/start"):
send(chat_id, "Привет! Я простой бот 🤖\nНапишите /help для подсказки.")
elif text.startswith("/help"):
send(chat_id, "Команды:\n/start — приветствие\n/help — справка")
else:
send(chat_id, f"Вы написали: {text} ✉️")
offset = upd["update_id"] + 1
except Exception as e:
print("Ошибка:", e)
time.sleep(2)

Нужен бот под задачу (продажи, запись, интеграции) - разработаю под ключ.
Напишите мне в личные/в ответ на пост, обсудим детали. Или рассчитайте стоимость в моём бот‑калькуляторе @svyatoslav_devbot

Made on
Tilda