Google Forms Helper

Aids to solve google forms

目前為 2024-02-02 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Google Forms Helper
// @namespace    https://github.com
// @version      2.2
// @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
// ==/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");
        searchButton.classList.add("partofai");

        const copyButton = document.createElement("a");
        copyButton.setAttribute("target", "_blank");
        copyButton.classList.add("partofai");

        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');
        chatAnswerDiv.classList.add("partofai");

        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;
    }

    function doc_keyUp(e) {
        console.log(e.code);
        if (e.ctrlKey && e.code === 'AltLeft') {
            aiElements.forEach(e=>{
            e.classList.toggle('active');
            if(e.style.display == "none"){
                e.style.display = '';
            }
        });
        }
    }

    let style = document.createElement("style");
    let aiElements = document.querySelectorAll(".partofai");
    let button = document.createElement("button");
    button.innerText = ".";

    Object.assign(button.style, {
        "position":"absolute",
        "top": "0",
        "right": "0",
        "border-radius": "100%",
        "height":"20px",
        "width": "20px"
    });

    button.addEventListener("click", function(){
        aiElements.forEach(e=>{
            e.classList.toggle('active');
            if(e.style.display == "none"){
                e.style.display = '';
            }
        });
    });

    document.body.appendChild(button);

    style.innerHTML = `
    .partofai.active {
    display: none;
    }
    `;

    document.body.appendChild(style);

    document.addEventListener('keyup', doc_keyUp, false);

})();