Данная статья написана по видео-ролику «ChatGPT OpenAI в Telegram на Python / Пишем Telegram-бота ChatGPT на Питоне» c небольшим дополнением — добавил в код проверку по id в телеграме.
Как ограничить доступ к боту телеграм (aiogram) — об этом читайте в конце данной статьи.

Если вы не сталкивались с питоном, то необходимо установить его. О том, как это сделать, подробно описано здесь.

Теперь приступим к созданию бота ChatGPT в Telegram.

Установка библиотек для телеграм-бота:

Первое, что нам нужно сделать — это установить библиотеки aiogram и OpenAI:

  • Чтобы установить aiogram, введите в терминале:
pip install aiogram
  • Чтобы установить OpenAI, введите в терминале:
pip install openai

Регистрация в OpenAI:

Чтобы добавить функционал ChatGPT в Telegram, для начала, необходимо зарегистрироваться здесь — https://platform.openai.com, о том как зарегистрировать аккаунт в ChatGPT на территории РФ, снято уже очень много видео.
Далее переходим в раздел API Keys и нажимаем кнопку «Create new secret key», копируем получившийся ключ.

Как создать бота в телеграм:

Создаем бота в телеграме — https://t.me/BotFather :

  • Переходим по ссылке выше и запускаем бота, нажимаем кнопку «Меню»
  • Вводим любое имя для нашего бота, отправляем сообщение
  • Вводим логин нашего бота, по которому мы сможем его найти. Важно: login должен оканчиваться на bot (Пример правильного логина: illarion_bot), а так же логин должен быть уникальным
  • Копируем токен API нашего бота (начинается после слов — «Use this token to access the HTTP API:»)

Пишем код телеграм-бота на Python:

Создаем любой файл с расширением .py , а в сам файл вставляем следующий код:

import openai
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor


token = 'TELEGRAM_BOT_TOKEN'
openai.api_key = 'OPENAI_KEY'

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

@dp.message_handler()
async def send(message: types.Message):
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=message.text,
        temperature=0.9,
        max_tokens=4000,
        top_p=1.0,
        frequency_penalty=0.0,
        presence_penalty=0.6,
        stop=[" Human:", " AI:"]
    )

    await message.answer(response['choices'][0]['text'])

executor.start_polling(dp, skip_updates=True)

Замените токены Телеграм и OpenAI в коде на те, что мы получили выше.
Прописываются они здесь (строки кода номер 7 и 8):

token = 'TELEGRAM_BOT_TOKEN'
openai.api_key = 'OPENAI_KEY'

В данном коде используется языковая модель text-davinci-003, т.е. — Чат. Чтобы использовать другие модули — перейдите в раздел «Examples«, выберите необходимый модуль и замените фрагмент кода:

response = openai.Completion.create(
        model="text-davinci-003",
        prompt=message.text,
        temperature=0.9,
        max_tokens=4000,
        top_p=1.0,
        frequency_penalty=0.0,
        presence_penalty=0.6,
        stop=[" Human:", " AI:"]
    )

Замените данный фрагмент на аналогичный код из описания нужного модуля (начинается с «response =» и заканчивается «)»

Все это было пересказом видео одного программиста, бот мы создали и теперь то, зачем я пишу данную статью и то, что может помочь многим начинающим разработчикам на python.

Если вы запускаете код на GNU/Linux дистрибутивах, то на вторую строчку, после фрагмента import openai вставьте следующую строку:

import os

Как ограничить доступ к боту телеграм (aiogram)?

Находим строку 12, (пустая строка после dp = Dispatcher(bot), и в пустой строке вставляем следующий код:

users = {tg_id1,tg_id2}

accepted_users = lambda message: message.from_user.id not in users


@dp.message_handler(accepted_users, content_types=['any'])
async def handle_unwanted_users(message: types.Message):
    await message.answer("Извините, бот работает только для одобренных пользователей. Если вы хотите написать такой же бот - перейдите по ссылке: https://nikonorow.ru/pishem-telegram-bota-chatgpt-na-python/")
    return

users = {tg_id1,tg_id2} — в фигурных скобках, через запятую, перечисляется id пользователей телеграма (вводить только числа), которые допущены к данному боту.
Узнать свой id в телеграме можно тут. Подставляем свои id, заменяем текст в скобках после message.answer (если это необходимо, так же не забывайте обернуть свой текст в кавычки «»)

Как сделать проверку по количеству введенных символов пользователя в aiogram?

Если количество введенных символов превышает 2000 — выводится ошибка с пояснением. Код следующий:

max_symbols = lambda message: int(len(message.text)) > 2000

@dp.message_handler(max_symbols, content_types=['any'])
async def handle_unwanted_users(message: types.Message):
    await message.answer("Ошибка! Введенное количество символов превышает максимальное значение в 2000" + "\n\nКоличество введенных символов: " + str(len(message.text)) + "\n\nСократите Ваш запрос")
    return

Если вы не делали проверку по id телеграм, то код вставляем на строку номер 12, (пустая строка после dp = Dispatcher(bot), и в пустой строке вставляем данный код.
Если вы сделали проверку по id, то вставляем после через строку после кода ограничения

Число 2000 в проверке — приблизительное. Читать подробнее об ограничениях OpenAI API >

Готово! ChatGPT в Telegram работает. Смотрите так же другие статьи, правда они в основном касаются веб-разработки.

Дата создания статьи: 09.02.2023

Update от 20.12.2023:

Если у вас возникает ошибка «ImportError: cannot import name ‘Dispatcher’ …», то попробуйте установить прошлую версию aiogram, например, 2.25.1.

Для этого удалите установленную версию:

pip uninstall aiogram

И установите нужную нам версию:

pip install aiogram==2.25.1

Это должно помочь решить данную проблему.

Поддержи автора

Надеюсь, эта статья была для вас полезной и интересной. Если вы хотите, чтобы я создавал больше контента и делал это чаще, вы можете поддержать меня донатом. Благодарю вас за ваш вклад в творческий процесс!

Т-Банк (Тинькофф): 2200700867913161
Ozon Bank: 2204240107102131
Boosty: https://boosty.to/woronokin/donate