Практика работы с Telegram
Как сделать бота-автоответчика Telegram на Python
Минимальный учебный бот для ответов на личные текстовые сообщения. Создание, запуск и проверка без платного конструктора.
Подготовьте отдельного бота
- Создайте нового тестового бота через официальный BotFather и сохраните его токен у себя.
- Установите Python 3 и создайте отдельную папку для примера. Сторонние библиотеки этому коду не нужны.
- Задайте токен переменной окружения TG_BOT_TOKEN средствами своей оболочки.
- Сохраните код ниже как bot_reply.py. Не используйте токен бота, у которого уже работает другой обработчик.
- Запустите python bot_reply.py, откройте чат с ботом и отправьте /start.
Этот пример отвечает от имени бота. Он не подключается к вашему личному аккаунту и не требует подписки Telecobra. Компьютер или сервер, на котором работает процесс, должен оставаться включённым.
Код
import json, os
from pathlib import Path
from urllib.request import Request, urlopen
TOKEN = os.environ["TG_BOT_TOKEN"]
STATE = Path("offset.txt")
def api(method, body):
req = Request("https://api.telegram.org/bot" + TOKEN + "/" + method,
data=json.dumps(body).encode(),
headers={"Content-Type": "application/json"})
with urlopen(req, timeout=40) as response:
data = json.load(response)
if not data.get("ok"):
raise RuntimeError("Bot API rejected the request")
return data["result"]
def main():
if api("getWebhookInfo", {}).get("url"):
raise SystemExit("У бота уже настроен webhook. Используйте нового тестового бота.")
offset = int(STATE.read_text()) if STATE.exists() else 0
while True:
for update in api("getUpdates", {"offset": offset, "timeout": 25,
"allowed_updates": ["message"]}):
msg = update.get("message", {})
chat = msg.get("chat", {})
if chat.get("type") == "private" and "text" in msg:
text = msg["text"].strip()
answer = ("Здравствуйте! Напишите /help." if text == "/start"
else "Это учебный автоответчик. Для решения вопроса обратитесь к оператору.")
api("sendMessage", {"chat_id": chat["id"], "text": answer})
offset = update["update_id"] + 1
temp = STATE.with_suffix(".tmp")
temp.write_text(str(offset))
temp.replace(STATE)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
except Exception as exc:
# Не выводим URL запроса: он содержит токен.
raise SystemExit("Остановка: " + type(exc).__name__) from None
Проверка результата
- После /start должно прийти приветствие. После /help или обычного текста — фиксированный учебный ответ.
- Отправьте фото без подписи: этот пример не обрабатывает вложения.
- Остановите процесс сочетанием Ctrl+C и убедитесь, что новые сообщения больше не получают ответ.
- Сохраните offset.txt рядом с программой при повторном запуске: он отмечает обработанные обновления.
- При ошибке процесс останавливается. Проверьте токен, соединение, наличие другого обработчика и ответ Telegram до повторного запуска.
Код проверен на синтаксис офлайн. Живой бот и отправки в пользовательские диалоги для подготовки статьи не запускались.
Границы учебного решения
Пример использует getUpdates для получения входящих событий и sendMessage для ответа. Его нельзя запускать параллельно с webhook или вторым процессом для того же бота. Он не содержит ИИ, базы подписчиков и очереди рассылки.
Сбой после отправки, но до сохранения offset может привести к повторному ответу при перезапуске. Для рабочего сервиса нужны устойчивый журнал обработки, разбор ошибок и ограничений, мониторинг процесса и передача вопроса оператору. Эти задачи не решаются одним получением токена.
Бесплатный код и стоимость эксплуатации
За этот пример не требуется покупать конструктор. При этом хостинг, поддержка и подключение платной модели могут иметь стоимость. Если нужен ответ пользовательского аккаунта с учётом контекста, рассмотрите ИИ-автоответчик Telecobra. Если нужны уведомления подписчикам бота, используйте отдельную схему рассылки.
Источники и документация
Одна платформа · разные задачи
Подписка Telecobra
Соберите инструменты для работы с Telegram в одном кабинете. Сроки доступа, цены и условия — на странице подписки.
В этой инструкции описана только часть возможностей платформы. Полный список доступен в разделе функций.