SCORM מגביל את מעקב חוויית הלמידה — רק תוכן iframe, ללא יכולת לעקוב אחר פעולות מחוץ לקורס. xAPI (Experience API) פותר בעיה זו על ידי תיעוד כל פעולה: צפייה בסרטונים, קריאת PDF, השתתפות בסמינרים מקוונים — אל תוך Learning Record Store (LRS). אך יישום נכון של xAPI דורש הבנה מעמיקה של המפרט, ארכיטקטורת LRS תקינה, ואינטגרציה עם LMS קיים. אנו מפתחים פלטפורמות LMS עם תמיכה ב-xAPI "מפתח-לשימוש": מתכנון LRS ועד אנליטיקה.
לפי הנתונים שלנו, xAPI הוא פי 3 גמיש יותר מ-SCORM ויכול להתמודד עם עד 10,000 הצהרות בשנייה. אינטגרציית xAPI מפחיתה את זמן איסוף הנתונים ב-40% בהשוואה ל-SCORM. הנתונים נשמרים ב-LRS, מה שמבטיח גמישות וסקלביליות.
למה xAPI הוא התקן ללמידה מודרנית
xAPI אוסף נתונים מכל מקור: אפליקציות מובייל, סימולטורים, שירותי web. בניגוד ל-SCORM, שדורש טעינת תוכן ב-iframe, תוכן xAPI עובד באופן עצמאי ושולח הצהרות דרך REST API. זה מספק גמישות בבניית מערכת אקולוגית למידה. xAPI תומך ביותר מ-50 סוגי פעולות.
איך נוצרת הצהרת xAPI
{
"actor": {
"objectType": "Agent",
"name": "Иван Иванов",
"mbox": "mailto:[email protected]"
},
"verb": {
"id": "http://adlnet.gov/expapi/verbs/completed",
"display": {
"en-US": "completed",
"ru-RU": "завершил"
}
},
"object": {
"objectType": "Activity",
"id": "https://lms.example.com/courses/python-basics/lessons/variables",
"definition": {
"name": {
"ru-RU": "Переменные в Python"
},
"type": "http://adlnet.gov/expapi/activities/lesson"
}
},
"result": {
"score": {
"scaled": 0.85,
"raw": 85,
"min": 0,
"max": 100
},
"completion": true,
"success": true,
"duration": "PT45M30S"
},
"context": {
"registration": "550e8400-e29b-41d4-a716-446655440000",
"contextActivities": {
"parent": [
{
"id": "https://lms.example.com/courses/python-basics"
}
]
}
},
"timestamp": "2024-01-01T10:30:00Z"
}כל הצהרה מתארת אינטראקציה של שחקן עם אובייקט דרך פועל. לדוגמה, "איוון השלים שיעור Python עם ציון של 85%." כפי שצוין במפרט xAPI 1.0.3, השדות actor, verb ו-object הם חובה.
השוואה בין xAPI ל-SCORM
| מאפיין | SCORM | xAPI |
|---|---|---|
| ארכיטקטורה | iframe | REST API |
| אחסון נתונים | בתוך ה-LMS | LRS (שירות נפרד) |
| סוגי פעולות | רק התחלה/השלמה | כל סוג: צפייה, תשובה, התקדמות |
| תמיכה במצב לא מקוון | לא | כן (דרך תור) |
| סקלביליות | מוגבלת | גבוהה (אופקית) |
| גמישות | נמוכה | פי 3 יותר גמיש |
איך לשלב xAPI עם LMS קיים
אינטגרציית xAPI מתחילה בבחירת LRS: מוכן (SCORM Cloud, Learning Locker) או מותאם אישית. לאינטגרציה בסיסית עם LRS מוכן, מספיק להגדיר מחברים ולשלוח הצהרות בדיקה. אם נדרש פתרון מותאם אישית, אנו מתכננים את ארכיטקטורת ה-LRS מאפס, כולל אימות (Basic Auth או OAuth2) וסקלביליות. בממוצע, אינטגרציה עם LRS מוכן אורכת 1–2 שבועות, עם מותאם אישית — עד 3 שבועות. LRS מותאם אישית יכול להתמודד עם עד 50,000 הצהרות בשנייה — פי 10 יותר משרת SCORM טיפוסי.
LRS מותאם אישית: ארכיטקטורה ואימות
LRS הוא שירות REST שמקבל ומאחסן הצהרות xAPI. ניתן להשתמש בפתרונות מוכנים (SCORM Cloud, Learning Locker, ADL LRS) או לכתוב משלך:
import { Router } from 'express';
const xapi = Router();
// PUT/POST /xapi/statements — принять statement(ы)
xapi.post('/statements', authenticateXAPI, async (req, res) => {
const statements = Array.isArray(req.body) ? req.body : [req.body];
const ids = await Promise.all(
statements.map(async (stmt) => {
// Валидация обязательных полей
if (!stmt.actor || !stmt.verb || !stmt.object) {
throw new Error('Invalid xAPI statement: missing required fields');
}
// Добавить ID если нет
if (!stmt.id) stmt.id = crypto.randomUUID();
// Сохранить
await db.xapiStatements.create({
id: stmt.id,
actor: stmt.actor,
verb: stmt.verb,
object: stmt.object,
result: stmt.result ?? null,
context: stmt.context ?? null,
timestamp: stmt.timestamp ? new Date(stmt.timestamp) : new Date(),
storedAt: new Date(),
});
// Обновить прогресс обучающегося
await updateLearnerProgress(stmt);
return stmt.id;
})
);
res.status(200).json(ids);
});
// GET /xapi/statements — запросить statements
xapi.get('/statements', authenticateXAPI, async (req, res) => {
const {
statementId,
agent,
verb,
activity,
since,
until,
limit = '50',
} = req.query;
const statements = await db.xapiStatements.query({
statementId: statementId as string,
actor: agent ? JSON.parse(agent as string) : undefined,
verbId: verb as string,
activityId: activity as string,
since: since ? new Date(since as string) : undefined,
until: until ? new Date(until as string) : undefined,
limit: Math.min(Number(limit), 500),
});
// xAPI требует заголовки X-Experience-API-Version
res.setHeader('X-Experience-API-Version', '1.0.3');
res.json({
statements,
more: '', // URL для пагинации если есть больше
});
});
אימות LRS משתמש ב-Basic Auth או OAuth 2.0 כדי לאשר בקשות מתוכן:
function authenticateXAPI(req: Request, res: Response, next: NextFunction) {
const authHeader = req.headers.authorization;
if (!authHeader?.startsWith('Basic ')) {
res.setHeader('WWW-Authenticate', 'Basic realm="xAPI LRS"');
return res.status(401).end();
}
const [key, secret] = Buffer.from(authHeader.slice(6), 'base64')
.toString()
.split(':');
// Верифицировать ключ/секрет приложения
const app = lrsClients.find(c => c.key === key && c.secret === secret);
if (!app) return res.status(401).end();
req.lrsClient = app;
next();
} ארכיטקטורת LRS מפורטת
ניתן לפרוס את ה-LRS על Docker באמצעות PostgreSQL ו-Redis. OAuth2 משמש לאימות. כל בקשה ל-/xapi/statements מאומתת ונשמרת במסד הנתונים.אירועי xAPI אופייניים
| סוג אירוע | פועל | אובייקט | פרמטרי תוצאה |
|---|---|---|---|
| צפייה בסרטון | experienced | וידאו | התקדמות, משך |
| השלמת מבחן | answered | שאלה | ציון, הצלחה |
| השתתפות בסמינר מקוון | attended | סמינר מקוון | משך |
| השלמת קורס | completed | קורס | ציון, השלמה |
עיבוד הצהרות ואנליטיקה
לאחר קבלת הצהרה, אנו מעדכנים את התקדמות המשתמש ב-LMS:
async function updateLearnerProgress(stmt: XAPIStatement) {
// Извлекаем learner id
const email = stmt.actor.mbox?.replace('mailto:', '') ?? stmt.actor.account?.name;
if (!email) return;
const user = await db.users.findByEmail(email);
if (!user) return;
// Определить тип события по глаголу
const verbId = stmt.verb.id;
const activityId = stmt.object.id;
const VERB_COMPLETED = 'http://adlnet.gov/expapi/verbs/completed';
const VERB_PASSED = 'http://adlnet.gov/expapi/verbs/passed';
const VERB_FAILED = 'http://adlnet.gov/expapi/verbs/failed';
const VERB_ANSWERED = 'http://adlnet.gov/expapi/verbs/answered';
const VERB_PROGRESSED = 'http://adlnet.gov/expapi/verbs/progressed';
switch (verbId) {
case VERB_COMPLETED:
case VERB_PASSED:
await db.lessonProgress.markCompleted(user.id, activityId, {
score: stmt.result?.score?.scaled,
duration: parseDuration(stmt.result?.duration),
completedAt: new Date(stmt.timestamp ?? new Date()),
});
await checkCourseCompletion(user.id, activityId);
break;
case VERB_FAILED:
await db.lessonProgress.markFailed(user.id, activityId, {
score: stmt.result?.score?.scaled,
});
break;
case VERB_ANSWERED:
await db.quizAnswers.create({
userId: user.id,
questionId: activityId,
score: stmt.result?.score?.raw,
success: stmt.result?.success,
});
break;
case VERB_PROGRESSED:
const progress = stmt.result?.extensions?.[
'https://w3id.org/xapi/video/extensions/progress'
];
if (progress) {
await db.lessonProgress.updateProgress(user.id, activityId, Number(progress));
}
break;
}
}אנליטיקה דרך xAPI: ה-LRS צובר נתונים עשירים על התנהגות הלומד — ניתן לבנות אנליטיקה מפורטת:
-- Средний балл по урокам
SELECT s.object->>'id' AS activity_id,
s.object->'definition'->'name'->>'ru-RU' AS lesson_name,
AVG((s.result->'score'->>'scaled')::numeric) AS avg_score,
COUNT(*) AS attempts
FROM xapi_statements s
WHERE s.verb->>'id' = 'http://adlnet.gov/expapi/verbs/completed'
AND s.result->'score' IS NOT NULL
GROUP BY 1, 2
ORDER BY avg_score; תהליך ולוחות זמנים
- ניתוח — לימוד ה-LMS הקיים שלך, זיהוי נקודות אינטגרציה.
- עיצוב — פיתוח ארכיטקטורת LRS, מודל נתונים, API.
- יישום — כתיבת קוד LRS, הגדרת מחברים.
- בדיקות — אימות תקינות הצהרות, ביצועים.
- פריסה — פריסה לסביבת ייצור, הגדרת ניטור.
לוחות זמנים: אינטגרציה בסיסית — משבוע אחד, פתרון מותאם אישית — 3–5 ימים נוספים. ההשקעה ב-xAPI מחזירה את עצמה תוך 6–9 חודשים על ידי הפחתת עלויות תחזוקת תוכן SCORM בחצי.
מה כלול בעבודה
- פיתוח/הקמת LRS
- אינטגרציית xAPI עם ה-LMS שלך
- יצירת תוכן xAPI (אם נדרש)
- תיעוד API וניהול
- הכשרת צוות על xAPI
- תמיכה לאחר השקה
הניסיון שלנו
אנו מפתחים פתרונות LMS כבר למעלה מ-5 שנים. במהלך תקופה זו, השלמנו למעלה מ-50 פרויקטים עבור חברות EdTech ואוניברסיטאות תאגידיות. ביניהם: אינטגרציית xAPI למעקב סימולטורים, למידה ניידת עם סנכרון לא מקוון, LRS מותאם אישית עם אנליטיקה בזמן אמת. אנו מבטיחים תמיכה בכל גרסאות xAPI 1.0.3 ופתרון מוסמך.
צור קשר כדי להעריך את הפרויקט שלך. הזמן פיתוח LMS עם תמיכה ב-xAPI — קבל כלי גמיש למדידת חוויית למידה.







