Меня достало переключаться между вкладками. Хочешь спросить у GPT что-то быстрое — открываешь браузер, логинишься (если куки слетели), ждёшь загрузки интерфейса. На телефоне ещё хуже: приложение OpenAI тормозит, история теряется между устройствами.
И тут я подумал: а что если запихнуть GPT прямо в Telegram? Мессенджер всегда открыт, работает на всём, история синхронизируется сама. Оказалось, это реально сделать за один вечер — даже если ты никогда не писал ботов.
Зачем свой бот, если полно готовых
В Telegram куча ботов с GPT. Пробовал штук пять — раздражали одним и тем же. Лимиты на запросы, реклама в ответах, подписки за $10 в месяц. При этом API OpenAI стоит в разы дешевле. Один бот вообще отправлял каждый третий ответ с припиской "поддержи нас донатом".
Свой бот — это контроль. Выбираешь модель сам (GPT-4, Claude, локальная llama), платишь только за использование, настраиваешь промпт под себя. Никакой рекламы.
Что нужно для старта
Список короткий:
- Аккаунт в Telegram (очевидно)
- API-ключ от OpenAI — берёшь на platform.openai.com, там же пополняешь баланс. Для экспериментов хватит $5
- Сервер, где бот будет крутиться — подойдёт любой VPS за $5 в месяц (Hetzner, DigitalOcean) или даже старый Raspberry Pi дома
- Базовое понимание командной строки — если умеешь подключаться по SSH и запускать скрипты, справишься
Я выбрал Python. Библиотека python-telegram-bot простая, а с API OpenAI работать через пакет openai — три строчки кода.
BotFather и рождение бота
BotFather — официальный бот Telegram для создания других ботов. Звучит мета, работает просто.
Открываешь чат с @BotFather, пишешь /newbot. Он спрашивает имя (можно любое), потом username (должен заканчиваться на bot). Я назвал своего @zero_personal_ai_bot. Через 10 секунд получаешь токен — длинную строку типа 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11.
Это ключ доступа к твоему боту, храни его в секрете. Через того же BotFather можно настроить команды (/setcommands), аватарку (/setuserpic), описание. Я прописал команду /reset чтобы очищать контекст разговора.
Код бота
Не буду разбирать каждую строчку — вот основная логика, которую я собрал за пару часов:
import openai
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
openai.api_key = "твой_ключ_OpenAI"
TELEGRAM_TOKEN = "токен_от_BotFather"
# Хранилище контекста для каждого пользователя
user_contexts = {}
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Привет! Я твой личный ИИ-ассистент.")
async def reset(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
user_contexts[user_id] = []
await update.message.reply_text("Контекст очищен.")
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
user_message = update.message.text
# Инициализируем контекст если это первое сообщение
if user_id not in user_contexts:
user_contexts[user_id] = []
# Добавляем сообщение пользователя в историю
user_contexts[user_id].append({"role": "user", "content": user_message})
# Вызываем GPT
response = openai.ChatCompletion.create(
model="gpt-4",
messages=user_contexts[user_id]
)
bot_reply = response['choices'][0]['message']['content']
user_contexts[user_id].append({"role": "assistant", "content": bot_reply})
await update.message.reply_text(bot_reply)
def main():
app = Application.builder().token(TELEGRAM_TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("reset", reset))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()
if __name__ == '__main__':
main()
Это упрощённая версия. У меня ещё обработка ошибок, логирование и ограничение контекста (GPT начинает тупить если скормить ему 50 сообщений подряд). Но суть именно такая: получаешь сообщение от пользователя, отправляешь в OpenAI вместе с историей, возвращаешь ответ.
Где запускать чтобы не потерять
Первый раз запустил бота на своём ноутбуке командой python bot.py — работало, пока не закрыл крышку. Потом поднял VPS на Hetzner за €4 в месяц (самый дешёвый тариф), поставил Ubuntu, накатил Python и зависимости через pip.
Чтобы бот не падал при отключении SSH, запускаю через screen или tmux. Можно настроить systemd-сервис — тогда переживёт даже перезагрузку сервера. Но я пока обхожусь screen'ом: запустил, отключился, бот работает.
Ключи API не вшивай в код. Храню их в отдельном файле .env и добавляю его в .gitignore. Один раз случайно залил токен на GitHub — через 10 минут бота взломали и спамили от моего имени. Пришлось перевыпускать токен через BotFather.
Что я накрутил сверху
После первой недели стало понятно чего не хватает.
System prompt — инструкция для GPT, как себя вести. Я добавил в начало контекста сообщение {"role": "system", "content": "Ты краткий и конкретный ассистент..."}. Теперь бот не пишет простыни на три экрана.
Ограничение контекста — GPT помнит всю беседу, но после 20 сообщений начинает терять нить. Храню только последние 10 пар "вопрос-ответ". Если нужен полный контекст — не использую /reset.
Режим "только я" — в коде добавил проверку if update.effective_user.id != МОЙ_TELEGRAM_ID: return. Теперь даже если кто-то узнает username бота, не сможет им пользоваться. Опционально можно сделать белый список для друзей.
Голосовые сообщения — Telegram API умеет отдавать голосовые в формате .ogg. Добавил обработчик, который скачивает файл, прогоняет через Whisper API (тот же OpenAI, но для распознавания речи) и скармливает текст в GPT. Получился голосовой ассистент за 30 строчек кода.
Сколько денег уходит реально
OpenAI считает по токенам. GPT-4 дорогой: $0.03 за 1000 токенов на вход и $0.06 на выход. Примерно 750 слов равно 1000 токенов.
Веду статистику месяц. В среднем отправляю боту 40-50 сообщений в день — спрашиваю про код, прошу переформулировать текст, уточняю факты. Контекст не храню больше 10 сообщений. Выходит около $8-12 в месяц.
Дешевле подписки на ChatGPT Plus ($20), и у меня нет ограничения на количество сообщений. Если жалко денег — переключись на gpt-3.5-turbo. Он в 10 раз дешевле, но для 80% задач достаточен. Или вообще разверни локальную модель типа Llama через Ollama — тогда платишь только за сервер.
Что бесит
Бот не умеет в мультимодальность. GPT-4 Vision может смотреть на картинки, но я пока не прикрутил — Telegram API отдаёт фото отдельным объектом, нужно дописывать обработчик. В планах.
История не переживает перезапуск бота. user_contexts живёт в оперативке. Если перезапустить скрипт, весь контекст сгорает. Надо сохранять в SQLite или Redis. Пока костыль: просто не перезапускаю бота без нужды.
Нет стриминга ответов — GPT генерирует весь текст, потом бот отправляет его целиком. Если ответ длинный, ждёшь 10-15 секунд глядя в пустой экран. Telegram API поддерживает редактирование сообщений, можно сделать "печатающийся" эффект, но мне пока лень.
Стоило ли
Однозначно да. Пользуюсь этим ботом каждый день — быстрее чем открывать ChatGPT, удобнее чем голосовой помощник в телефоне. История всегда под рукой, контекст переключается за секунду через /reset.
Главное — я понял как устроены боты в Telegram и API современных LLM. Раньше это казалось магией, а на деле весь код уместился в 150 строчек. Теперь думаю прикрутить туда доступ к календарю и заметкам — чтобы бот мог сам ставить задачи и напоминания.
Если ты хоть раз думал "неплохо бы свой GPT, но под себя" — попробуй. За вечер соберёшь рабочий прототип, дальше будешь допиливать под свои задачи. У меня получилось, и я не backend-разработчик.
