Я не обладаю природной грамотностью, и мне бывает мучительно стыдно за то, что я пишу. Для приведения текстов в минимально читабельный вид я использую специальные сервисы, которые проверяют орфографию и пунктуацию. И сегодня мы попробуем не просто использовать такой сервис, а написать свой. В этой статье мы напишем и развернем на удаленном сервере Telegram бота, который проверяет грамматику.
Бот будет проверять текст на грамматические ошибки, исправлять их и даст рекомендации по грамотному написанию.
Саму проверку грамматики осуществляет GPT-4o, что нам даст возможность легкой корректировки и адаптации решения к реальным кейсам в случае необходимости.
Функциональность бота проверки орфографии
Бот проверяет и исправляет текст с грамматическими ошибками следующим образом.

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

Успешно! Мы создали бота, сохраним его токен.
Написание бота с использованием библиотеки aiogram 3
Установим локально все необходимые библиотеки. Хотя можно использовать библиотеку telebot, aiogram является более подходящим вариантом для новичков благодаря своей простоте.
pip install aiogram nest_asyncio g4f
Переходим в командную строку и прописываем данную команду выше.
Теперь можно приступить к написанию кода
Создаём файл main.py
Импортируем необходимые библиотеки
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())
Создадим команды бота для проверки грамотности текста
Команда старта
# Обрабатываем команду /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
Деплой через интерфейс
Нажимаем на кнопку создать проект.
Выбираем тип сервиса — приложение, вводим название проекта и выбираем тарифный план.
Нажимаем далее.
Выбираем файлы которые нужно закинуть в проект и перемещаем их в окно загрузки.



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

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

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

Рассмотрим альтернативный способ — деплой через Git
Механика доставки кода через git push amvera master даст возможность обновлять наш проект всего тремя командами в терминале, без необходимости заходить на сайт облачного сервиса, что значительно удобнее.
Создаём папку проекта и помещаем в неё все файлы.
Открываем командную строку и переходим в нашу папку с помощью команды cd "путь к папке". После этого инициализируем репозиторий, выполнив команду.
git init
Далее заходим в Amvera и создаём новый проект.
Теперь мы выбираем метод «Через Git».

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

Потребуется ввести логин и пароль от сервиса Amvera. При этом терминал при вводе пароля не будет его отображать. Это сделано для безопасности.
После чего вводим команды для добавления файлов и создания коммита:
git add .
Не забываем про точку в конце команды, она нужна.
git commit -m "initial commit"
Вместо "initial commit" пишем любое описание изменений, но это на ваш вкус.
Запушим все файлы и сборка начнется автоматически. Для этого вводим команду:
git push amvera master
Если все выполнено корректно, после сборки начнётся процесс запуска бота проверки грамматики. В случае возникновения ошибки рекомендуется изучить Лог сборки и Лог приложения, а также ознакомиться с распространёнными ошибками в документации сервиса.
Результат
Мы написали Telegram бота, который проверяет орфографию и подсказывает, есть ли в тексте ошибки и как их исправить. Для этого мы задействовали API OpenAI, а именно сеть GPT-4o, которая позволяет реализовать решение с высоким потенциалом для изменений и дальнейшего совершенствования приложения.
Комментарии (7)
Pecheneg2015
15.02.2025 16:42На первом же скриншоте бросается в глаза:
1) Построение предложения странное;
Правила,которые стоит вам прочесть
2) Приведены не правила, а лишь указания на то,что было исправлено.
blik13
Как и все остальные люди на Земле с детства не очень умеют читать и писать, но учатся и всё норм.
А ms word недостаточно?
t38c3j
Есть расстройства, например дислексия, и оно ни как не связано с умственными способностями, ты можешь быть гением но писать и говорить с ошибками
ovchinnikovproger Автор
Есть профессиональные сервисы, которые на порядок глубже анализируют текст, чем MS Word. И их много разных. В одних хорошо грамотность проверить, в других стилистику поправить. MS Word только совсем примитивные ошибки подсвечивает. Иначе бы такой сервис как grammarly не стал бы супер успешным.
gfiopl8
А кока кола так супер успешна потому что никто больше не умеет так ловко спрятать килограмм сахара в литре газировки? Или дело в чем то другом.
kirillkosolapov
А это тут причем? Вы просто написали комментарий, в котором сказали, что кроме ворда ничего не нужно и "учитесь грамотными". Это ваше мнение, у других может быть другое, его вам расписали. И да, для написания статей полезно их проверить на грамотность и стилистику в условном "Главреде", сам так делаю