let captchaData; document.addEventListener("DOMContentLoaded", function () { fetchCaptchaImages(); }); function toggleSelection(element) { element.classList.toggle("selected"); } function populateCaptcha(data) { const container = document.getElementById("recaptcha-container"); const title = document.getElementById("recaptcha-title"); title.innerHTML = data.title; const oldRows = container.getElementsByClassName("recaptcha-row"); while (oldRows.length > 0) { oldRows[0].parentNode.removeChild(oldRows[0]); } const images = data.questions; let rows = Math.ceil(images.length / 4); let htmlContent = ""; for (let r = 0; r < rows; r++) { htmlContent += '
'; for (let i = 0; i < 4; i++) { const index = r * 4 + i; if (images[index]) { htmlContent += `
`; } } htmlContent += "
"; } title.insertAdjacentHTML("afterend", htmlContent); captchaData = data; } async function verifyCaptcha() { const selectedImages = document.querySelectorAll(".recaptcha-image.selected"); const answers = []; const answerTableBody = document.querySelector("#answer-table tbody"); const endMessageDiv = document.querySelector("#end-message"); answerTableBody.innerHTML = ""; selectedImages.forEach((img) => { const backgroundImageURL = img.style.backgroundImage; const imageURL = backgroundImageURL.slice(5, backgroundImageURL.length - 2); const question = captchaData.questions.find((q) => q.image === imageURL); answers.push(question.id); const row = document.createElement("tr"); const imgCell = document.createElement("td"); const idCell = document.createElement("td"); const nameCell = document.createElement("td"); imgCell.innerHTML = `Selected Image`; idCell.textContent = question.answer; nameCell.textContent = question.name; row.appendChild(imgCell); row.appendChild(nameCell); row.appendChild(idCell); answerTableBody.appendChild(row); }); num_correct = 0 for (let i = 0; i < captchaData.questions.length; i++) { if (captchaData.questions[i].answer == true) { num_correct += 1 } } endMessageDiv.textContent = `You selected ${selectedImages.length} image(s). There are ${num_correct} correct image(s).`; const captchaAnswer = { session: captchaData.session, answer: answers.join(","), }; try { const response = await fetch("/api/verify", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, body: new URLSearchParams(captchaAnswer).toString() // Convert JSON object to form-urlencoded data }); const data = await response.json(); if (data.success) { endMessageDiv.textContent = "You have successfully completed the captcha!"; } else { fetchCaptchaImages(); } } catch (error) { console.error("Error verifying captcha:", error); } } const submitButton = document.querySelector(".submit-btn"); submitButton.addEventListener("click", verifyCaptcha); function fetchCaptchaImages() { fetch("/api/affiliation/Hololive") .then((response) => response.json()) .then((data) => { populateCaptcha(data); }) .catch((error) => { console.error("There was an error fetching the captcha:", error); }); }