// ==UserScript== // @name Google Forms Helper // @namespace https://github.com // @version 2.1 // @description Aids to solve google forms // @author erucix // @match https://docs.google.com/forms/* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const formBlockHolderName = ".Qr7Oae"; const questionHolderParentName = ".z12JJ"; const questionHolderName = ".M7eMe"; const optionsHolderName = ".nWQGrd.zwllIb"; const searchEngine = "https://google.com/search?q="; const formBlockContainer = document.querySelectorAll(formBlockHolderName); formBlockContainer.forEach((element, index) => { attatchMenu(element); attatchAiBox(element); findAnswer(element); }); function findAnswer(element) { fetch("https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText?key=AIzaSyCWvB0JMPgfzpdK9e3UtfDvSoTzrtDZ7ns", { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ prompt: { text: "Which of the following option is correct for this question?\n" + getQuestionWithOptions(element), }, }), }) .then(response => response.json()) .then(data => { element.querySelector("#chatGPTAnswer").innerText = data?.candidates[0].output; autoClickAnswers(element, data?.candidates[0].output); }) .catch(error => { element.querySelector("#chatGPTAnswer").innerText = "😢 Failed to fetch answer. "; }); } function autoClickAnswers(destinationElement, answer) { const optionsHolder = destinationElement.querySelectorAll(optionsHolderName); optionsHolder?.forEach((element, index) => { if (answer.includes(element.textContent)) { element.querySelector(".Od2TWd.hYsg7c").click(); } }) } function attatchMenu(destinationElement) { const optionHolder = destinationElement.querySelectorAll(optionsHolderName); const searchButton = document.createElement("a"); searchButton.setAttribute("target", "_blank"); const copyButton = document.createElement("a"); copyButton.setAttribute("target", "_blank"); searchButton.textContent = "SEARCH"; copyButton.textContent = "COPY"; const searchButtonStyle = { color: "red", fontWeight: "bold", textDecoration: "none", padding: "0px", }; const copyButtonStyle = { color: "blue", fontWeight: "bold", textDecoration: "none", padding: "10px", cursor: "pointer" }; Object.assign(searchButton.style, searchButtonStyle); Object.assign(copyButton.style, copyButtonStyle); searchButton.href = searchEngine + encodeURIComponent(getQuestionWithOptions(destinationElement)); copyButton.addEventListener("click", () => { navigator.clipboard.writeText(getQuestionWithOptions(destinationElement)); copyButton.textContent = "COPIED"; setTimeout(() => { copyButton.textContent = "COPY"; }, 1000); }); destinationElement.appendChild(searchButton); destinationElement.appendChild(copyButton); } function attatchAiBox(destinationElement) { const chatAnswerDiv = document.createElement('div'); const boldTextParagraph = document.createElement('p'); boldTextParagraph.innerText = "👻 AI Answer:"; const chatAnswerDivStyle = { backgroundColor: "rgba(139, 97, 238, 0.683)", padding: "5px 10px", borderRadius: "5px", marginBottom: "20px" }; const boldTextParagraphStyle = { fontWeight: "bolder", padding: 0, margin: 0, color: "rgb(255, 255, 255)" }; const hrElement = document.createElement('hr'); hrElement.style.border = '1px solid white'; const textContentParagraph = document.createElement('p'); textContentParagraph.innerText = 'Waiting for AI to respond... 🤓'; textContentParagraph.setAttribute("id", "chatGPTAnswer"); const textContentParagraphStyle = { padding: 0, margin: 0, color: "black", }; const br = document.createElement("br"); const cr = document.createElement("br"); Object.assign(chatAnswerDiv.style, chatAnswerDivStyle); Object.assign(boldTextParagraph.style, boldTextParagraphStyle); Object.assign(textContentParagraph.style, textContentParagraph); chatAnswerDiv.appendChild(boldTextParagraph); chatAnswerDiv.appendChild(hrElement); chatAnswerDiv.appendChild(textContentParagraph); chatAnswerDiv.prepend(br); chatAnswerDiv.appendChild(cr); destinationElement.appendChild(chatAnswerDiv); } function getQuestionWithOptions(destinationElement) { const questionContent = destinationElement.querySelector(questionHolderName)?.textContent; const optionHolders = destinationElement.querySelectorAll(optionsHolderName); let optionContent = ""; optionHolders?.forEach((element, index) => { optionContent += element.textContent + "\n "; }); let finalContent = questionContent + '\n' + (optionContent || ""); return finalContent; } function b(element, color) { element.style.border = "2px solid " + color; } })();