您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automate github signup
// ==UserScript== // @name GitHub Auto Signup // @version 0.6.3 // @description Automate github signup // @author Young Jimmy // @match https://github.com/signup* // @match https://github.com/signup?source=login // @match https://github.com/login?return_to=*device* // @match https://github.com/account_verifications?recommend_plan=true // @grant GM_xmlhttpRequest // @connect 127.0.0.1 // @license MIT // @namespace https://gf.qytechs.cn/users/1218336 // ==/UserScript== (function() { 'use strict'; // 创建日志框 var logBox = document.createElement("div"); logBox.style.position = "fixed"; logBox.style.width = "200px"; logBox.style.height = "200px"; logBox.style.overflowY = "scroll"; logBox.style.border = "1px solid black"; logBox.style.padding = "5px"; logBox.style.backgroundColor = "rgba(255, 255, 255, 0.5)"; // 半透明白色背景 logBox.style.zIndex = "9999"; logBox.style.bottom = "0"; // 放在页面左下角 document.body.appendChild(logBox); // 让日志框可以拖动 logBox.onmousedown = function(event) { event.preventDefault(); var shiftX = event.clientX - logBox.getBoundingClientRect().left; var shiftY = event.clientY - logBox.getBoundingClientRect().top; logBox.style.position = 'absolute'; document.body.append(logBox); moveAt(event.pageX, event.pageY); function moveAt(pageX, pageY) { logBox.style.left = pageX - shiftX + 'px'; logBox.style.top = pageY - shiftY + 'px'; } function onMouseMove(event) { moveAt(event.pageX, event.pageY); } document.addEventListener('mousemove', onMouseMove); logBox.onmouseup = function() { document.removeEventListener('mousemove', onMouseMove); logBox.onmouseup = null; }; }; logBox.ondragstart = function() { return false; }; // 将日志添加到框中的函数 unsafeWindow.logMessage = function(message) { var p = document.createElement("p"); p.textContent = message; logBox.appendChild(p); logBox.scrollTop = logBox.scrollHeight; // 自动滚动到底部 }; // 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) { logMessage(`Label with content "${content}" found.`); resolve(element); observer.disconnect(); } }); }) .observe(document.documentElement, {childList: true, subtree: true}); }); } function generatePassword(length) { const lowercase = "abcdefghijklmnopqrstuvwxyz"; const uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const numbers = "0123456789"; const symbols = "!@#$%^&*()_+~`|}{[]:;?><,./-="; // Ensure the length is at least 4 to accommodate all character types. if (length < 4) { logMessage("Password length must be at least 4."); return null; } let password = ""; password += lowercase.charAt(Math.floor(Math.random() * lowercase.length)); password += uppercase.charAt(Math.floor(Math.random() * uppercase.length)); password += numbers.charAt(Math.floor(Math.random() * numbers.length)); password += symbols.charAt(Math.floor(Math.random() * symbols.length)); for (let i = 4, n = lowercase.length + uppercase.length + numbers.length + symbols.length; i < length; ++i) { let randomPickedSet; switch(Math.floor(Math.random() * 4)) { case 0: randomPickedSet = lowercase; break; case 1: randomPickedSet = uppercase; break; case 2: randomPickedSet = numbers; break; case 3: randomPickedSet = symbols; break; } password += randomPickedSet.charAt(Math.floor(Math.random() * randomPickedSet.length)); } // Shuffle the result to ensure randomness password = password.split('').sort(function(){return 0.5-Math.random()}).join(''); return password; } 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() { const password = generatePassword(12); const username = generateUsername(Math.floor(Math.random() * 5) + 8); logMessage("Waiting for label..."); await labelReady("Enter your email*"); logMessage('start get eamil') let email = await getEmail(); logMessage('API get email '+ email) logMessage("Starting signup process..."); localStorage.setItem('email', email); localStorage.setItem(email, password); 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()); observeAttributeChange('.js-octocaptcha-form-submit', (node) => { return !node.hasAttribute('disabled') && !node.hasAttribute('hidden'); }).then((node) => { node.click(); }).catch((error) => { console.error(error); }); await labelReady("Email preferences*"); await elementReady("#opt_in").then(element => element.click()); await elementReady('#opt_in').then(element =>{ element.checked= false;}); await elementReady('#opt_in').then(element =>{ element.checked= false;}); await elementReady("button[name=button]").then(element => element.click()); logMessage("Signup process completed."); // Store the email in localStorage after signup localStorage.setItem('email', email); localStorage.setItem(email, password); } async function getEmail() { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: "http://127.0.0.1:9191/get_email", onload: function(response) { 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:9191/get_verification_code?account=${email}`, onload: function(response) { logMessage(response.responseText) const data = JSON.parse(response.responseText); if (data.verification_code) { resolve(data.verification_code); } else { reject('Failed to get verification code'); } } }); }); } function observeAttributeChange(selector, condition) { return new Promise((resolve, reject) => { // 获取目标节点 const targetNode = document.querySelector(selector); if (!targetNode) { reject('No element found with the given selector.'); return; } // 检查元素是否已经满足条件 if (condition(targetNode)) { resolve(targetNode); // 如果已经满足,直接返回该元素 return; } // 设置观察器配置项 const config = { attributes: true }; // 创建一个观察器实例并传入回调函数 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (condition(targetNode)) { observer.disconnect(); // 停止观察 resolve(targetNode); // 返回符合条件的DOM元素 } }); }); // 开始观察目标节点 observer.observe(targetNode, config); }); } 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); } } logMessage("Script loaded, waiting for page load..."); window.addEventListener('load', async function() { logMessage("Page loaded, starting script..."); if (window.location.href === 'https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Flogin%2Fdevice') { window.location.replace('https://github.com/signup?source=login'); } if (window.location.href === 'https://github.com/signup?source=login' || window.location.href ==='https://github.com/signup') { signup(); } 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'); logMessage('checkVerificationCode '+ email) if (email) { checkVerificationCode(email); } } }, false); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址