פיתוח פלטפורמת LMS עם תמיכה ב-xAPI (Experience API)

פורמטי למידה סטנדרטיים אינם מצליחים ללכוד פעולות מחוץ לקורס, מה שמגביל את ניתוח הלמידה. אנו בונים פלטפורמות LMS עם תמיכה ב-xAPI ומתכננים Learning Record Stores כדי לאסוף נתונים מכל מקור, מסרטונים ועד סמינרים מקוונים. הצוות שלנו מספק פרויקטים מסוג turnkey, מארכיטקטורת LRS ועד אינטגרציה ותמיכה מתמשכת.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
פיתוח פלטפורמת LMS עם תמיכה ב-xAPI (Experience API)
מורכב
מ- 2 שבועות עד 3 חודשים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113
  • פיתוח אתר עבור SBH Partners
    פיתוח אתר עבור SBH Partners
    1201
  • פיתוח אתר עבור Red Pear
    פיתוח אתר עבור Red Pear
    619

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;

תהליך ולוחות זמנים

  1. ניתוח — לימוד ה-LMS הקיים שלך, זיהוי נקודות אינטגרציה.
  2. עיצוב — פיתוח ארכיטקטורת LRS, מודל נתונים, API.
  3. יישום — כתיבת קוד LRS, הגדרת מחברים.
  4. בדיקות — אימות תקינות הצהרות, ביצועים.
  5. פריסה — פריסה לסביבת ייצור, הגדרת ניטור.

לוחות זמנים: אינטגרציה בסיסית — משבוע אחד, פתרון מותאם אישית — 3–5 ימים נוספים. ההשקעה ב-xAPI מחזירה את עצמה תוך 6–9 חודשים על ידי הפחתת עלויות תחזוקת תוכן SCORM בחצי.

מה כלול בעבודה

  • פיתוח/הקמת LRS
  • אינטגרציית xAPI עם ה-LMS שלך
  • יצירת תוכן xAPI (אם נדרש)
  • תיעוד API וניהול
  • הכשרת צוות על xAPI
  • תמיכה לאחר השקה

הניסיון שלנו

אנו מפתחים פתרונות LMS כבר למעלה מ-5 שנים. במהלך תקופה זו, השלמנו למעלה מ-50 פרויקטים עבור חברות EdTech ואוניברסיטאות תאגידיות. ביניהם: אינטגרציית xAPI למעקב סימולטורים, למידה ניידת עם סנכרון לא מקוון, LRS מותאם אישית עם אנליטיקה בזמן אמת. אנו מבטיחים תמיכה בכל גרסאות xAPI 1.0.3 ופתרון מוסמך.

צור קשר כדי להעריך את הפרויקט שלך. הזמן פיתוח LMS עם תמיכה ב-xAPI — קבל כלי גמיש למדידת חוויית למידה.