AutoAlura

Ninguem aguenta mais o alura 😃

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         AutoAlura
// @namespace    http://tampermonkey.net/
// @version      13
// @description  Ninguem aguenta mais o alura 😃
// @author       Alfinhoz
// @match        https://cursos.alura.com.br/*
// @license GNU GPLv3
// @icon https://imgs.search.brave.com/q-X8zxRbD9z64iH9Hr2d2LpfwG1L1kDsjKs1SUzyjNI/rs:fit:500:0:0:0/g:ce/aHR0cHM6Ly9hdHRh/Y2htZW50cy5ndXB5/LmlvL3Byb2R1Y3Rp/b24vY29tcGFuaWVz/Lzg4ODEvY2FyZWVy/LzIwNjAyL2ltYWdl/cy8yMDI0LTA3LTEy/XzE1LTEzX2NvbXBh/bnlMb2dvVXJsLmpw/Zw
// ==/UserScript==

(function () {
  "use strict";

  let isScriptActive = JSON.parse(localStorage.getItem("scriptAtivo"));
  if (isScriptActive === null) {
    isScriptActive === true;

    localStorage.setItem("scriptAtivo", JSON.stringify(isScriptActive));
  }
  let blockClickDelay = 1000;

  function createLogContainer() {
    let logContainer = document.getElementById("autoAluraLogContainer");
    if (!logContainer) {
      logContainer = document.createElement("div");
      logContainer.id = "autoAluraLogContainer";
      logContainer.style.position = "fixed";
      logContainer.style.bottom = "10px";
      logContainer.style.right = "10px";
      logContainer.style.maxHeight = "200px";
      logContainer.style.width = "300px";
      logContainer.style.overflow = "hidden";
      logContainer.style.padding = "10px";
      logContainer.style.zIndex = "999";
      logContainer.style.display = "flex";
      logContainer.style.flexDirection = "column-reverse";

      document.body.appendChild(logContainer);
    }
    return logContainer;
  }

  function logToScreen(message) {
    const logContainer = createLogContainer();
    const logMessage = document.createElement("div");

    logMessage.textContent = message;
    logMessage.style.background = "rgba(0, 0, 0, 0.7)";
    logMessage.style.color = "#fff";
    logMessage.style.padding = "8px";
    logMessage.style.margin = "5px 0";
    logMessage.style.borderRadius = "5px";
    logMessage.style.fontSize = "14px";
    logMessage.style.opacity = "1";
    logMessage.style.transition =
      "opacity .5s ease-out, transform .5s ease-out";

    logContainer.appendChild(logMessage);

    setTimeout(() => {
      logMessage.style.opacity = "1";
      logMessage.style.transform = "translateY(0)";
    }, 10);

    setTimeout(() => {
      logMessage.style.opacity = "0";
      logMessage.style.transform = "translateY(-15px)";
      setTimeout(() => logMessage.remove(), 500);
    }, 3000);
  }
  const water_mark = document.querySelector(".formattedText");
  if (water_mark) {
    water_mark.innerHTML = "É o Alfinhoz ✯";
  }

  async function autoPlayVideo() {
    const video = document.querySelector("video");
    if (video && video.paused) {
      logToScreen("Vídeo encontrado, iniciando...");
      video.play();
      await new Promise((resolve) => {
        video.onplay = resolve;
      });
      logToScreen("Vídeo reproduzido.");
      return true;
    }
    return false;
  }

  function clickCorrectAlternative() {
    let correctAlternatives = document.querySelectorAll(
      'ul.alternativeList li[data-correct="true"]'
    );
    if (correctAlternatives.length > 0) {
      correctAlternatives.forEach((li) => {
        const radioInput = li.querySelector('input[type="radio"]');
        if (radioInput && !li.classList.contains("clicked")) {
          radioInput.click();
          logToScreen("Clicando na alternativa correta: " + li.innerText);
          const event = new Event("change", {
            bubbles: true,
            cancelable: true,
          });
          radioInput.dispatchEvent(event);
          li.classList.add("clicked");
        }
      });
      return true;
    }
    return false;
  }

  async function clickMultitaskAlternatives() {
    const multitaskSections = document.querySelectorAll(
      "section.task.class-page-for-MULTIPLE_CHOICE"
    );
    let alternativesClicked = false;

    logToScreen("Verificando as seções MULTIPLE_CHOICE.");

    for (let section of multitaskSections) {
      const taskBody = section.querySelector(".task-body");
      if (taskBody) {
        const taskWrapper = taskBody.querySelector(".task-body__wrapper");
        if (taskWrapper) {
          const mainContainer = taskWrapper.querySelector(
            ".task-body-main.container"
          );
          if (mainContainer) {
            const multipleChoiceSection = mainContainer.querySelector(
              ".multipleChoice#task-content"
            );
            if (multipleChoiceSection) {
              const container =
                multipleChoiceSection.querySelector("div.container");
              if (container) {
                const alternativeList =
                  container.querySelector("ul.alternativeList");
                if (alternativeList) {
                  const form = alternativeList.querySelector("form");
                  if (form) {
                    const correctAlternatives = form.querySelectorAll(
                      'li[data-correct="true"]'
                    );

                    if (correctAlternatives.length > 0) {
                      logToScreen("Alternativas corretas encontradas.");
                      correctAlternatives.forEach((li) => {
                        const checkboxInput = li.querySelector(
                          'input[type="checkbox"]'
                        );
                        if (checkboxInput) {
                          if (!li.classList.contains("clicked")) {
                            checkboxInput.click();
                            logToScreen(
                              "Clicando na alternativa correta (checkbox): " +
                                li.querySelector(
                                  ".alternativeList-item-alternative"
                                ).textContent
                            );
                            const event = new Event("change", {
                              bubbles: true,
                              cancelable: true,
                            });
                            checkboxInput.dispatchEvent(event);
                            li.classList.add("clicked");
                            alternativesClicked = true;
                          }
                        }
                      });
                    } else {
                      logToScreen("Nenhuma alternativa correta encontrada.");
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    return alternativesClicked;
  }

  function decodeBase64(encoded) {
    const decoded = atob(encoded);
    return decoded;
  }

  async function clickBlocksInOrder() {
    logToScreen("Iniciando a função clickBlocksInOrder.");
    const blocksContainer = document.querySelector(".blocks");
    if (blocksContainer) {
      const correctOrder = blocksContainer.dataset.correctOrder;
      const firstDecoding = decodeBase64(correctOrder);
      const secondDecoding = decodeBase64(firstDecoding);
      let decodedTexts = decodeURIComponent(escape(secondDecoding))
        .split(",")
        .map((text) => text.trim());
      logToScreen("Textos decodificados:", decodedTexts);
      let blockButtons = Array.from(blocksContainer.querySelectorAll(".block")); // Alterado para let
      logToScreen("Total de botões disponíveis:", blockButtons.length);

      for (const text of decodedTexts) {
        let blockButton;
        let attempts = 0;

        while (attempts < 5) {
          blockButton = blockButtons.find(
            (button) => button.textContent.trim() === text
          );
          if (blockButton && !blockButton.classList.contains("clicked")) {
            try {
              blockButton.click();
              logToScreen("Clicando no bloco: " + text);
              blockButton.classList.add("clicked");
              await new Promise((resolve) =>
                setTimeout(resolve, blockClickDelay)
              );
              break;
            } catch (error) {
              console.error("Erro ao clicar no bloco: ", error);
            }
          } else {
            logToScreen(
              "Tentativa " +
                (attempts + 1) +
                ": Botão não encontrado ou já clicado para o texto: " +
                text
            );
          }
          attempts++;
          await new Promise((resolve) => setTimeout(resolve, 500));
        }

        blockButtons = blockButtons.filter(
          (button) => !button.classList.contains("clicked")
        );
      }

      await submitAnswer();

      await new Promise((resolve) => setTimeout(resolve, 3000));

      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen("Avançando para a próxima página após clicar nos blocos.");
      }
    } else {
      logToScreen("Container de blocos não encontrado.");
    }
  }

  function submitAnswer() {
    let submitButton = document.querySelector("#submitBlocks");
    if (submitButton) {
      submitButton.click();
      logToScreen("Clicando em 'Submeter resposta'.");
    }
  }

  async function handlePageActivity() {
    logToScreen("Verificando atividade na página.");

    const videoPlayed = await autoPlayVideo();
    if (videoPlayed) {
      logToScreen("Avançando para a próxima página após o vídeo.");
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        return;
      }
    }

    // Verificando uma escolha
    const alternativesClicked = clickCorrectAlternative();
    if (alternativesClicked) {
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen(
          "Avançando para a próxima página após clicar na alternativa correta."
        );
      }
      return;
    }

    // Verificando multitask
    const multitaskClicked = await clickMultitaskAlternatives();
    if (multitaskClicked) {
      let nextButton = document.querySelector(
        "button.next, " +
          "a.next, " +
          'input[type="submit"].next, ' +
          ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
          ".bootcamp-next-button, " +
          ".bootcamp-primary-button-theme"
      );
      if (nextButton) {
        nextButton.click();
        logToScreen(
          "Avançando para a próxima página após clicar na alternativa multitask."
        );
      }
      return;
    }

    await clickBlocksInOrder();

    let nextButton = document.querySelector(
      "button.next, " +
        "a.next, " +
        'input[type="submit"].next, ' +
        ".task-actions-button .task-body-actions-button .task-actions-button-next, " +
        ".bootcamp-next-button, " +
        ".bootcamp-primary-button-theme"
    );
    if (nextButton) {
      nextButton.click();
      logToScreen("Avançando para a próxima página.");
    }
  }

  function monitorPage() {
    let interval = setInterval(async () => {
      if (!isScriptActive) return;

      await handlePageActivity();
    }, 3000);
  }

  function init() {
    monitorPage();
  }

  const controlButton = document.createElement("button");
  controlButton.textContent = isScriptActive
    ? "Desativar Script"
    : "Ativar Script";
  controlButton.style.position = "fixed";
  controlButton.style.top = "10px";
  controlButton.style.right = "10px";
  controlButton.style.padding = "10px";
  controlButton.style.zIndex = "999";
  controlButton.style.backgroundColor = "#00ff1f";
  controlButton.style.color = "white";
  controlButton.style.border = "none";
  controlButton.style.borderRadius = "5px";
  controlButton.style.cursor = "pointer";
  document.body.appendChild(controlButton);

  controlButton.addEventListener("click", () => {
    isScriptActive = !isScriptActive;
    localStorage.setItem("scriptAtivo", JSON.stringify("isScriptActive"));
    controlButton.innerText = isScriptActive
      ? "Desativar Script"
      : "Ativar Script";
    controlButton.style.backgroundColor = isScriptActive
      ? "#ff0000"
      : "#00ff1f";
    logToScreen(isScriptActive ? "Script Ativado" : "Script Desativado");
  });

  init();
})();