Як створити Telegram-чатбота з ChatGPT на Python

By obrizan on Травень 9, 2025 · Прочитати цю публікацію іншими мовами: Russian English

blog-chatbot-splash.png

У цьому уроці ви навчитесь створювати Telegram-бота, який відповідає на ваші запитання за допомогою штучного інтелекту — моделі ChatGPT від OpenAI. Ми крок за кроком:

  • зареєструємо бота в Telegram через BotFather;
  • отримаємо API-ключі OpenAI та Telegram;
  • налаштуємо середовище Python з бібліотекою aiogram;
  • реалізуємо бот-сервер, який обробляє повідомлення і надсилає їх до ChatGPT;
  • отримаємо відповіді та надішлемо їх назад у Telegram.

Зміст:

Крок 1. Отримати OpenAI API-ключ

Щоб ваш бот міг звертатись до ChatGPT, вам потрібен API-ключ від OpenAI. Для цього:

  1. Зареєструйтесь або увійдіть у OpenAI Platform
  2. Перейдіть у розділ API Keys та натисніть Create new secret key.
  3. Скопіюйте згенерований ключ — він виглядатиме приблизно так:
sk-proj-abc1234567890...

Обов’язково збережіть цей ключ у безпечному місці. Він більше не відображатиметься повторно.

Детальніше про роботу з OpenAI API читайте в уроці: "Як працювати з ChatGPT за допомогою OpenAI API та Python"

Крок 2. Створити Telegram-бота через BotFather

  1. Відкрити в Телеграмі бота BotFather за посиланням: https://t.me/BotFather
  2. Виконати команду /newbot, та надати наступну інформацію:
    • довільну назву (може містити пробіли);
    • унікальне коротке ім’я, що закінчується на bot (наприклад, my_gpt_bot). 001-register-telegram-bot.png
  3. Після створення бот отримає Telegram API Token, який виглядає так: 1234567890:AdfgqAAWEGaASDqwefeasefadfaweAEFAA.

⚠️ Зверніть увагу:

  1. Скопіюйте токен з цієї сторінки, тому що більше його показано не буде (тому що це секрет). Якщо ви втратите ключ, то можна буде створити новий.
  2. Збережіть цей токен в секретному місці та нікому його не показуйте, тому що маючи цей токен можна виконувати дії з від імені вашого бота.

Крок 3. Створимо код Телеграм-бота з Python

Перейдемо до практики програмування.

import asyncio
import logging
import sys

from aiogram import Bot, Dispatcher, html
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message

# Токен бота можна отримати за посиланням https://t.me/BotFather
# ВАЖЛИВО: вкажіть ваш токен
TOKEN = "1234567890:AdfgqAAWEGaASDqwefeasefadfaweAEFAA"

dp = Dispatcher()


@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
    await message.answer(f"Hello, {html.bold(message.from_user.full_name)}!")


@dp.message()
async def echo_handler(message: Message) -> None:
    try:
        # Надсилаємо копію отриманого повідомлення
        await message.send_copy(chat_id=message.chat.id)
    except TypeError:
        # Але не всі типи підтримують копіювання, тому потрібно це обробити
        await message.answer("Nice try!")


async def main() -> None:
    # Ініціалізуємо екземпляр бота з властивостями за замовчуванням, які будуть передані до всіх API викликів
    bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))

    # Та запускаємо обробку подій
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

ВАЖЛИВО: у рядку TOKEN = "1234567890:AdfgqAAWEGaASDqwefeasefadfaweAEFAA" вкажіть ваш токен від Телеграм бота, який ви отримали на попередньому кроці.

Цей код використовує бібліотеку aiogram — сучасний повністю асинхронний фреймворк для Telegram Bot API, написаний на Python із використанням asyncio та aiohttp. Треба встановити цю бібліотеку в оточення вашого проєкту. Для цього відкриваємо Terminal у PyCharm та пишемо команду:

pip install aiogram

Screenshot 2025-05-09 at 08.09.38.png

Після виконнання цієї команди ми повинні отримати повідомлення Successfully installed aiogram-3.20.0, як показано на зображенні.

Screenshot 2025-05-09 at 08.10.07.png

Запускаємо файл main.py за допомогою кнопки Debug (зелена комаха), або за допомогою інструкції в терміналі: python main.py.

Screenshot 2025-05-09 at 08.15.19.png

В терміналі PyCharm ми отримаємо повідомлення Run polling for bot @obrizan_ai_assistant_bot id=7893124402 - "Obrizan's AI Assistant", як показано на зображені нижче. Це означає, що Телеграм-бот готов приймати повідомлення. (Назва та ідентифікатор бота в вас будуть іншими).

Screenshot 2025-05-09 at 08.17.27.png

Відкрийте вашого бота в Телеграмі, виконайте команду /start. Напишіть будь-яке повідомлення. Ваш бот повинен відповідати вам таким самим повідомленням:

002-verify-bot-integration.png

🚀 Вітаю! Якщо ви бачите відповіді бота, значить інтеграція з ним правильно налаштована.

Крок 4. Інтегруємо бота з ChatGPT за допомогою OpenAI API

На цьому кроці ми підключимо ChatGPT за домогою OpenAI API, щоб на ваші повідомлення відповідав штучний інтелект. Важливо: що для цього кроку треба отримати OpenAI API ключ та встановили бібліотеку OpenAI (pip install openai) як вказано в туторіалі "Як працювати з ChatGPT за допомогою OpenAI API та Python"

Треба модифікувати файл main.py наступним чином:

  • додати створення OpenAI-клієнта (важливо: вкажіть ваш актуальний OpenAI API-ключ):
# ВАЖЛИВО: вкажіть ваш API-ключ
client = AsyncOpenAI(
    api_key="sk-proj-ieqbTxAWEF0GDSgfv4K0m2..._3sROehQhz4afQWAWEASDFt9"
)
  • видалити попередній обробник def echo_handler(message: Message);
  • додати нову функцію def openai_handler(message: Message), у якому ми отримуємо запит від користувача, пересилаємо його до ChatGPT за домогою OpenAI API (метод client.responses.create(...)), а після отримання відповіді від ChatGPT пересилаємо її користувачу у Telegram (метод message.answer(...)):
@dp.message()
async def openai_handler(message: Message) -> None:
    # Пересилаємо запит користувача до ChatGPT
    response = await client.responses.create(
        model="gpt-4o-mini",
        instructions="Answer in a plain text without formatting.",
        input=message.text
    )
    try:
        # Пересилаємо відповідь ChatGPT користувачу
        await message.answer(response.output_text)
    except TypeError:
        await message.answer("Can't process this request!")

Остаточна версія файлу main.py повинна виглядати наступним чином:

import asyncio
import logging
import sys
from os import getenv

from aiogram import Bot, Dispatcher, html
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message

from openai import AsyncOpenAI

# Токен бота можна отримати за посиланням https://t.me/BotFather
# ВАЖЛИВО: вкажіть ваш токен
TOKEN = "1234567890:AdfgqAAWEGaASDqwefeasefadfaweAEFAA"

dp = Dispatcher()

# ВАЖЛИВО: вкажіть ваш API-ключ
client = AsyncOpenAI(
    api_key="sk-proj-ieqbTxAWEF0GDSgfv4K0m2..._3sROehQhz4afQWAWEASDFt9"
)

@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
    await message.answer(f"Hello, {html.bold(message.from_user.full_name)}!")

@dp.message()
async def openai_handler(message: Message) -> None:
    # Пересилаємо запит користувача до ChatGPT
    response = await client.responses.create(
        model="gpt-4o-mini",
        instructions="Answer in a plain text without formatting.",
        input=message.text
    )
    try:
        # Пересилаємо відповідь ChatGPT користувачу
        await message.answer(response.output_text)
    except TypeError:
        await message.answer("Can't process this request!")

async def main() -> None:
    bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Запускаємо файл main.py за допомогою кнопки Debug (зелена комаха), або за допомогою інструкції в терміналі: python main.py. Йдемо перевіряти спілкування з ChatGPT через телеграм-бота:

003-verify-openai-integration.png

👏 Вітаю! Ви створили власного чатбота з функціями штучного інтеллекту!

Корисні посилання

Telegram
Viber
LinkedIn
WhatsApp

Comments

Sign in to leave a comment.

← Back to blog