moodlesolver
Асинхронная Python-библиотека и MCP-сервер для автоматизации прохождения тестов на платформе Moodle через браузерный API (camofox).
Возможности
- Авторизация и сессии — вход по логину/паролю, реанимация попытки после обрыва (
resume_attempt) - Навигация по курсам — список курсов, секций, ресурсов, тестов; полная выгрузка курса в JSON; скачивание файлов и картинок
- Прохождение тестов — все типы вопросов: одиночный выбор, множественный (чекбоксы), выпадающие списки, ввод текста, вопросы с картинками и формулами
- JSON-протокол —
JsonAPIи MCP-тулquiz_commandпринимают команды JSON и возвращают состояние вопроса: текст, варианты, что реально отмечено, остаток таймера - OCR без внешних API — локально: tesseract (текст ru/en) и pix2tex (формулы LaTeX); параллельно, результаты в том же JSON
- Картинки в ответе — base64 или HTTP-ссылки (встроенный файл-сервер
serve_dumps) - Коды ошибок — структурированные
E_*вместо тихих падений - MCP-сервер — 27 инструментов для подключения любой LLM-моделью
Установка
pip install moodlesolver
Зависимости для OCR (опционально, но рекомендуются):
apt-get install tesseract-ocr tesseract-ocr-rus
pip install pix2tex
Требуется запущенный camofox-browser (API по умолчанию http://localhost:9377).
Быстрый старт
import asyncio
from moodlesolver import AsyncMoodle, QuizAPI, JsonAPI
async def main():
m = AsyncMoodle(site="https://moodle.example.com")
await m.open_session("login", "password")
from moodlesolver import CtxAPI
ctx = CtxAPI(m)
quizzes = await ctx.get_quizzes(42)
q = QuizAPI(m)
api = JsonAPI(q)
st = await api.handle({"action": "state"})
print(st["question"], st["options"], st["timeleft"])
await api.handle({"action": "select", "answers": [{"index": 2}]})
st = await api.handle({"action": "confirm"})
print(st["question"])
await api.handle({"action": "submit"})
print(await api.handle({"action": "result"}))
asyncio.run(main())
JSON-протокол
Каждый ответ содержит: page, question, question_hash, qtype, options, checked (что реально отмечено на сервере), selects, text_inputs, timeleft, buttons, а также:
question_image_b64/option_images_b64— картинки в base64 (или ссылки приimage_mode="url")ocr— локальное превью каждой картинки:{"formula": "…", "ru": "…", "en": "…"}
Подробная схема: moodlesolver/schema/quiz_protocol.json.
MCP-сервер
{
"mcpServers": {
"moodlesolver": {
"command": "python",
"args": ["-m", "moodlesolver.mcp_server"]
}
}
}
Инструменты: connect, get_courses, get_quizzes, get_course, dump_course, download_images, download_resource, search_courses, resume_attempt, start_attempt, get_state, get_options, get_images, set_answer, set_text, set_select, next_page, submit_all, get_result, quiz_command, see_image и другие.
AIRunner
Полный автопрогон теста одним процессом с решением через внешнюю LLM:
from moodlesolver import AIRunner
r = AIRunner(api_key="...", base_url="https://api.example.com/v1",
model="model-name").bind(q)
await r.loop(quiz_id)
Лицензия
MIT
Metadata
Release files for moodlesolver 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| moodlesolver-2.0.0.tar.gz | 22.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| moodlesolver-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.6 kB
Release files / moodlesolver-2.0.0.tar.gz
| Download URL | moodlesolver-2.0.0.tar.gz |
|---|---|
| Size | 22.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae4e4cb1f4a337c79e32cea52996c9cc3369c6780151b8337f70edf469c0756b
|
|
BLAKE2b-256 checksum How to use checksums |
038ac971f80a9b6105343a86b2b0bafde6b93247587f676caf5a6daa92693cd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / moodlesolver-2.0.0-py3-none-any.whl
| Download URL | moodlesolver-2.0.0-py3-none-any.whl |
|---|---|
| Size | 25.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fd8c99a1b12f475bbf5c27f7d1f02cc5e9dd64c6d30e27995bb1cb107b9b26b9
|
|
BLAKE2b-256 checksum How to use checksums |
082f3a8c25ab60a88c452b72d8599304683f71ffda66e946f6df139e693f815d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|