دیلی کوییز
راهنمای توسعه‌دهندگان · REST v1

اتصال سایت شما به آزمون‌های دیلی کوییز

کلید API را از مدیریت API دریافت کنید. درخواست ارسال و تأیید پیامک را از بک‌اند خودتان بفرستید؛ کلید را در جاوااسکریپت عمومی یا اپلیکیشن قابل دانلود قرار ندهید.

https://dailyquiz.ir/wp-json/daily-quiz/v1

شروع سریع

  1. توکن آزمون منتشرشده و کلید سایت فعال را از مدیریت بگیرید. سایتِ متعلق به مدرس فقط به آزمون‌های همان مدرس دسترسی دارد.
  2. با request-otp کد را ارسال و با verify-otp تأیید کنید.
  3. session_token را برای دریافت سؤال‌ها و ارسال پاسخ به کار ببرید.
  4. اندیس گزینه از صفر آغاز می‌شود. مثلاً answer: 0 یعنی گزینه اول. شناسه سؤال را از پاسخ questions بردارید.
  5. ارسال دوباره پاسخ، همان نتیجه اولین ثبت موفق را برمی‌گرداند.
curl -X POST 'https://dailyquiz.ir/wp-json/daily-quiz/v1/auth/request-otp' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  --data '{"phone":"09123456789","exam_token":"exam_..."}'

همه درخواست‌ها باید از HTTPS استفاده کنند. نمونه‌ها صرفاً ساختار درخواست و پاسخ هستند و داده زنده محسوب نمی‌شوند.

مسیرهای قابل استفاده

GET /exam-access/{token}

بدون کلید؛ اطلاعات عمومی آزمون منتشرشده

نمونه پاسخ

{"success":true,"exam":{"id":12,"title":"آزمون نمونه","duration":10,"total_questions":20}}
POST /auth/request-otp

Bearer API_KEY — فقط در سرور شما

بدنه JSON

{"phone":"09123456789","exam_token":"exam_..."}

نمونه پاسخ

{"success":true,"otp_token":"otp_...","expires_in":120}
POST /auth/verify-otp

Bearer API_KEY — همان سایتی که کد را درخواست کرده

بدنه JSON

{"otp_token":"otp_...","code":"12345"}

نمونه پاسخ

{"success":true,"session_token":"sess_...","exam_id":12,"expires_in":600}
GET /exams/{exam_id}/questions

Bearer SESSION_TOKEN

نمونه پاسخ

{"success":true,"exam":{"title":"نمونه","duration":10,"total_questions":1},"questions":[{"id":7,"text":"پرسش نمونه","type":"multi_choice","options":["اول","دوم"],"image_url":null}]}
POST /exams/{exam_id}/submit

Bearer SESSION_TOKEN

بدنه JSON

{"answers":[{"question_id":7,"answer":0}]}

نمونه پاسخ

{"success":true,"score":100,"total":100,"result":[{"question_id":7,"correct":true,"score":5,"max_score":5}],"final_status":"fully_graded"}
GET /exams/{exam_id}/result

Bearer SESSION_TOKEN

نمونه پاسخ

همان پاسخ ذخیره‌شده مسیر submit؛ پیش از ثبت نتیجه، وضعیت 409 برمی‌گردد.

زمان، محدودیت و امتیازدهی

  • کد پیامک: ۱۲۰ ثانیه اعتبار، حداکثر ۵ تلاش و ۳ ارسال در ساعت برای هر شماره؛ ۱۲ ارسال در ساعت برای هر IP.
  • سقف عمومی: ۱۸۰ درخواست در دقیقه برای هر IP. سقف کلید سایت از تنظیمات مدیریت خوانده می‌شود.
  • حداکثر بدنه درخواست: ۱۰۰ کیلوبایت؛ حداکثر سؤال: ۵۰۰.
  • زمان نشست آزمون زمان‌دار از تأیید کد آغاز می‌شود؛ آزمون بدون زمان تا ۲۴ ساعت اعتبار دارد. نتیجه ثبت‌شده تا هفت روز بعد از انقضای نشست قابل دریافت است.
  • فقط سؤال چندگزینه‌ای پشتیبانی می‌شود. هر پاسخ درست ۵ امتیاز دارد و نمره نهایی درصد پاسخ‌های درست از کل سؤال‌هاست. سؤال ارسال‌نشده بی‌پاسخ محسوب می‌شود.
  • ترتیب گزینه‌ها در طول نشست ثابت است. snapshot سؤال‌ها در شروع نشست حفظ می‌شود.

خطاها و بازیابی

خطای عملیاتی دارای success: false و error است. خطاهای مجوز وردپرس دارای code، message و data.status هستند.

وضعیتمعنی / اقدام
401کلید، کد یا نشست نامعتبر؛ احراز هویت را بررسی کنید.
403دسترسی سایت، حساب یا HTTPS مجاز نیست.
404آزمون پیدا نشد یا منتشر نشده است.
409عملیات با وضعیت فعلی سازگار نیست یا زمان پایان یافته است.
413بدنه درخواست بیش از حد بزرگ است.
422ساختار پاسخ، شناسه تکراری یا نوع سؤال نامعتبر است.
429سقف درخواست پر شده؛ با فاصله زمانی دوباره تلاش کنید.
502ارسال پیامک انجام نشد.
503خطای موقت ذخیره‌سازی؛ دوباره تلاش کنید.

وب‌هوک نتیجه

نشانی HTTPS را در تنظیمات همان سایت وارد کنید. نتیجه فقط به سایت صاحب نشست ارسال می‌شود. تحویل فعلی best-effort است؛ برای بازیابی قطعی از مسیر result استفاده کنید.

{"event_id":"exam-result-42","exam_id":12,"user_id":8,"score":80,"total":100}

امضای X-DQ-Signature برابر HMAC-SHA256 رشته timestamp + "." + raw_body با کلید API همان سایت است. timestamp از هدر X-DQ-Timestamp خوانده می‌شود. امضا را با مقایسه ثابت‌زمان تأیید، زمان را با مهلت ۵ دقیقه بررسی و event_id تکراری را رد کنید. مقصدهای شبکه داخلی و تغییر مسیر مجاز نیستند.

نشست‌های قبل از ارتقای امنیتی باید دوباره با OTP ساخته شوند.