您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automate github signup
当前为
// ==UserScript== // @name GitHub Auto Signup // @version 0.2 // @description Automate github signup // @author Young Jimmy // @match https://github.com/signup* // @match https://github.com/account_verifications?recommend_plan=true // @grant GM_xmlhttpRequest // @license MIT // @namespace https://greasyfork.org/users/1218336 // ==/UserScript== (function() { 'use strict'; // Delay function function delay(time) { return new Promise(function(resolve) { setTimeout(resolve, time); }); } // Wait for label with specific content to exist function labelReady(content) { return new Promise((resolve, reject) => { new MutationObserver((mutationRecords, observer) => { Array.from(document.querySelectorAll('label')).forEach((element) => { if (element.textContent.trim() === content) { console.log(`Label with content "${content}" found.`); resolve(element); observer.disconnect(); } }); }) .observe(document.documentElement, {childList: true, subtree: true}); }); } function generatePassword(length) { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+~`|}{[]:;?><,./-="; let retVal = ""; for (let i = 0, n = charset.length; i < length; ++i) { retVal += charset.charAt(Math.floor(Math.random() * n)); } return retVal; } function generateUsername(length) { let result = ''; const characters = '0123456789'; const charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } // Wait for element to exist function elementReady(selector) { return new Promise((resolve, reject) => { let el = document.querySelector(selector); if (el) { resolve(el); } new MutationObserver((mutationRecords, observer) => { // Query for elements matching the specified selector Array.from(document.querySelectorAll(selector)).forEach((element) => { resolve(element); //Once we have resolved we don't need the observer anymore. observer.disconnect(); }); }) .observe(document.documentElement, {childList: true, subtree: true}); }); } async function signup(email) { const password = generatePassword(12); const username = generateUsername(Math.floor(Math.random() * 5) + 8); console.log("Waiting for label..."); await labelReady("Enter your email*"); console.log("Starting signup process..."); await elementReady(".js-continue-container").then(element => element.click()); await delay(1000); await elementReady("#email").then(element => element.value = email); await elementReady(".mx-1").then(element => element.click()); await elementReady("#email-container .js-continue-button").then(element => element.click()); await delay(1000); await elementReady("#password").then(element => {element.click(); element.value = password;}); await elementReady(".mx-1").then(element => element.click()); await elementReady("#password-container .js-continue-button").then(element => element.click()); await delay(1000); await elementReady("#login").then(element => {element.click(); element.value = username;}); await elementReady(".mx-1").then(element => element.click()); await elementReady("#username-container .js-continue-button").then(element => element.click()); await elementReady("#opt-in-container .js-continue-button").then(element => element.click()); await elementReady("button[name=button]").then(element => element.click()); console.log("Signup process completed."); // Store the email in localStorage after signup localStorage.setItem('email', email); } async function getEmail() { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: "http://127.0.0.1:5000/get_email", onload: function(response) { console.log('http://127.0.0.1:5000/get_email',response.responseText) const data = JSON.parse(response.responseText); if (data.account) { resolve(data.account); } else { reject('Failed to get email'); } } }); }); } async function getVerificationCode(email) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: `http://127.0.0.1:5000/get_verification_code?account=${email}`, onload: function(response) { console.log(response.responseText) const data = JSON.parse(response.responseText); if (data.verification_code) { resolve(data.verification_code); } else { reject('Failed to get verification code'); } } }); }); } async function fillVerificationCode(code) { const codeInputs = Array.from(document.querySelectorAll('.form-control.input-monospace')); const codeArray = code.split(''); codeInputs.forEach((input, index) => { if (codeArray[index]) { input.value = codeArray[index]; input.dispatchEvent(new Event('input', { bubbles: true, cancelable: true })); } }); } async function checkVerificationCode(email) { while (true) { try { const code = await getVerificationCode(email); if (code) { fillVerificationCode(code); break; } } catch (error) { console.error(error); } await delay(3000); } } console.log("Script loaded, waiting for page load..."); window.addEventListener('load', async function() { console.log("Page loaded, starting script..."); if (window.location.href === 'https://github.com/signup?source=login') { console.log('start get eamil') let email = await getEmail(); signup(email); } else if (window.location.href === 'https://github.com/account_verifications?recommend_plan=true') { // Retrieve the email from localStorage on the verification page let email = localStorage.getItem('email'); if (email) { checkVerificationCode(email); } } }, false); })();