Webtoon.xyz+

Auto login for Webtoon.xyz with userscript settings

  1. // ==UserScript==
  2. // @name Webtoon.xyz+
  3. // @namespace github.com/longkidkoolstar
  4. // @version 0.1
  5. // @description Auto login for Webtoon.xyz with userscript settings
  6. // @author longkidkoolstar
  7. // @homepage github.com/longkidkoolstar
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=webtoon.xyz
  9. // @license MIT
  10. // @match https://www.webtoon.xyz/*
  11. // @grant GM.getValue
  12. // @grant GM.setValue
  13. // ==/UserScript==
  14.  
  15. (async function() {
  16. console.log("User-Script Started");
  17.  
  18. // Check if on the user settings page
  19. if (window.location.href.startsWith("https://www.webtoon.xyz/user-settings/")) {
  20. const navTabsWrap = document.querySelector(".nav-tabs-wrap ul.nav-tabs");
  21. const contentArea = document.querySelector("#post-7 > div.entry-content > div > div > div.col-md-9.col-sm-9");
  22.  
  23. if (navTabsWrap && contentArea) {
  24. // Create Userscript Settings tab
  25. const settingsTab = document.createElement("li");
  26. settingsTab.innerHTML = `
  27. <a href="#" id="userscript-settings-tab"><i class="icon ion-md-settings"></i>Userscript Settings</a>
  28. `;
  29. navTabsWrap.appendChild(settingsTab);
  30.  
  31. // Create Userscript Settings content section
  32. const settingsContent = document.createElement("div");
  33. settingsContent.id = "userscript-settings-content";
  34. settingsContent.innerHTML = `
  35. <h2 style="font-size: 24px; color: #333;">Webtoon.xyz+ Settings</h2>
  36. <div style="background: #f9f9f9; padding: 20px; border-radius: 8px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); max-width: 400px; margin: 20px auto;">
  37. <label style="font-size: 16px; color: #333; margin-bottom: 8px; display: block;">
  38. <input type="checkbox" id="enable-auto-login" style="margin-right: 10px;">
  39. Enable Auto Login
  40. </label><br><br>
  41.  
  42. <label for="username-input" style="font-size: 14px; color: #555;">Username or Email:</label>
  43. <input type="text" id="username-input" placeholder="Enter Username or Email" style="width: 100%; padding: 10px; margin: 5px 0; border-radius: 6px; border: 1px solid #ccc; font-size: 14px;"><br><br>
  44. <label for="password-input" style="font-size: 14px; color: #555;">Password:</label>
  45. <input type="password" id="password-input" placeholder="Enter Password" style="width: 100%; padding: 10px; margin: 5px 0; border-radius: 6px; border: 1px solid #ccc; font-size: 14px;"><br><br>
  46. <button id="save-credentials" style="background-color: #4CAF50; color: white; padding: 10px 15px; border: none; border-radius: 6px; cursor: pointer; font-size: 16px; width: 100%; transition: all 0.3s ease;">
  47. Save Credentials
  48. </button>
  49. </div>
  50. `;
  51. settingsContent.style.display = "none";
  52.  
  53. // Add the settings content to the main content area
  54. contentArea.appendChild(settingsContent);
  55.  
  56. // Add hover and click effects using CSS
  57. const saveButton = document.getElementById("save-credentials");
  58.  
  59. // Hover effect: change background color and scale the button slightly
  60. saveButton.addEventListener("mouseover", () => {
  61. saveButton.style.backgroundColor = "#45a049";
  62. saveButton.style.transform = "scale(1.05)";
  63. });
  64.  
  65. // Revert the hover effect when mouse leaves
  66. saveButton.addEventListener("mouseout", () => {
  67. saveButton.style.backgroundColor = "#4CAF50";
  68. saveButton.style.transform = "scale(1)";
  69. });
  70.  
  71. // Click effect: add a slight "pressed" effect and change to red temporarily
  72. saveButton.addEventListener("mousedown", () => {
  73. saveButton.style.backgroundColor = "red"; // Change to red during click
  74. saveButton.style.transform = "scale(0.98)";
  75. });
  76.  
  77. // Revert the click effect after a short delay
  78. saveButton.addEventListener("mouseup", () => {
  79. setTimeout(() => {
  80. saveButton.style.backgroundColor = "#4CAF50"; // Change back to green after the click
  81. }, 150); // Wait for 150ms before returning to green
  82. saveButton.style.transform = "scale(1)";
  83. });
  84.  
  85.  
  86.  
  87. // Event listener for Userscript Settings tab click
  88. document.getElementById("userscript-settings-tab").addEventListener("click", (e) => {
  89. e.preventDefault();
  90.  
  91. // Clear any existing active classes from tabs
  92. navTabsWrap.querySelectorAll("li").forEach(tab => tab.classList.remove("active"));
  93. // Set the clicked tab to active
  94. settingsTab.classList.add("active");
  95.  
  96. // Hide other content and show settings content
  97. contentArea.innerHTML = ''; // Clear existing content
  98. contentArea.appendChild(settingsContent); // Display settings
  99. settingsContent.style.display = "block";
  100. });
  101.  
  102. // Load and apply existing settings
  103. const autoLoginEnabled = await GM.getValue("autoLoginEnabled", true);
  104. document.getElementById("enable-auto-login").checked = autoLoginEnabled;
  105.  
  106. const savedUsername = await GM.getValue("username", "");
  107. const savedPassword = await GM.getValue("password", "");
  108. document.getElementById("username-input").value = savedUsername;
  109. document.getElementById("password-input").value = savedPassword;
  110.  
  111. // Toggle auto-login setting
  112. document.getElementById("enable-auto-login").addEventListener("change", async (e) => {
  113. await GM.setValue("autoLoginEnabled", e.target.checked);
  114. //alert(`Auto-login ${e.target.checked ? "enabled" : "disabled"}`);
  115. });
  116.  
  117. // Save credentials when the "Save Credentials" button is clicked
  118. document.getElementById("save-credentials").addEventListener("click", async () => {
  119. const username = document.getElementById("username-input").value;
  120. const password = document.getElementById("password-input").value;
  121. if (username && password) {
  122. await GM.setValue("username", username);
  123. await GM.setValue("password", password);
  124. alert("Credentials saved successfully!");
  125. } else {
  126. alert("Please enter both username and password.");
  127. }
  128. });
  129. }
  130. }
  131.  
  132. // Auto-login logic
  133. const autoLoginEnabled = await GM.getValue("autoLoginEnabled", true);
  134. if (autoLoginEnabled) {
  135. let username = await GM.getValue("username", null);
  136. let password = await GM.getValue("password", null);
  137.  
  138. if (!username || !password) {
  139. console.log("Username or password not provided. Exiting script.");
  140. return;
  141. }
  142.  
  143. const signInButton = document.querySelector('a[data-toggle="modal"][data-target="#form-login"].btn-active-modal');
  144. if (signInButton) {
  145. signInButton.click();
  146. console.log("Clicked Sign In button");
  147.  
  148. const formCheckInterval = setInterval(() => {
  149. const loginForm = document.querySelector('form#loginform');
  150. if (loginForm) {
  151. clearInterval(formCheckInterval);
  152. loginForm.querySelector('input[name="log"]').value = username;
  153. loginForm.querySelector('input[name="pwd"]').value = password;
  154. loginForm.querySelector('input[name="rememberme"]').checked = true;
  155. loginForm.querySelector('input[type="submit"]').click();
  156. console.log("Form submitted with user credentials");
  157. }
  158. }, 500);
  159. } else {
  160. console.log("Sign In button not found");
  161. }
  162. }
  163. })();