Перейти к содержанию

Пишем бота на Python с GhatGTP и поднимаем в Docker на VPS

Опубликовано
  • Админы

Всем привет, сегодня скину код довольно простого бота на телеграм. 

Беру во внимание, что это не инструкция для новичка, и что куда и откуда - у вас представление есть. Если нет, то пишите в комментариях по теме, подскажу.

Начнём.

Что нам нужно (в это я углубляться не буду):

1. Полученный Токен API от ChatGPT

2. Полученный Токен API от BotFather в Telegram.

3. Установленный PyCharm или VS Code.

 

  1. Я открыл PyCharm и создал новый проект с файлом main.py
    image.png
  2. Открываю внизу сбоку Терминал и ставлю нужные библиотеки: openai и aiogram
    pip install openai aiogram
  3. Создание бота на aiogram и GPT 3.5 Turbo с запоминанием контекста общения.

import openai

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

telegram_token = "API от Botfather"
openai.api_key = "API токен от OpenAI для ChatGPT"

bot = Bot(telegram_token)
dp = Dispatcher(bot)

messages  = [
    {"role": "system", "content": "You are a programming assistant, helping users with Python programming"},
]

def update(messages, role, content):
    messages.append({"role": role, "content": content})
    return messages

@dp.message_handler()
async def send(message : types.Message):
    update(messages, "user", message.text)
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",  # Модель с контекстом
        messages=messages,   # База данных на основе словаря
    )

    await message.answer(response['choices'][0]['message']['content'], parse_mode="markdown")
    
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Данный код - это скрипт телеграм-бота с использованием OpenAI ChatGPT для ответа на сообщения. Разберем некоторые его составные части.

В начале мы импортировали нужные нам библиотеки для работы с OpenAI и aiogram для телеграм-бота. Далее задали переменные токенов для бота.

Затем создаются объекты Bot и Dispatcher, которые используются для обработки сообщений от пользователей и отправки ответов.

Переменная messages содержит список словарей с сообщениями от пользователя и системы.

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

Функция update() используется для добавления новых сообщений в список. Функция send() обрабатывает сообщения от пользователя, добавляет их в messages и отправляет в ChatGPT с использованием модели GPT-3.5 Turbo и базы данных на основе messages. Ответ отправляется обратно пользователю через телеграм-бота.

Блок if name == 'main': используется для запуска бота с использованием функции executor.start_polling().

Запускаем бота на исполнение:

image.png

Проверяем работу бота:

image.png

Класс! Отвечает и в контексте! 

Вот другой вариант кода для бота.

Пробуйте который вам понравится больше:

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

telegram_token = "API от Botfather"
openai.api_key = "API токен от OpenAI для ChatGPT"

bot = Bot(telegram_token)
dp = Dispatcher(bot)

@dp.message_handler()
async def send(message : types.Message):
    response = openai.Completion.create(
    model="gpt-3.5-turbo",
    prompt=message.text,
    temperature=0.9,
    max_tokens=2000,
    top_p=1.0,
    frequency_penalty=0.0,
    presence_penalty=0.6)
    print(message.text)
    await message.answer(response['choices'][0]['text'])

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Вы можете выбирать и другие варианты моделей общения, например: model="text-davinci-003". Но учтите, что эта модель будет дороже по количеству токенов, и качество её ничем не лучше.

Конфигурация Dockerfile для запуска бота

Рядом с файлом main.py создаем файл Dockerfile, где мы будем билдить контейнер с Python для запуска проекта со следующим содержимым:

FROM python:alpine

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

# Установим директорию для работы

WORKDIR /telegram_bot

COPY ./requirements.txt ./

# Устанавливаем зависимости и gunicorn
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r ./requirements.txt

# Копируем файлы и билд
COPY ./ ./

RUN chmod -R 777 ./

Эта конфигурация относится к созданию Docker-контейнера на основе образа Python Alpine, который используется для развертывания Python-приложения, в данном случае, телеграм-бота.

В первой строке указывается базовый образ python:alpine, который используется для создания контейнера. Alpine - это минималистичный дистрибутив Linux, который предлагает меньший размер и более быстрое время запуска контейнеров.

Далее, в строках ENV PYTHONUNBUFFERED=1 и ENV PYTHONDONTWRITEBYTECODE=1 определяются переменные среды. PYTHONUNBUFFERED устанавливает флаг для Python, чтобы он выводил данные в стандартный поток вывода без буферизации, а PYTHONDONTWRITEBYTECODE отключает создание .pyc-файлов, чтобы избежать проблем с обновлением кода в контейнере.

В строке WORKDIR /telegram_bot устанавливается рабочая директория в контейнере, куда будут копироваться все файлы проекта.

Далее, в строках COPY ./requirements.txt ./ и RUN pip install --no-cache-dir -r ./requirements.txt устанавливаются зависимости проекта. Сначала копируется файл requirements.txt в текущую директорию в контейнере, а затем запускается команда pip install, чтобы установить все зависимости проекта.

В строке COPY ./ ./ копируются все файлы проекта в рабочую директорию в контейнере.

Наконец, в строке RUN chmod -R 777 ./ устанавливается разрешение на чтение, запись и выполнение для всех файлов в рабочей директории проекта в контейнере. Это делается для того, чтобы приложение внутри контейнера имело необходимые права для чтения и записи в файлы.

В итоге, данная конфигурация создает Docker-контейнер, в котором установлены все необходимые зависимости для работы телеграм-бота с ChatGPT и задана правильная рабочая директория для запуска приложения.

Конфигурация docker-compose для запуска бота

Для того чтобы нам всё аккуратно развернуть в контейнере на сервере, мы создаем файл docker-compose.yml со следующим содержимым:

version: "3.9"

services:
  telegram-bot:
    container_name: telegram-bot
    working_dir: /telegram_bot
    restart: always
    build:
        context: .
        dockerfile: Dockerfile
    command: sh -c "python main.py"

Создаем файл requirements.txt для выстраивания зависимостей

Для его создания в терминале нашего проекта с ботом введите следующую команду: pip freeze > requirements.txt

image.png

У меня создался файл с таким содержимым:

Цитата
aiogram==2.25.1
aiohttp==3.8.4
aiosignal==1.3.1
async-timeout==4.0.2
attrs==23.1.0
Babel==2.9.1
certifi==2022.12.7
charset-normalizer==3.1.0
colorama==0.4.6
frozenlist==1.3.3
idna==3.4
magic-filter==1.0.9
multidict==6.0.4
openai==0.27.6
pytz==2023.3
requests==2.30.0
tqdm==4.65.0
urllib3==2.0.2
yarl==1.9.2

Переносим все файлы на сервер VPS и разворачиваем контейнер.

Для переноса воспользуемся FileZilla.

А сервер арендуем на Aeza.net

image.png

Загрузили все на сервер:

image.png

Зашли на сервер и первым делом обновили его apt update

image.png

Ставим docker и docker-compose. Я это сделаю своим скриптом:

apt update && apt install curl -y && curl -Of https://raw.githubusercontent.com/DigneZzZ/dwg/main/tools/docker.sh && chmod +x docker.sh && ./docker.sh

image.png

Переходим в папку с ботом: cd telegram_bot:

image.png

Запускаем построение нашего контейнера docker compose build:

image.png

В завершении будет выглядеть всё вот так:

image.png

Теперь поднимаем сам контейнер docker-compose up -d     (-d чтобы все запустилось в фоне)

image.png

Проверяем что наш бот отвечает нам "живя" на сервере:

image.png

 

Готово.

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

Удачи!

Предупреждение: 

Имейте ввиду, что данный код бота предполагает общение с любым из пользователей. Поэтому, не распространяйтесь его именем, или внесите поправки в код, чтобы он общался только с вами!

Основу взял с сайта proghunter

Featured Replies

No posts to show

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу
Яндекс.Метрика

Account

Navigation

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.