पूर्वावलोकन
एम्बेड कोड
कोड को अपने पेज में उस जगह पेस्ट करें जहाँ क्विज़ दिखना चाहिए।
जानने योग्य
- अगर आपकी साइट Content Security Policy इस्तेमाल करती है, तो script-src में जोड़ें: https://www.qwissit.com
- विजेट कोई कुकी नहीं रखता और ब्राउज़र में कुछ भी सेव नहीं करता। यह सिर्फ़ Qwissit से स्क्रिप्ट और प्रश्न लोड करता है।
- प्रश्न अपने-आप बदलते हैं। रंग या टेक्स्ट बदलने के लिए यहाँ नया कोड बनाएँ और पुराने को बदल दें।
वैकल्पिक: अपने डोमेन के ज़रिए एम्बेड करना
अगर आप तीसरे पक्ष के सर्वर पर कोई अनुरोध नहीं चाहते, तो आपका वेब सर्वर क्विज़ देता है: वह /qwissit/ जैसा पाथ Qwissit तक आगे भेजता है। तब आपके विज़िटर का ब्राउज़र सिर्फ़ आपके डोमेन से बात करता है, और Qwissit को सिर्फ़ आपके सर्वर का पता दिखता है। ऊपर वाला सीधा एम्बेड आसान डिफ़ॉल्ट बना रहता है।
1. वेब सर्वर सेट करें: /qwissit/ को https://www.qwissit.com/widget/v1/ पर आगे भेजें, विज़िटर की कुकीज़, IP पते या दूसरी जानकारी के बिना।
nginx
location ^~ /qwissit/ {
proxy_pass https://www.qwissit.com/widget/v1/;
proxy_set_header Host www.qwissit.com;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-For "";
proxy_set_header X-Real-IP "";
proxy_set_header Cookie "";
proxy_set_header Referer "";
proxy_set_header User-Agent "qwissit-proxy";
proxy_hide_header Set-Cookie;
}Apache (mod_proxy, mod_ssl, mod_headers)
SSLProxyEngine On
<Location "/qwissit/">
ProxyPass "https://www.qwissit.com/widget/v1/"
ProxyAddHeaders Off
RequestHeader unset Cookie
RequestHeader unset Referer
RequestHeader set User-Agent "qwissit-proxy"
Header unset Set-Cookie
</Location>Caddy
handle_path /qwissit/* {
rewrite * /widget/v1{path}?{query}
reverse_proxy https://www.qwissit.com {
header_up Host {upstream_hostport}
header_up -X-Forwarded-For
header_up -Cookie
header_up -Referer
header_up User-Agent qwissit-proxy
header_down -Set-Cookie
}
}PHP (Shared Hosting)
सर्वर कॉन्फ़िगरेशन तक पहुँच नहीं (शेयर्ड होस्टिंग)? PHP फ़ाइल डाउनलोड करें, उसे अपने वेब फ़ोल्डर में qwissit-proxy.php नाम से सेव करें और स्क्रिप्ट पते के रूप में /qwissit-proxy.php/qwissit-widget.js लें। यह सिर्फ़ विजेट की फ़ाइलें आगे भेजती है।
2. ऊपर के कोड में स्क्रिप्ट का पता बदलें:
<script src="/qwissit/qwissit-widget.js" async></script>
3. खुद जाँचें: अपने डोमेन के साथ यह कॉल 200 और content-type: text/javascript लौटाना चाहिए। 404 का मतलब „अगर काम न करे“ में से कोई बिंदु है, HTML पेज का मतलब है कि आपके CMS ने अनुरोध ले लिया।
curl -I https://example.org/qwissit/qwissit-widget.js
फिर ब्राउज़र में डेवलपर टूल्स (F12), टैब „Network“: www.qwissit.com पर कोई अनुरोध नहीं दिखना चाहिए।
अगर काम न करे
- nginx 404 देता है: location ~* \.(js|css)$ जैसे स्टैटिक फ़ाइलों के नियम साधारण प्रीफ़िक्स नियमों से पहले लागू होते हैं, तब nginx qwissit-widget.js को आपके सर्वर पर ढूँढता है। इसीलिए स्निपेट में location ^~ /qwissit/ है – ^~ पक्का करता है कि यह पाथ हमेशा आगे भेजा जाए।
- बदलाव रीलोड के बाद ही लागू होते हैं: nginx -t && nginx -s reload, Apache में apachectl configtest && systemctl reload apache2। Docker में अलग से माउंट की गई कॉन्फ़िगरेशन फ़ाइल को बदलने (rsync, cp) के बाद कंटेनर पुराना संस्करण ही देखता रहता है – तब सिर्फ़ कंटेनर को रीस्टार्ट करना मदद करता है (docker compose restart <service>)।
- Apache: मॉड्यूल proxy, proxy_http, ssl और headers चालू होने चाहिए (a2enmod proxy proxy_http ssl headers)। नियम सर्वर या VirtualHost कॉन्फ़िगरेशन में जाते हैं, .htaccess में नहीं। अगर आप सिर्फ़ .htaccess इस्तेमाल कर सकते हैं, तो PHP फ़ाइल लें।
- PHP फ़ाइल: यह सच में वेब फ़ोल्डर में होनी चाहिए (TYPO3 में public/ में), वरना CMS अनुरोध ले लेता है। सर्वर को फ़ाइल के बाद का पाथ (PATH_INFO) PHP तक पहुँचाना चाहिए: Apache में AcceptPathInfo On (कई होस्टर पर डिफ़ॉल्ट), nginx में PHP नियम में ऐसे:
location ~ \.php(/|$) { fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; # … your usual fastcgi_pass / include fastcgi_params }
वैकल्पिक: नतीजों की जाँच, जिसमें छेड़छाड़ न हो सके
क्या आप अपनी वेबसाइट पर दर्ज करना चाहते हैं कि किसी ने क्विज़ पास कर लिया – जैसे किसी पाठ को पूरा मानने या पॉइंट देने के लिए? तब नतीजे की पुष्टि Qwissit से करवाएँ। इस तरह कोई इसे नकली नहीं बना सकता।
यह कैसे काम करता है
- आपका पेज क्विज़ को एक बार इस्तेमाल होने वाला कोड देता है और उसे याद रखता है।
- विज़िटर क्विज़ हल करता है। Qwissit हर उत्तर खुद जाँचता है; गलत उत्तर वाले प्रश्न तब तक दोबारा आते हैं जब तक सब सही न हों।
- अंत में आपके पेज को एक प्रमाण मिलता है, जिसे सिर्फ़ Qwissit जारी कर सकता है, और पेज उसे आपके सर्वर को भेजता है।
- आपका सर्वर Qwissit से पूछता है कि प्रमाण असली है और आपके कोड व क्विज़ से मेल खाता है या नहीं। तभी वह नतीजा सेव करता है।
आपको क्या जोड़ना है
दो जगहें, दोनों PHP में। आपके विज़िटर लॉग-इन होने चाहिए (सेशन), क्योंकि नतीजा किसी व्यक्ति का होना चाहिए।
A) क्विज़ वाले पेज पर: यह ब्लॉक सामान्य स्निपेट की जगह लेता है। data-set और data-course को अपने क्विज़ के अनुसार बदलें – मान ऊपर के कोड में हैं।
<?php
session_start(); // your visitors are signed in
$nonce = $_SESSION['quiz_nonce']['http'] ??= rtrim(strtr(base64_encode(random_bytes(16)), '+/', '-_'), '=');
?>
<div id="quiz" data-qwissit-widget data-set="12" data-course="13" data-lang="de"
data-verify="<?= $nonce ?>"></div>
<script src="https://www.qwissit.com/widget/v1/qwissit-widget.js" async></script>
<script>
document.getElementById('quiz').addEventListener('qwissit:finish', function (e) {
if (!e.detail.passed || !e.detail.token) return;
fetch('quiz-complete.php', {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'lesson=http&token=' + encodeURIComponent(e.detail.token)
}).then(function (r) {
if (r.ok) { /* done: e.g. show a tick */ }
});
});
</script>
B) एक नई फ़ाइल quiz-complete.php उसी फ़ोल्डर में। QUIZZES में set और course के वही मान लिखें और चिह्नित जगह पर नतीजा उस तरह सेव करें जो आपकी वेबसाइट के लिए ठीक हो।
<?php
// quiz-complete.php – checks the result with Qwissit and saves it only if everything matches
session_start();
const QUIZZES = ['http' => ['set' => 12, 'course' => 13]]; // same values as data-set / data-course
$lesson = (string)($_POST['lesson'] ?? '');
$token = (string)($_POST['token'] ?? '');
$quiz = QUIZZES[$lesson] ?? null;
$nonce = (string)($_SESSION['quiz_nonce'][$lesson] ?? '');
if (!$quiz || $nonce === '' || $token === '') { http_response_code(400); exit; }
$ch = curl_init('https://www.qwissit.com/widget/v1/verify');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['token' => $token]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 4,
]);
$r = json_decode((string)curl_exec($ch), true);
curl_close($ch);
if (!is_array($r)) { http_response_code(503); exit; } // Qwissit not reachable: save nothing
if (($r['valid'] ?? false) !== true
|| !hash_equals($nonce, (string)($r['nonce'] ?? ''))
|| (int)$r['set'] !== $quiz['set'] || (int)$r['course'] !== $quiz['course']) {
http_response_code(403); exit; // forged, already used, expired or another quiz
}
unset($_SESSION['quiz_nonce'][$lesson]); // the code counts only once
// ▶ save the result here, e.g. user + $lesson + date (+ $r['wrong'] = failed attempts)
header('Content-Type: application/json');
echo json_encode(['ok' => true]);
फ़ाइल तभी सेव करती है जब Qwissit प्रमाण की पुष्टि करे, वह आपके एक-बार वाले कोड से जुड़ा हो और सही क्विज़ का हो। उसके बाद कोड इस्तेमाल हो चुका होता है, इसलिए हर नतीजा सिर्फ़ एक बार गिना जाता है। अगर अभी Qwissit तक पहुँच न हो, तो कुछ सेव नहीं होता – विज़िटर को बाद में फिर कोशिश करने दें। प्रमाण एक घंटे तक मान्य है।
जानने लायक
- आपके सर्वर से होकर क्यों? विजेट क्विज़ के खत्म होने की सूचना सीधे ब्राउज़र में भी देता है (इवेंट qwissit:finish), लेकिन थोड़ी तकनीकी जानकारी वाला कोई भी इसे खुद चला सकता है। कुछ दिखाने के लिए यह काफ़ी है, पॉइंट, सर्टिफ़िकेट या अनलॉक के लिए नहीं।
- कोड वाला क्विज़ सिर्फ़ लॉग-इन विज़िटर को दिखाएँ और बाकी सबके लिए सेशन न बनाएँ – वरना हर बॉट एक सेशन बना देगा।
- quiz-complete.php को अपने दूसरे फ़ॉर्म की तरह सुरक्षित रखें: लॉगिन जाँचें, सिर्फ़ अपनी साइट से आए अनुरोध स्वीकार करें, अनुरोधों की संख्या सीमित करें।
- सफलता के बाद विज़िटर को अगली बार नया कोड मिलता है और वह क्विज़ दोहरा सकता है।
- जाँचने के लिए: गढ़ा हुआ प्रमाण, वही प्रमाण दूसरी बार और किसी दूसरे क्विज़ का प्रमाण – सब अस्वीकार होने चाहिए।
आपकी प्राइवेसी पॉलिसी के लिए टेक्स्ट
एक सुझाव, जिसे आप अपनी साइट के हिसाब से बदल सकते हैं। यह कानूनी सलाह नहीं है।
सीधे एम्बेड किया गया
इस वेबसाइट पर हम Qwissit का एक क्विज़ एम्बेड करते हैं (www.qwissit.com)। लोड होते समय आपका ब्राउज़र www.qwissit.com से स्क्रिप्ट और प्रश्न लेता है; इसमें आपका IP पता भेजा जाता है। क्विज़ कोई कुकी नहीं लगाता, आपके ब्राउज़र में कुछ सेव नहीं करता और आपके उत्तर स्टोर नहीं करता। कानूनी आधार एक इंटरैक्टिव लर्निंग ऑफ़र में हमारा वैध हित है (GDPR अनुच्छेद 6(1)(f))। अधिक जानकारी: https://www.qwissit.com/en/privacy#widget
अपने डोमेन के ज़रिए (प्रॉक्सी)
इस वेबसाइट पर हम Qwissit का एक क्विज़ एम्बेड करते हैं। स्क्रिप्ट और प्रश्न हमारा अपना सर्वर देता है, जो उन्हें Qwissit से लेता है। आपका ब्राउज़र Qwissit से नहीं जुड़ता, और Qwissit को न आपका IP पता मिलता है, न कुकीज़ और न आपके बारे में कोई दूसरी जानकारी। क्विज़ कोई कुकी नहीं लगाता, आपके ब्राउज़र में कुछ सेव नहीं करता और आपके उत्तर स्टोर नहीं करता। अधिक जानकारी: https://www.qwissit.com/en/privacy#widget