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?
Sérhver vistuð niðurstaða er send með POST sem JSON á vefslóð sem þú átt.
- Notaðu hana þegar
- Leikmaðurinn getur verið hvar sem er — deildur hlekkur, QR-kóði, síða einhvers annars — og þú vilt fá niðurstöðuna inn í þinn eigin gagnagrunn.
- Þú þarft
- HTTPS-endapunkt sem tekur við POST-fyrirspurn frá öðrum uppruna.
save_puzzle_results_via_webhookSama JSON-ið, sent á síðuna sem fellir verkefnið inn í stað þess að fara á vefþjón.
- Notaðu hana þegar
- Þú fellir verkefnið inn í þína eigin námskeiðssíðu og síðan sjálf getur unnið eitthvað úr niðurstöðunni.
- Þú þarft
- Iframe á síðunni þinni og hlustara á skilaboð. Enginn vefþjónn, ekkert CORS.
save_results_iframe_postmessageEin skilaboð þegar leikmaðurinn lýkur verkefninu, og þau bera ekkert annað en þá staðreynd.
- Notaðu hana þegar
- Þú vilt bara vita hvort þau eru búin — til að merkja við lexíuna, opna þá næstu, eða sýna þinn eigin skjá.
- Þú þarft
- Iframe á síðunni þinni og hlustara á skilaboð.
send_completion_signal_when_embeddedWebhook 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ð.
- 1 Opnaðu verkefnið í ritlinum og farðu í flipann Forritari.
- 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 Spilaðu verkefnið sjálf/ur einu sinni. Fyrsta POST-fyrirspurnin berst um leið og þú svarar einhverju.
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);
});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.
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ð.
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.
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.
<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>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.
Þ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.
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);
});{
"completed": true,
"activityKey": "-Nq8sample_activity_key"
}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.
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.
| Reitur | Tegund | Hvað hann gerir |
|---|---|---|
activityKey alltaf string | string | Verkefnið sem niðurstaðan tilheyrir. Sami lykill og þú sérð í vefslóð verkefnisins sjálfs, á eftir ?p=. |
playerUid alltaf string | string | Hver 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 | object | Skrá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 | number | Hversu langt er komið, sem hlutfall. 100 þýðir að lokið er. |
timePassed alltaf number | number | Tími sem fór í verkefnið, í millísekúndum. |
lastPlayedAt alltaf number | number | Hvenær þessi niðurstaða var vistuð, sem Unix-tímastimpill í millísekúndum. |
createdAt stundum number | number | Hvenæ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 | object | Hvaða af þessum atriðum eru rétt, lyklað á sama hátt. Vantar á meðan engu hefur verið svarað ennþá. |
score stundum number | number | Stig 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 | number | Eigin 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 | number | Hvað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 | boolean | Keyrslan endaði á röngu svari og er lokið án þess að vera fullkláruð. |
hasAlternateCompletion stundum boolean | boolean | Verkefninu 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 | array | Stafir sem leikmaðurinn hélt áfram að fá ranga, þeir sem oftast var misst af fyrst. Aðeins í fingrasetningu. |
contentVersion stundum number | number | Hvað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. |
{
"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
}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.
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');Þ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ð.
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.
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á.
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.
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();
});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ðkenniAð 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.
Ræst innan úr LMS-kerfinu, og stigin skrifuð til baka í einkunnabókina þess.
Deildu verkefninu sem heimaverkefni í Google Classroom og fáðu einkunnirnar til baka sjálfkrafa.
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