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

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


TrustMe

Рекомендуемые сообщения

  • Админы

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

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

Начнём.

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

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

Ссылка на комментарий
  • TrustMe изменил название на Пишем бота на Python с GhatGTP и поднимаем в Docker на VPS
  • TrustMe закрепил тема
  • TrustMe открепил тема

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

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

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

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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

Важная информация

Вы принимаете наши Условия использования, Политика конфиденциальности, Правила. А также использование Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.

Яндекс.Метрика