Я не обладаю природной грамотностью, и мне бывает мучительно стыдно за то, что я пишу. Для приведения текстов в минимально читабельный вид я использую специальные сервисы, которые проверяют орфографию и пунктуацию. И сегодня мы попробуем не просто использовать такой сервис, а написать свой. В этой статье мы напишем и развернем на удаленном сервере Telegram бота, который проверяет грамматику.

Бот будет проверять текст на грамматические ошибки, исправлять их и даст рекомендации по грамотному написанию.

Саму проверку грамматики осуществляет GPT-4o, что нам даст возможность легкой корректировки и адаптации решения к реальным кейсам в случае необходимости.

Функциональность бота проверки орфографии

Бот проверяет и исправляет текст с грамматическими ошибками следующим образом.

Пример работы бота
Пример работы бота

После написания кода бота проверки орфографии и пунктуации мы развернем его в облаке Amvera, так как оно из коробки поддерживает бесплатное встроенное проксирование до API OpenAI, дает возможность развертывания проектов через загрузку файлов в интерфейсе и начисляет при регистрации бонусный баланс для бесплатных тестов.

Исходный код бота доступен в репозитории GitHub

Приступим.

Создание бота проверки правописания

Зарегистрируем бота в @BotFather и получим токен по данному примеру:

Процесс регистрации бота
Процесс регистрации бота

Успешно! Мы создали бота, сохраним его токен.

Написание бота с использованием библиотеки aiogram 3

Установим локально все необходимые библиотеки. Хотя можно использовать библиотеку telebot, aiogram является более подходящим вариантом для новичков благодаря своей простоте.

pip install aiogram nest_asyncio g4f

Переходим в командную строку и прописываем данную команду выше. 

Теперь можно приступить к написанию кода

  1. Создаём файл main.py

  2. Импортируем необходимые библиотеки

import logging  # Импортируем модуль для ведения логов
import asyncio  # Импортируем модуль для работы с асинхронным кодом
import nest_asyncio  # Импортируем библиотеку, позволяющую использовать asyncio в уже работающих циклах событий
import os  # Импортируем модуль для работы с операционной системой (например, для доступа к переменным окружения)
from g4f.client import Client  # Импортируем класс Client из библиотеки g4f для взаимодействия с API


from aiogram import Bot, Dispatcher, types  # Импортируем основные классы aiogram для работы с Telegram Bot API
from aiogram.filters import CommandStart  # Импортируем фильтр для обработки команды /start
from aiogram.types import Message  # Импортируем класс Message для работы с сообщениями

Чтобы развернуть нашего бота проверки грамотности текста на удаленном сервере, нам понадобится написать файл requirements.txt, куда мы запишем все наши зависимости.

Выглядеть requirements.txt будет  так

nest-asyncio==1.6.0
g4f==0.4.5.3
aiogram==3.17.0

3. Создаём экземпляр бота

# Настраиваем уровень логирования на INFO
logging.basicConfig(level=logging.INFO)


# Создаем экземпляр бота с токеном, который берется из переменных окружения
bot = Bot(token=os.environ["TOKEN"])
# Создаем диспетчер для обработки входящих сообщений
dp = Dispatcher()


# Применяем nest_asyncio для работы с асинхронным кодом в Jupyter или других средах, где уже запущен цикл событий
nest_asyncio.apply()


# Основная асинхронная функция для запуска бота
async def main():
    # Запускаем опрос (polling) для получения обновлений от Telegram
    await dp.start_polling(bot)


# Проверяем, что этот файл запускается как основная программа
if __name__ == "__main__":
    # Запускаем основную функцию в асинхронном режиме
    asyncio.run(main())

Создадим команды бота для проверки грамотности текста

  1. Команда старта

# Обрабатываем команду /start
@dp.message(CommandStart())
async def cmd_start(message: Message):
    # Формируем текст приветствия, используя имя пользователя
    text = f"Привет, @{message.from_user.username}! Напиши мне текст, а я его подправлю."
    # Отправляем ответ пользователю с текстом приветствия в формате Markdown
    await message.answer(text, parse_mode="Markdown")

2. Далее напишем саму функцию, которая отвечает за проверку грамматических и орфографических ошибок

# Обрабатываем все остальные сообщения
@dp.message()
async def handle_message(message: Message):
    # Создаем экземпляр клиента для работы с API g4f
    client = Client()
    # Отправляем запрос на создание завершения чата с моделью gpt-4o
    response = client.chat.completions.create(
        model="gpt-4o",  # Указываем модель, которую будем использовать
        messages=[  # Передаем список сообщений для контекста
            {"role": "user", "content": f"Привет! Проверь мой текст на наличие грамматических ошибок: \"{message.text}\""},
            {"role": "system", "content": "Отвечай таким шаблоном и никак иначе: \"Исправленные слова:\n\nПравила, которые стоит вам прочесть:\", если ты не нашёл ошибки, то скажи об этом."}
        ]
    )
    # Отправляем пользователю ответ от модели
    await message.answer(response.choices[0].message.content) 

По ссылке вы можете найти исходный код бота проверки орфографии и пунктуации.

Подготовка к деплою

Деплой мы произведем в облаке Amvera, которое поддерживает бесплатное встроенное проксирование до API OpenAI, что нужно нам для работы GPT-4o и возможность развертывания через загрузку файлов в интерфейсе (или через git push). Помимо этого, при регистрации будет начислен бонусный баланс в 111 руб., который позволит пользоваться сервисом бесплатно на время тестов.

Создадим конфигурационный файл amvera.yaml

Используем генератор для создания этого файла или зададим поля в разделе Конфигурация.

Задаем параметры конфигурации проекта
Задаем параметры конфигурации проекта

Выбираем окружение Python. Далее вводим версию Python, в нашем случае 3.10. Указываем путь к файлу с зависимостями, requirements.txt 

Вводим имя нашего основного файла, в моём случае main.py

Важно: если вы используете в проекте SQLite, обязательно сохраните ее в постоянное хранилище /data и пропишите в коде к ней пути в виде /data/имя_файла. Это позволит не потерять данные при пересборке.

Вот так выглядит файл конфигурации:

meta:
  environment: python
  toolchain:
    name: pip
    version: 3.10
build:
  requirementsPath: requirements.txt
run:
  scriptName: main.py
  persistenceMount: /data
  containerPort: 80

Деплой через интерфейс

  1. Нажимаем на кнопку создать проект.

  2. Выбираем тип сервиса — приложение, вводим название проекта и выбираем тарифный план.

  3. Нажимаем далее.

  4. Выбираем файлы которые нужно закинуть в проект и перемещаем их в окно загрузки.

В нашем случае бот это Приложение
В нашем случае бот это Приложение
Сервис подсказывает, что лучше первый раз запустить на одном из старших тарифов и потом отскейлить вниз до того, на котором работает. Это нужно, чтобы исключить фактор нехватки ресурсов при первом запуске, так-как вы не знаете, сколько будет потреблять ваше приложение
Сервис подсказывает, что лучше первый раз запустить на одном из старших тарифов и потом отскейлить вниз до того, на котором работает. Это нужно, чтобы исключить фактор нехватки ресурсов при первом запуске, так-как вы не знаете, сколько будет потреблять ваше приложение

Нажимаем на кнопку далее. У нас появится окно загрузки файлов, куда их надо перетянуть. Важно не загружать папку venv. Система сама создаст ее на основе файла с зависимостями.

Здесь ничего не требуется делать, так как мы загрузили файл amvera.yaml, и все настройки происходят автоматически. Просто нажмите «Завершить». Начнется сборка, но она завершится ошибкой, так как мы не добавили токен нашего бота в секреты.

Теперь нам необходимо добавить секрет — токен нашего бота. В методе bot.run() мы указали просто слово TOKEN, но теперь нужно создать переменную как секрет. Для этого переходим на вкладку «Переменные» в проекте и нажимаем «Создать секрет». В поле «Название» вводим переменную TOKEN, а в поле «Значение» — сам токен.

После добавления токена перезапустим проект и получим вот такой статус.

Поздравляю, наш проект запущен.
Поздравляю, наш проект запущен.

Рассмотрим альтернативный способ — деплой через Git

Механика доставки кода через git push amvera master даст возможность обновлять наш проект всего тремя командами в терминале, без необходимости заходить на сайт облачного сервиса, что значительно удобнее.

  1. Создаём папку проекта и помещаем в неё все файлы. 

  2. Открываем командную строку и переходим в нашу папку с помощью команды cd "путь к папке". После этого инициализируем репозиторий, выполнив команду. 

git init 

Далее заходим в Amvera и создаём новый проект.

Теперь мы выбираем метод «Через Git».

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

Потребуется ввести логин и пароль от сервиса Amvera. При этом терминал при вводе пароля не будет его отображать. Это сделано для безопасности.

После чего вводим команды для добавления файлов и создания коммита:

git add .

Не забываем про точку в конце команды, она нужна.

git commit -m "initial commit" 

Вместо "initial commit" пишем любое описание изменений, но это на ваш вкус.

Запушим все файлы и сборка начнется автоматически. Для этого вводим команду:

git push amvera master

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

Результат

Мы написали Telegram бота, который проверяет орфографию и подсказывает, есть ли в тексте ошибки и как их исправить. Для этого мы задействовали API OpenAI, а именно сеть GPT-4o, которая позволяет реализовать решение с высоким потенциалом для изменений и дальнейшего совершенствования приложения.

Исходный код бота в репозитории GitHub

Комментарии (7)


  1. blik13
    15.02.2025 16:42

    Я не обладаю природной грамотностью

    Как и все остальные люди на Земле с детства не очень умеют читать и писать, но учатся и всё норм.

    Для приведения текстов в минимально читабельный вид я использую специальные сервисы, которые проверяют орфографию и пунктуацию

    А ms word недостаточно?


    1. t38c3j
      15.02.2025 16:42

      Как и все остальные люди на Земле с детства не очень умеют читать и писать, но учатся и всё норм

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


    1. ovchinnikovproger Автор
      15.02.2025 16:42

      Есть профессиональные сервисы, которые на порядок глубже анализируют текст, чем MS Word. И их много разных. В одних хорошо грамотность проверить, в других стилистику поправить. MS Word только совсем примитивные ошибки подсвечивает. Иначе бы такой сервис как grammarly не стал бы супер успешным.


      1. gfiopl8
        15.02.2025 16:42

        А кока кола так супер успешна потому что никто больше не умеет так ловко спрятать килограмм сахара в литре газировки? Или дело в чем то другом.


        1. kirillkosolapov
          15.02.2025 16:42

          А это тут причем? Вы просто написали комментарий, в котором сказали, что кроме ворда ничего не нужно и "учитесь грамотными". Это ваше мнение, у других может быть другое, его вам расписали. И да, для написания статей полезно их проверить на грамотность и стилистику в условном "Главреде", сам так делаю


  1. Z55
    15.02.2025 16:42

    Скажите, вы из тех людей, кто пишет код в блокноте?


  1. Pecheneg2015
    15.02.2025 16:42

    На первом же скриншоте бросается в глаза:

    1) Построение предложения странное;

    Правила,которые стоит вам прочесть

    2) Приведены не правила, а лишь указания на то,что было исправлено.