Fara beint í efni
Samþættingar fyrir forritara

Tengdu Puzzel við þitt eigið kerfi

Puzzel getur sent niðurstöðu leikmanns beint til annars kerfis — stigafjöldann, hversu langt hann komst, hverju hann svaraði — án þess að það kerfi þurfi að vera fullgilt LMS-kerfi. Þessi síða tekur saman allar leiðirnar sem eru í boði: hvað fer út, hvenær það fer út og það minnsta sem þú þarft að smíða til að taka á móti því.

Niðurstöður fara út um
Webhook, eða skilaboð á yfirsíðuna sem hýsir verkefnið
Síðan þín getur
Skráð leikmanninn inn og endurstillt verkefnið
Virkjað
Fyrir hvert verkefni, undir Forritari í ritlinum
Fylgir með
Greiddri áskriftarleið — þessar stillingar eru óvirkar á ókeypis aðgangi

Hvaða leið hentar þér?

Þrennt getur farið út úr verkefni og eitt getur komið inn. Hvað hentar þér fer eftir einni spurningu: situr leikmaðurinn inni í síðunni þinni, eða einhvers staðar allt annars staðar?

Út úr Puzzel
Inn í Puzzel

Webhook fyrir niðurstöður

Kveiktu á "Senda niðurstöður á webhook" í ritlinum og gefðu upp vefslóð. Upp frá því sendir vafri leikmannsins alla niðurstöðuna sem JSON með POST á þá vefslóð, í hvert sinn sem framvindan er vistuð.

Að setja þetta upp
  1. 1 Opnaðu verkefnið í ritlinum og farðu í flipann Forritari.
  2. 2 Kveiktu á "Senda niðurstöður á webhook" og límdu endapunktinn þinn inn í reitinn fyrir neðan. Þetta verður að vera heil vefslóð — ber lén er hafnað — og hún verður að vera https, því vafrinn lokar á venjulega http-fyrirspurn frá síðu sem er afhent yfir https.
  3. 3 Spilaðu verkefnið sjálf/ur einu sinni. Fyrsta POST-fyrirspurnin berst um leið og þú svarar einhverju.
Móttakandi frá upphafi til enda
import express from 'express';

const app = express();

// The POST is made by the player's browser, so the browser asks permission
// first. Answer the preflight and the real request can land.
app.use((req, res, next) => {
  res.set('Access-Control-Allow-Origin', 'https://puzzel.org');
  res.set('Access-Control-Allow-Headers', 'Content-Type');
  if (req.method === 'OPTIONS') return res.sendStatus(204);
  next();
});

app.post('/puzzel/results', express.json(), async (req, res) => {
  const result = req.body;

  // One run posts several times as it goes. Key on the pair, not on an
  // insert: each call carries the whole state, so the newest simply wins.
  await db.results.upsert(
    { playerUid: result.playerUid, activityKey: result.activityKey },
    result
  );

  // Only act on the finish once.
  if (result.progress >= 100 || result.hasAlternateCompletion) {
    await markCourseStepComplete(result);
  }

  res.sendStatus(200);
});
Það sendist á meðan þú spilar, ekki bara í lokin

Niðurstaða fer út í hvert sinn sem færslan er vistuð: eftir hlé í innslætti, þegar spjaldi er komið fyrir, þegar klukkan stöðvast, og enn og aftur þegar verkefninu er lokið. Löng krossgáta gerir nokkra tugi kalla, ekki eitt — skrifaðu því höndlarann þinn sem upsert með playerUid og activityKey sem lykil, frekar en sem innsetningu (insert). Hvert kall ber allt ástandið, svo það nýjasta leysir alltaf það síðasta af hólmi, og kall sem týnist er bætt upp af því næsta.

Að greina lok frá vistun

progress er hlutfall: 100 þýðir að verkefninu er lokið. Fáeinar tegundir geta lokið án þess að ná því — Quiz sem er svarað til enda, leystur lausnarreitur — og þær bera þess í stað hasAlternateCompletion. Líttu á hvort tveggja sem lokið.

Það er sent af vafra leikmannsins

POST-fyrirspurnin kemur frá flipanum sem verkefnið er spilað í, ekki frá vefþjóni Puzzel. Flestir endapunktar sem eru byggðir til að taka við webhook-um samþykkja þetta nú þegar. Ef þinn sér aldrei fyrirspurn er þetta ástæðan: vafrinn spyr fyrst um leyfi, svo svaraðu OPTIONS-forkönnuninni með Access-Control-Allow-Origin-haus, og þá fylgir raunveruleg POST-fyrirspurn á eftir.

Líttu á gögnin sem fullyrðingu, ekki sönnun

Fyrirspurnin er ekki undirrituð og hún kemur frá vafra sem þú stjórnar ekki, svo hver sem skoðar síðuna getur sent þér eina líka. Það er í fínu lagi fyrir framvinduslá eða stjórnborð. Fyrir allt sem þú myndir ekki leyfa nemanda að stilla sjálfum — einkunn sem gildir, skírteini, greiðslu — berðu það saman við niðurstöðurnar í þínu eigin Puzzel-stjórnborði, eða láttu LMS-einkunnatengingarnar bera stigin í staðinn.

Niðurstöður á yfirsíðuna

Ef þú fellir verkefnið inn geturðu fengið sama JSON-ið sent á þína eigin síðu í stað vefþjóns. Kveiktu á "Senda niðurstöður á yfirsíðuna" og hlustaðu eftir skilaboðunum. Ekkert fer út úr vafranum, svo það þarf hvorki að smíða endapunkt né hugsa um CORS.

index.html
<iframe
  src="https://puzzel.org/en/quiz/embed?p=-Nq8sample_activity_key"
  width="100%"
  height="700"
  frameborder="0"
  allowfullscreen
></iframe>

<script>
  window.addEventListener('message', (event) => {
    if (event.origin !== 'https://puzzel.org') return;

    const result = event.data;
    if (!result || !result.activityKey) return;

    // Same shape the webhook posts, same advice: it arrives repeatedly.
    saveProgress(result);
  });
</script>
Athugaðu hvaðan skilaboðin komu

Hlustarinn þinn heyrir öll skilaboð sem eru send á síðuna, líka frá öðrum römmum og vafraviðbótum. Berðu event.origin saman við https://puzzel.org áður en þú treystir innihaldinu.

Sömu gögnin, sama tímasetningin

Þetta er tvíburi webhook-sins: sömu reitirnir, sendir á sömu augnablikum. Allt sem stendur undir "Hvað niðurstaða inniheldur" á líka við hér.

Lokamerki

Minnsta leiðin, fyrir þegar niðurstaðan sjálf kemur þér ekkert við: kveiktu á "Senda lokamerki" og síðan þín fær ein skilaboð um leið og leikmaðurinn lýkur verkefninu.

index.html
window.addEventListener('message', (event) => {
  if (event.origin !== 'https://puzzel.org') return;
  if (event.data?.completed !== true) return;

  // { completed: true, activityKey: '-Nq8sample_activity_key' }
  unlockNextLesson(event.data.activityKey);
});
Hvað berst
{
  "completed": true,
  "activityKey": "-Nq8sample_activity_key"
}
Niðurstaðan er þegar vistuð þegar hún berst

Merkið er vísvitandi sent eftir að lokavistunin hefur átt sér stað, svo síða sem bregst við með því að lesa niðurstöðuna til baka finnur hana þar.

Aðeins innan í iframe

Báðar skilaboðaleiðirnar senda á síðuna sem fellir verkefnið inn. Sé verkefnið opnað í sínum eigin flipa er enginn til að segja frá, svo ekkert er sent.

Hvað niðurstaða inniheldur

Eitt snið, sama hvaða leið ber það. Svör leikmannsins eru lykluð með auðkennum verkefnisins sjálfs, svo sömu lyklarnir koma fram í correctUids.

ReiturTegundHvað hann gerir
activityKey
alltaf
string
stringVerkefnið sem niðurstaðan tilheyrir. Sami lykill og þú sérð í vefslóð verkefnisins sjálfs, á eftir ?p=.
playerUid
alltaf
string
stringHver spilaði, sem nafnlaust auðkenni. Stöðugt fyrir þennan leikmann á þessu tæki, svo það er það sem þú lyklar niðurstöður eftir — það er hvorki netfang né Puzzel-aðgangur.
player
stundum
object
objectSkráningarreitirnir sem verkefnið biður um, eins og þú stilltir þá: name, email, class, student_id og svo framvegis. Vantar þar til leikmaðurinn hefur skráð sig, og vantar algjörlega á verkefni sem biður um ekkert.
progress
alltaf
number
numberHversu langt er komið, sem hlutfall. 100 þýðir að lokið er.
timePassed
alltaf
number
numberTími sem fór í verkefnið, í millísekúndum.
lastPlayedAt
alltaf
number
numberHvenær þessi niðurstaða var vistuð, sem Unix-tímastimpill í millísekúndum.
createdAt
stundum
number
numberHvenær tilraunin hófst, sem Unix-tímastimpill í millísekúndum.
playerInput
stundum
object
objectÞað sem leikmaðurinn sló í raun og veru inn, lyklað eftir auðkenni þess atriðis sem það tilheyrir. Sniðið að innan fer eftir tegund verkefnisins — orð, listi af niðurröðuðum spjöldum, valinn kostur.
correctUids
stundum
object
objectHvaða af þessum atriðum eru rétt, lyklað á sama hátt. Vantar á meðan engu hefur verið svarað ennþá.
score
stundum
number
numberStig sem unnust, á þeim tegundum sem gefa stig fyrir keyrslu. Vantar annars staðar — líka á keyrslu sem fékk raunverulega núll stig, svo athugaðu að lykillinn sé til staðar áður en þú lest hann.
performance
stundum
number
numberEigin mælikvarði tegundarinnar á hversu vel gekk, þar sem hún heldur slíkan — til dæmis orð á mínútu í fingrasetningu.
attempts
stundum
number
numberHvaða keyrsla þetta er: 1 í fyrsta sinn, einum meira í hvert sinn sem byrjað er upp á nýtt. Aðeins á tegundum sem enda keyrslu snemma og telja endurtökurnar.
knockedOut
stundum
boolean
booleanKeyrslan endaði á röngu svari og er lokið án þess að vera fullkláruð.
hasAlternateCompletion
stundum
boolean
booleanVerkefninu var lokið á hátt sem nær ekki 100 % — Quiz sem er svarað til enda, leystur lausnarreitur. Líttu á það sem að verkefnið sé lokið.
missedKeys
stundum
array
arrayStafir sem leikmaðurinn hélt áfram að fá ranga, þeir sem oftast var misst af fyrst. Aðeins í fingrasetningu.
contentVersion
stundum
number
numberHvaða útgáfa af efni verkefnisins þetta var spilað gegn. Hún breytist þegar eigandinn breytir spurningunum, svo hægt er að greina gamla niðurstöðu frá núverandi.
Lokið Quiz-verkefni, eins og það berst
{
  "activityKey": "-Nq8sample_activity_key",
  "playerUid": "kK3r9TzSampleAnonymousUid",
  "player": {
    "name": "Ava Ortega",
    "email": "ava@school.example",
    "class": "5B"
  },
  "progress": 100,
  "timePassed": 243120,
  "lastPlayedAt": 1758297843120,
  "createdAt": 1758297600000,
  "playerInput": {
    "-Nq8item_one": "Lisbon",
    "-Nq8item_two": "1969"
  },
  "correctUids": {
    "-Nq8item_one": true,
    "-Nq8item_two": false
  },
  "score": 800,
  "contentVersion": 1757923200000
}
Vantar, ekki tómt

Reitur sem á ekki við er skilinn eftir úr JSON-inu frekar en sendur sem null eða núll. Þannig er hægt að greina á milli tegundar sem gefur ekki stig og keyrslu sem fékk núll stig — lestu því með sjálfgefnu gildi og gerðu aldrei ráð fyrir að lykill sé til staðar.

Að endurstilla verkefnið frá síðunni þinni

Ein skipun ferðast í hina áttina. Þegar kveikt er á "Taka við skipunum frá yfirsíðunni" getur síðan sem fellir verkefnið inn hreinsað svör leikmannsins og sett verkefnið aftur á byrjunarreit — fyrir þinn eigin "reyna aftur" hnapp, fyrir utan rammann.

reset
const frame = document.querySelector('iframe').contentWindow;

// Sent to the frame, from the page that embeds it — no other sender is
// accepted, and the activity has to have the trigger setting switched on.
frame.postMessage({ trigger: { type: 'reset' } }, 'https://puzzel.org');
Endurstilling er eina skipunin

Það eru engin skilaboð fyrir að skila niðurstöðu, opna lokaskilaboðin eða stökkva í spurningu. Skilaboð sem biðja um eitthvað annað en endurstillingu eru hunsuð.

Aðeins síðan sem fellir inn er heyrð

Skipunin er aðeins samþykkt frá síðunni sem fellir verkefnið inn og hvergi annars staðar frá — ekki systurramma, ekki skriftu á síðunni. Stillingin er óvirk sjálfgefið, svo kveiktu á henni fyrir þau verkefni sem þú stýrir.

Að nota þitt eigið auðkenni leikmanna

Ef kerfið þitt veit nú þegar hver er að spila þarf verkefnið ekki að spyrja um það aftur. Tvö handabönd eru í boði, bæði fyrir verkefni inni í síðunni þinni, og bæði virkjuð af okkur frekar en í ritlinum — þau breyta því hverjum niðurstaða tilheyrir, svo þau eru sett upp í samráði við þig frekar en með hökmerki.

Sendu okkur leikmanninn

Verkefnið tilkynnir sig með 'app-loaded' og bíður. Síðan þín sendir upplýsingar leikmannsins til baka, og niðurstaðan er skráð á þær án þess að leikmaðurinn þurfi að slá neitt inn eða sjá skráningarskjá.

Sendu okkur tóka

Sama handaband, en síðan þín sendir JWT-tókann sem auðkennisveitan þín gaf út í stað reitanna sjálfra. Við sannreynum hann gegn þeim útgefendum sem eru settir upp fyrir aðganginn þinn áður en leikmaðurinn fær aðgang, svo auðkennið er sannað frekar en fullyrt — þetta er sú leið sem þú biður um þegar niðurstaðan þarf að vera áreiðanleg.

index.html
window.addEventListener('message', (event) => {
  if (event.origin !== 'https://puzzel.org') return;

  // The activity says it is ready for a player.
  if (event.data === 'app-loaded') {
    frame.postMessage(
      {
        player: { name: 'Ava Ortega', email: 'ava@school.example', class: '5B' },
        // true starts a fresh attempt instead of resuming this player's last one
        should_reset: false
      },
      'https://puzzel.org'
    );
  }

  // Signed in; the board is coming.
  if (event.data?.success === true) hideYourOwnSpinner();
});
Biddu okkur um að kveikja á því

Segðu okkur hvora leiðina þú vilt og hvar verkefnin verða felld inn, og við setjum aðganginn þinn upp og förum í gegnum þetta með þér.

Senda okkur tölvupóst um auðkenni

Að búa til verkefni úr kerfinu þínu

Allt hér að ofan snýst um niðurstöðu sem kemur út. Í hina áttina — að búa til verkefnin sjálf úr efni sem þú átt nú þegar — er Puzzle API: ein POST-fyrirspurn fyrir hverja tegund verkefnis, og þú færð til baka lykil og vefslóð til að fella inn.

Lesa API-tilvísunina

Þegar tilbúin tenging er betri kostur

Ef kerfið hinum megin er alvöru LMS þarftu líklega ekkert af þessu. Einkunnir geta borist sjálfkrafa í einkunnabókina þess, án þess að þú þurfir að hýsa neitt.

Ekkert af þessu?

Námskeiðakerfi, aðildarsíður, innri vefir og allt sem þú hefur smíðað sjálf/ur er nákvæmlega það sem leiðirnar á þessari síðu eru fyrir. Innfelling ásamt lokamerki dugar fyrir langflest af því.

Hvað er ekki í boði

Svo þú eyðir ekki tíma í að leita að því:

  • Enginn endapunktur til að lesa niðurstöður til baka. API-ið býr til verkefni; niðurstöður fara út um leiðirnar á þessari síðu, eða um útflutninginn í stjórnborðinu þínu.
  • Engin undirskrift á webhook-inu. Það er ekkert til að sannreyna fyrirspurnina gegn, sem er ástæðan fyrir því að niðurstaða ætti ekki að vera það eina sem stendur á bak við eitthvað sem skiptir máli.
  • Ekkert webhook fyrir allan aðganginn. Vefslóðin er stilling á verkefni, svo verkefni sem þú afritar ber hana með sér og nýtt verkefni byrjar án hennar.
  • Ekkert í liðaleik eða beinni lotu. Bæði skilaboðaleiðirnar og webhook-ið eru fyrir einstaklingsspilun, og stillingarnar slökkva sjálfkrafa á sér þegar liðaspilun er virk.
  • Engin biðröð fyrir sendingar. Ekkert er geymt og sent aftur — næsta vistun er endurtilraunin, og síðasta kall keyrslunnar er það sem skiptir máli.

Eitthvað sem virkar ekki rétt?

Sendu fyrirspurnina sem þú prófaðir og villuna sem þú fékkst til baka, og þú færð raunverulegt svar frá þeim sem skrifaði endapunktinn.

Senda okkur tölvupóst