GitHub Auto Signup

Automate github signup

当前为 2024-02-21 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name GitHub Auto Signup
  3. // @version 0.1
  4. // @description Automate github signup
  5. // @author Young Jimmy
  6. // @match https://github.com/signup*
  7. // @grant none
  8. // @license MIT
  9. // @namespace https://greasyfork.org/users/1218336
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Delay function
  16. function delay(time) {
  17. return new Promise(function(resolve) {
  18. setTimeout(resolve, time);
  19. });
  20. }
  21.  
  22. // Wait for label with specific content to exist
  23. function labelReady(content) {
  24. return new Promise((resolve, reject) => {
  25. new MutationObserver((mutationRecords, observer) => {
  26. Array.from(document.querySelectorAll('label')).forEach((element) => {
  27. if (element.textContent.trim() === content) {
  28. console.log(`Label with content "${content}" found.`);
  29. resolve(element);
  30. observer.disconnect();
  31. }
  32. });
  33. })
  34. .observe(document.documentElement, {childList: true, subtree: true});
  35. });
  36. }
  37.  
  38. function generatePassword(length) {
  39. const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+~`|}{[]:;?><,./-=";
  40. let retVal = "";
  41. for (let i = 0, n = charset.length; i < length; ++i) {
  42. retVal += charset.charAt(Math.floor(Math.random() * n));
  43. }
  44. return retVal;
  45. }
  46.  
  47. function generateUsername(length) {
  48. let result = '';
  49. const characters = '0123456789';
  50. const charactersLength = characters.length;
  51. for (let i = 0; i < length; i++) {
  52. result += characters.charAt(Math.floor(Math.random() * charactersLength));
  53. }
  54. return result;
  55. }
  56.  
  57. async function signup(email) {
  58. const password = generatePassword(12);
  59. const username = generateUsername(Math.floor(Math.random() * 5) + 8);
  60.  
  61. console.log("Waiting for label...");
  62. await labelReady("Enter your email*");
  63.  
  64. console.log("Starting signup process...");
  65. await elementReady(".js-continue-container").then(element => element.click());
  66. await delay(1000);
  67.  
  68. await elementReady("#email").then(element => element.value = email);
  69. await elementReady(".mx-1").then(element => element.click());
  70. await elementReady("#email-container .js-continue-button").then(element => element.click());
  71. await delay(1000);
  72.  
  73. await elementReady("#password").then(element => {element.click(); element.value = password;});
  74. await elementReady(".mx-1").then(element => element.click());
  75. await elementReady("#password-container .js-continue-button").then(element => element.click());
  76. await delay(1000);
  77.  
  78. await elementReady("#login").then(element => {element.click(); element.value = username;});
  79. await elementReady(".mx-1").then(element => element.click());
  80. await elementReady("#username-container .js-continue-button").then(element => element.click());
  81. await elementReady("#opt-in-container .js-continue-button").then(element => element.click());
  82. await elementReady("button[name=button]").then(element => element.click());
  83.  
  84. console.log("Signup process completed.");
  85. }
  86.  
  87. // Wait for element to exist
  88. function elementReady(selector) {
  89. return new Promise((resolve, reject) => {
  90. let el = document.querySelector(selector);
  91. if (el) { resolve(el); }
  92. new MutationObserver((mutationRecords, observer) => {
  93. // Query for elements matching the specified selector
  94. Array.from(document.querySelectorAll(selector)).forEach((element) => {
  95. resolve(element);
  96. //Once we have resolved we don't need the observer anymore.
  97. observer.disconnect();
  98. });
  99. })
  100. .observe(document.documentElement, {childList: true, subtree: true});
  101. });
  102. }
  103.  
  104. console.log("Script loaded, waiting for page load...");
  105. window.addEventListener('load', function() {
  106. console.log("Page loaded, starting script...");
  107. let email = "test@test.com";
  108. signup(email);
  109. }, false);
  110.  
  111. })();