Sin servicios web, sin tokens
Funciona donde los servicios web están desactivados o no se permiten tokens: la persona inicia sesión una vez, con inicio de sesión único y doble factor incluidos, y el driver trabaja con esa sesión. Nunca maneja una contraseña.
Control total como cualquier usuario
Todo lo que la persona puede hacer: leer cursos y contenidos, entregar y responder como estudiante, calificar, crear actividades, llevar foros y el libro de calificaciones como profesor.
Los propios servicios de Moodle
Llama a los servicios AJAX que llaman las páginas de Moodle, con la sesión de la persona, y rellena los formularios de Moodle donde ningún servicio sirve, con la validación de Moodle.
Cualquier idioma, cualquier tema
Lee Moodle por ids, atributos de datos, nombres de campo y URL, nunca por el texto visible. Los resultados son datos simples con fechas ISO.
Al ritmo de una persona
Las acciones de estudiante pueden leer y responder página a página al ritmo de un lector, para que Moodle registre las vistas y la finalización como las de una persona.
Preparado para políticas
Cada función declara los datos que toca: los propios, el contenido del curso, el trabajo de otros, la calificación, la comunicación. Permite solo los tipos en los que confías.
Inicia sesión una vez y trabaja en el sitio
La persona inicia sesión a mano en una ventana del navegador, una sola vez; la sesión queda en un perfil en disco. Cada operación es un método del objeto Moodle, recibe ids y opciones, y devuelve datos simples.
import { createMoodle } from "@falkenslab/moodle-driver";
const moodle = createMoodle({ site: "https://campus.example.org/", profileDir: "/home/me/.moodle-profile", headless: true, downloadBrowser: true });
await moodle.logIn({ timeoutMs: 300_000 }); // a window opens only the first time
const courses = await moodle.listCourses();
const { submissions } = await moodle.assignmentSubmissions(35);
for (const s of submissions.filter((s) => s.needsGrading)) {
await moodle.gradeSubmission(35, s.userId, { grade: "8", feedback: "<p>Good work.</p>" });
}
await moodle.close();