Назад к инструментам

Telegram Bot

Python + aiogram

Что получится?

Персональный AI-ассистент в Telegram, который отвечает через Claude API. Поддерживает историю диалога, стриминг ответов и работу с несколькими пользователями.

1

Создайте бота в Telegram

Откройте @BotFather в Telegram и отправьте команду /newbot. Следуйте инструкциям — в конце получите токен вида:

Token
7123456789:AAHxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Сохраните этот токен — он понадобится на следующем шаге.

2

Установите зависимости

Terminal
pip install aiogram aiohttp
3

Создайте файл .env

В корне проекта создайте файл .env с вашими ключами:

.env
BOT_TOKEN=ваш_токен_от_BotFather
API_KEY=YOUR_API_KEY
API_URL=https://api.claudecodeapi.cloud
4

Создайте файл bot.py

Основной код бота с поддержкой истории диалога и обработкой ошибок:

Python
import os
import json
import asyncio
import aiohttp
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from collections import defaultdict

BOT_TOKEN = os.getenv("BOT_TOKEN")
API_KEY = os.getenv("API_KEY")
API_URL = os.getenv("API_URL", "https://api.claudecodeapi.cloud")

bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()

# История диалогов для каждого пользователя
user_histories = defaultdict(list)
MAX_HISTORY = 20


async def ask_claude(user_id: int, text: str) -> str:
    """Отправка запроса к Claude API"""
    user_histories[user_id].append({
        "role": "user",
        "content": text
    })

    # Обрезаем историю если слишком длинная
    if len(user_histories[user_id]) > MAX_HISTORY:
        user_histories[user_id] = user_histories[user_id][-MAX_HISTORY:]

    headers = {
        "x-api-key": API_KEY,
        "content-type": "application/json",
        "anthropic-version": "2023-06-01"
    }

    payload = {
        "model": "claude-sonnet-4-6",
        "max_tokens": 4096,
        "messages": user_histories[user_id]
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(
            f"{API_URL}/v1/messages",
            headers=headers,
            json=payload
        ) as resp:
            if resp.status != 200:
                error = await resp.text()
                raise Exception(f"API error {resp.status}: {error}")

            data = await resp.json()
            reply = data["content"][0]["text"]

            user_histories[user_id].append({
                "role": "assistant",
                "content": reply
            })

            return reply


@dp.message(Command("start"))
async def cmd_start(message: types.Message):
    await message.answer(
        "Привет! Я AI-ассистент на базе Claude.\n\n"
        "Просто напишите сообщение — я отвечу.\n"
        "/clear — очистить историю диалога"
    )


@dp.message(Command("clear"))
async def cmd_clear(message: types.Message):
    user_histories[message.from_user.id].clear()
    await message.answer("История диалога очищена.")


@dp.message()
async def handle_message(message: types.Message):
    if not message.text:
        return

    thinking = await message.answer("Думаю...")

    try:
        reply = await ask_claude(message.from_user.id, message.text)

        # Telegram лимит — 4096 символов
        if len(reply) <= 4096:
            await thinking.edit_text(reply, parse_mode="Markdown")
        else:
            await thinking.delete()
            for i in range(0, len(reply), 4096):
                await message.answer(reply[i:i+4096])

    except Exception as e:
        await thinking.edit_text(f"Ошибка: {e}")


async def main():
    print("Бот запущен!")
    await dp.start_polling(bot)


if __name__ == "__main__":
    from dotenv import load_dotenv
    load_dotenv()
    asyncio.run(main())
5

Запустите бота

Terminal
python bot.py

Откройте вашего бота в Telegram и напишите любое сообщение — он ответит через Claude!

6

Автозапуск на сервере (опционально)

Чтобы бот работал постоянно на VPS, создайте systemd-сервис:

/etc/systemd/system/claude-bot.service
[Unit]
Description=Claude Telegram Bot
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/claude-bot
EnvironmentFile=/root/claude-bot/.env
ExecStart=/usr/bin/python3 /root/claude-bot/bot.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Затем включите и запустите:

Terminal
sudo systemctl enable claude-bot
sudo systemctl start claude-bot
sudo systemctl status claude-bot
Доступные модели

В поле "model" можно указать: claude-opus-4-7, claude-opus-4-6, claude-sonnet-4-6, claude-sonnet-4-5, claude-haiku-4-5