Featured image of post Как лень и любопытство сэкономили мне десятки часов времени

Как лень и любопытство сэкономили мне десятки часов времени

Телеграм-бот для автоматического выполнения тестов в системе онлайн-обучения

О проекте

Исходный код: github.com/averyanalex/matetech-answers-bot.

Языки программирования: Rust, SQL.

Ключевые библиотеки:

  • tokio (асинхронный рантайм)
  • reqwest (http клиент)
  • sqlx (работа с базой данных)
  • teloxide (фреймворк для создания telegram-ботов)

История создания

В 9 классе я поступил в “олимпиадную” школу. Хорошая школа, в которой почти не было “лишних” предметов и можно было спокойно готовиться к олимпиадам. Многие непрофильные предметы, например биология, были в виде так называемых дистанционных курсов, которые работают примерно так: открываешь сайт системы онлайн-обучения, смотришь 10-15 минутную лекцию, делаешь тест, ища в интернете ответы, и получаешь свои кровные 80-100% правильных ответов.

Пример того, как выглядит тест

Идея и первая версия

Процесс, честно говоря, достаточно скучный. А что нужно делать, когда становится скучно с открытым браузером? Правильно, открывать режим разработчика. Потыкать код элемента и показать друзьям, как ты сделал тест на 200% за 3 секунды. Открыть вкладу “сеть” и посмотреть, что и куда перес ылает сайт, пока делаешь тест. Сделать тест и открыть результаты…

И тут оказывается, что в json-е с результатами теста есть правильные ответы, хотя сам сайт их не показывает! Интересно. Нужно копать дальше. Копируем запрос как curl и запускаем в терминале. Отлично, видим этот самый json. Запускаем новый тест, меняем айди попытки теста в запросе, и… получаем ответ от сервера! С результатами выполнения теста (и правильными ответами) до завершения этого самого теста.

Результат теста с вопросами и списками вариантов ответов и пометкой о том,какой из них верный

Находка, конечно, интересная. Но хочется и одноклассникам с тестами помочь, да и в консоль лишний раз не лазать. Прошу знакомого скинуть мне айди попытки какого-нибудь его теста, подставляю… работает! Убираю у запроса заголовок с авторизацией - получаю ошибку доступа. Получается, гении-разработчики платформы дистанционного обучения сделалали проверку наличия авторизации (как я помню, валидной - случайный токен не подойдёт), а вот на права доступа успешно забили. Ну, молодцы, хоть что-то они сделали.

Дальше дело техники. Написал простенького телеграм-бота на питоне, который, получая айди теста, присылал ответы на все вопросы. Но “палить контору”, что ответы на тесты вот так висят фактически в общем доступе на сайте не хочется, а значит и существование бота. Переделал бота - теперь он, встречая айди попытки для теста, который он ещё не видел, отправляет ответы в публичный телеграм канал. Как будто тесты прорешаны вручную и никаких приколов сайта нет.

Сарафанное радио сделало своё дело - за год аудитория телеграм-канала достигла нескольких сот человек.

Вторая версия

Уязвимость, даже нет, настоящая пробоина была настолько очевидна, что её нашло достаточно много людей. И к следующему году один гениальный странный ученик мат-инфо профиля сделал проект на тему “Уязвимости платформы дистанционных курсов”, как-то так он назывался. Что конкретно в нём было - я не знаю, но часть проблем после этого исправили. Во первых, получать результаты чужого теста стало невозможно, во вторых, для тестовых вопросов (там где надо выбрать вариант ответа) перестали показывать верный ответ в результатах.

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

Осталась лишь проблема с тестовыми вопросами - на них, в отличии от вопросов с вводом текста, ответов не было. Но, внимательно посмотрев на то, что лежит в json-е, я заметил там “балл”. Который, как оказалось, равен нулю, если текущий сохранённый ответ неверный, и >0, если ответ верный. Отлично, значит можно просто перебрать все варианты, пока балл не изменится.

Для этого, конечно, понадобилось научить бота отвечать на вопросы самостоятельно. В целом, это оказалось довольно несложно, и в качестве бонуса мы получили возможность автоматического выполнения теста, а не только получение ответов на него. Круто, теперь “тесты выполняются у всех автоматически, и никто их двже не открывает!” (Отсылка к номеру на выпускном 9 класса. В тот момент это ещё не было правдой).

Бот трудится

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

Попытки закрыть бота

Вскоре нашлись достаточно предпреимчивые школьники, которые решили попробовать на этом заработать. Сделали сами подобного бота (с оплатой за использование) и начали мне писать с предложениями закрыть бота. Хотя нет, кажется, первый раз они это предлагали ещё тогда, когда вместо бота были телеграм каналы, но менее активно.

Предлагали супер выгодные (нет) сделки: сделать моего бота платным и с такой же ценой, как у них, или закрыть своего и получать до 10% с их прибыли. Я, конечно же, отказался, и ради прикола предложил им цену в 300к. Цена их почему-то не устроила. Я думал, что на этом всё, но не тут-то было…

Предлагают сделать бота платным

Они сделали канал, где стали писать, что я, мол, такой-сякой, сделал бота чтобы красть данные от аккаунтов и прохожу им тесты на 0 баллов. Сделали мой фейковый профиль, наскринили переписки якобы со мной, где “я” пишу, что списывать плохо и поэтому прошёл им тесты на нули. Не знаю, кто им поверил, но, кажется, почти никто. Кто именно это был я до сих пор не знаю, да и не особо оно мне надо.

Примеры багов платформы

Правильно сделано 3/4 задания, но в процентах - 125%

Тест не сдан, но сделано всё верно. Оказывается, менять ответы можно послезавершения теста.

Licensed under CC BY-NC-SA 4.0
Создано при помощи Hugo
Тема Stack, дизайн Jimmy