FreeCryptoRotator-2

Script to claim faucets

  1. // ==UserScript==
  2. // @name FreeCryptoRotator-2
  3. // @namespace FreeCryptoRotator-2
  4. // @version 2.2
  5. // @description Script to claim faucets
  6. // @author sacko
  7. // @match https://faucetbeast.com/*
  8. // @match https://get-bitcoin.net/*
  9. // @match https://claimbits.net/*
  10. // @match https://getdoge.io/*
  11. // @match https://cryptowin.io/*
  12. // @match https://www.cryptowin.io/*
  13. // @match https://earnbitmoon.club/*
  14. // @match https://www.minijobwork.com/*
  15. // @match https://lunarcrush.com/*
  16. // @match https://betfury.io/*
  17. // @connect claimbits.net
  18. // @connect get-bitcoin.net
  19. // @connect cryptowin.io
  20. // @connect getdoge.io
  21. // @connect faucetbeast.com
  22. // @connect earnbitmoon.club
  23. // @connect www.minijobwork.com
  24. // @connect lunarcrush.com
  25. // @connect betfury.io
  26. // @grant GM_xmlhttpRequest
  27.  
  28.  
  29. // ==/UserScript==
  30. (function() {
  31. 'use strict';
  32.  
  33. //List of the faucet websites
  34. //Comment the lines of url if you don't use them
  35. var websiteData = [
  36.  
  37. {url : "https://getdoge.io/faucet.html"},
  38. {url : "https://get-bitcoin.net/faucet.html"},
  39. {url : "https://cryptowin.io/faucet"},
  40. {url : "https://claimbits.net/faucet.html"},
  41. {url : "https://faucetbeast.com/faucet/free-ethereum", regex: "free-ethereum"},
  42. {url : "https://faucetbeast.com/faucet/free-dogecoin", regex: "free-dogecoin"},
  43. {url : "https://earnbitmoon.club/"},
  44. {url : "https://www.minijobwork.com/earn_free_usd"},
  45. {url : "https://betfury.io/boxes/all"},
  46. {url : "https://lunarcrush.com/"},
  47. ];
  48.  
  49. //Message selectors are for success or failure to move on to the next website
  50. //Add only domain name in website as mentioned below. Follow the same pattern.
  51. //Use arrays wherever it is required
  52. var websiteMap = [
  53.  
  54. {website : ["get-bitcoin.net","getdoge.io"],
  55. defaultButtonSelectors: ["#claimFaucet > a"],
  56. toggleCaptchaSelector:[".modal-dialog .form-control"],
  57. toggleCaptchaSelectorIndex: 1,
  58. captchaButtonSubmitSelector: ".btn-rounded.btn-sm.w-30.mb-0",
  59. allMessageSelectors: [".alert.alert-success",".alert.alert-danger", "#main-container h1"],
  60. messagesToCheckBeforeMovingToNextUrl: ["can claim again","you won", "Sucuri Website Firewall"],
  61. additionalFunctions: getBitcoinDoge},
  62. {website : ["claimbits.net","earnbitmoon.club"],
  63. defaultButtonSelectors: ["#claimFaucet > button"],
  64. toggleCaptchaSelector:["#toggleCaptcha"],
  65. toggleCaptchaSelectorIndex: 1,
  66. captchaButtonSubmitSelector: "#rollFaucet > button",
  67. allMessageSelectors: [".alert.alert-success",".alert.alert-danger"],
  68. messagesToCheckBeforeMovingToNextUrl: ["can claim again","you won"],
  69. timeoutbeforeMovingToNextUrl: 60000},
  70.  
  71. {website : "cryptowin.io",
  72. defaultButtonSelectors: [".btn.btn-block.btn-click.btn-lg"],
  73. captchaButtonSubmitSelector: ".btn.btn-block.btn-success.btn-lg",
  74. allMessageSelectors: [".alert.alert-success",".alert.alert-danger","script",".text-center"],
  75. messagesToCheckBeforeMovingToNextUrl: ["claim again in","you won","You reached the maximum"],
  76. additionalFunctions: cryptowin},
  77.  
  78. {website: "faucetbeast.com",
  79. defaultButtonSelectors: [".btn-get-started.btn-block.mt-0"],
  80. captchaButtonSubmitSelector: ".btn-get-started.mt-0",
  81. allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".alert.alert-info"],
  82. messagesToCheckBeforeMovingToNextUrl: ["was sent to your","insufficient","claim again"]},
  83.  
  84. {website: "minex.world",
  85. defaultButtonSelectors: ["#get-bonus"],
  86. allMessageSelectors: ["#get-bonus"],
  87. messagesToCheckBeforeMovingToNextUrl: [":"],
  88. timeoutbeforeMovingToNextUrl: 20000},
  89.  
  90.  
  91. {website: "minijobwork.com",
  92. defaultButtonSelectors: [".btn.btn-info.reward"],
  93. captchaButtonSubmitSelector: ".btn.btn-success.btn-sm",
  94. allMessageSelectors: [".btn.btn-danger"],
  95. messagesToCheckBeforeMovingToNextUrl: [],
  96. additionalFunctions : minijobwork,
  97. timeoutbeforeMovingToNextUrl: 60000},
  98. {website : ["betfury.io"],
  99. captchaButtonSubmitSelector: ["button.button.button_md.button_red.fullwidth"],
  100. allMessageSelectors: [".alert.alert-success",".alert.alert-danger",".alert.alert-info", "body", "#timer"],
  101. messagesToCheckBeforeMovingToNextUrl: ["There might be Server's Fault", "Next Roll Waiting Time"],
  102. additionalFunctions : betfury,
  103. timeoutbeforeMovingToNextUrl: 180000},
  104.  
  105.  
  106. ];
  107.  
  108. //HtmlEvents dispatcher
  109. function triggerEvent(el, type) {
  110. try{
  111. var e = document.createEvent('HTMLEvents');
  112. e.initEvent(type, false, true);
  113. el.dispatchEvent(e);
  114. }catch(exception){
  115. console.log(exception);
  116. }
  117. }
  118.  
  119. function toggleCaptcha(selector, index){
  120. if( document.querySelector(selector)){
  121. document.querySelector(selector).selectedIndex = index;
  122. var targetNode = document.querySelector(selector);
  123. if (targetNode) {
  124. setTimeout(function() {
  125. triggerEvent(targetNode, 'change');
  126. }, 5000);
  127. }
  128. }
  129. }
  130.  
  131. //Check if a string is present in Array
  132. String.prototype.includesOneOf = function(arrayOfStrings) {
  133.  
  134. //If this is not an Array, compare it as a String
  135. if (!Array.isArray(arrayOfStrings)) {
  136. return this.toLowerCase().includes(arrayOfStrings.toLowerCase());
  137. }
  138.  
  139. for (var i = 0; i < arrayOfStrings.length; i++) {
  140. if (this.toLowerCase().includes(arrayOfStrings[i].toLowerCase())) {
  141. return true;
  142. }
  143. }
  144. return false;
  145. }
  146.  
  147. var websiteDataValues = {};
  148. var clicked = false;
  149.  
  150. //Get selector details from the websiteMap
  151. for (let value of Object.values(websiteMap)) {
  152. if(window.location.href.includesOneOf(value.website)){
  153. websiteDataValues.inputTextSelector= value.inputTextSelector;
  154. websiteDataValues.inputTextSelectorButton = value.inputTextSelectorButton;
  155. websiteDataValues.defaultButtonSelectors = value.defaultButtonSelectors;
  156. websiteDataValues.claimButtonSelector = value.claimButtonSelector;
  157. websiteDataValues.captchaButtonSubmitSelector = value.captchaButtonSubmitSelector;
  158. websiteDataValues.loginSelectors = value.loginSelectors;
  159. websiteDataValues.allMessageSelectors = value.allMessageSelectors;
  160. websiteDataValues.messagesToCheckBeforeMovingToNextUrl = value.messagesToCheckBeforeMovingToNextUrl;
  161. websiteDataValues.withdrawPageUrl = value.withdrawPageUrl;
  162. websiteDataValues.withdrawEnabled = value.withdrawEnabled;
  163. websiteDataValues.balanceSelector = value.balanceSelector;
  164. websiteDataValues.withdrawMinAmount = value.withdrawMinAmount;
  165. websiteDataValues.successMessageSelectors = value.successMessageSelectors;
  166. websiteDataValues.toggleCaptchaSelector = value.toggleCaptchaSelector;
  167. websiteDataValues.toggleCaptchaSelectorIndex = value.toggleCaptchaSelectorIndex;
  168. websiteDataValues.timeoutbeforeMovingToNextUrl = value.timeoutbeforeMovingToNextUrl;
  169. websiteDataValues.additionalFunctions = value.additionalFunctions;
  170. break;
  171. }
  172. }
  173.  
  174. //Identify which coin to input, based on the url input
  175. //If the URL does not contain the coin, then use the default from the domain name
  176. var count = 0;
  177. var addressAssigned = false;
  178. for (let value of Object.values(websiteData)) {
  179. count = count + 1;
  180. if(window.location.href.includes("/" + value.regex)){
  181. addressAssigned = true;
  182. break;
  183. }
  184. }
  185.  
  186. //If URL does not have coin, check the default from the domain name
  187. if(!addressAssigned){
  188. count = 0;
  189. for (let value of Object.values(websiteData)) {
  190. count = count + 1;
  191. if(value.url.includes(window.location.hostname)){
  192. break;
  193. }
  194. }
  195. }
  196.  
  197.  
  198. //Get the next Url from the website data map
  199. async function getNextUrl(){
  200.  
  201. //Go to the beginning if the end of the array is reached
  202. if(count >= websiteData.length){
  203. count = 0;
  204. websiteDataValues.nextUrl = websiteData[count].url;
  205. }else{
  206. websiteDataValues.nextUrl = websiteData[count].url;
  207. }
  208.  
  209. //Ping Test to check if a website is up before proceeding to next url
  210. pingTest(websiteDataValues.nextUrl);
  211. }
  212.  
  213. var isNextUrlReachable = false;
  214. //Get the next Url from the website
  215. function pingTest(websiteUrl) {
  216. console.log(websiteUrl);
  217. GM_xmlhttpRequest({
  218. method: "GET",
  219. url: websiteUrl,
  220. headers: {
  221. "Content-Type": "application/x-www-form-urlencoded"
  222. },
  223. timeout: 5000,
  224. onload: function(response) {
  225. //Website is reachable
  226. isNextUrlReachable = true;
  227. },
  228. onerror: function(e) {
  229. count=count+1;
  230. getNextUrl();
  231. },
  232. ontimeout: function() {
  233. count=count+1;
  234. getNextUrl();
  235. },
  236. });
  237.  
  238. }
  239.  
  240.  
  241. async function delay(ms) {
  242. return new Promise(resolve => setTimeout(resolve, ms))
  243. }
  244.  
  245.  
  246. var movingToNextUrl = false;
  247. async function goToNextUrl() {
  248. console.log("Going to next Url");
  249. if(!movingToNextUrl){
  250. movingToNextUrl = true;
  251. getNextUrl();
  252. while (!isNextUrlReachable) {
  253. await delay(3000);
  254. }
  255. window.location.href = websiteDataValues.nextUrl;
  256. }
  257. }
  258.  
  259. async function goToWithdrawPage() {
  260. if(!movingToNextUrl){
  261. movingToNextUrl = true;
  262. window.location.href = websiteDataValues.withdrawPageUrl;
  263. }
  264.  
  265. }
  266.  
  267.  
  268. //Default Setting: After 120 seconds go to next Url
  269. var delayBeforeMovingToNextUrl = 120000;
  270. if(websiteDataValues.timeoutbeforeMovingToNextUrl){
  271. delayBeforeMovingToNextUrl = websiteDataValues.timeoutbeforeMovingToNextUrl;
  272. }
  273.  
  274. setTimeout(function(){
  275. goToNextUrl();
  276. },delayBeforeMovingToNextUrl);
  277.  
  278.  
  279. //Returns true if message selectors are present
  280. function messageSelectorsPresent(){
  281. if(websiteDataValues.allMessageSelectors){
  282. for(var j=0;j<websiteDataValues.allMessageSelectors.length;j++){
  283. for(var k=0; k< document.querySelectorAll(websiteDataValues.allMessageSelectors[j]).length;k++){
  284. if(document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k] &&
  285. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl) ||
  286. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value &&
  287. document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)))){
  288. return true;
  289. }
  290. }
  291. }
  292. }
  293. return false;
  294. }
  295.  
  296. //Returns true if message selectors are present
  297. function successMessageSelectorsPresent(){
  298. if(websiteDataValues.successMessageSelectors){
  299. for(var j=0;j<websiteDataValues.successMessageSelectors.length;j++){
  300. for(var k=0; k< document.querySelectorAll(websiteDataValues.successMessageSelectors[j]).length;k++){
  301. if(document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k] && document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)){
  302. return true;
  303. }
  304. }
  305. }
  306. }
  307. return false;
  308. }
  309.  
  310.  
  311. function minijobwork(){
  312. if( document.querySelector("#count") && document.querySelector("#count").style.display != 'none') {
  313. websiteDataValues.messagesToCheckBeforeMovingToNextUrl = [":"];
  314. }
  315.  
  316. }
  317. function betfury() {
  318.  
  319. var withdrawButtonVisible = false;
  320. for(let i=0; i<document.querySelectorAll(".free-box__button button").length; i++) {
  321. if(!document.querySelectorAll(".free-box__button button")[i].disabled){
  322. withdrawButtonVisible = true;
  323. document.querySelectorAll(".free-box__button button")[i].click();
  324. break;
  325. }
  326. }
  327. if(!withdrawButtonVisible){
  328. goToNextUrl();
  329. }
  330.  
  331. var interval = setInterval(function(){
  332. if(clicked){
  333. clearInterval(interval);
  334. setTimeout(function(){
  335. window.location.reload();
  336.  
  337. },5000)
  338. }
  339. },5000);
  340.  
  341. }
  342. function getRGBFromData(data){
  343. var hashMap = new Map();
  344. var maxRGB;
  345. var maxCount = 0;
  346. for(let i=0;i <data.length;i=i+4){
  347. let rgb = data[i].toString() + "," + data[i+1].toString() + "," + data[i+2].toString();
  348. if(data[i+3] > 127){
  349. if(hashMap.has(rgb)){
  350. hashMap.set(rgb, hashMap.get(rgb)+1)
  351. if(maxCount < hashMap.get(rgb)){
  352. maxCount = hashMap.get(rgb);
  353. maxRGB = [data[i],data[i+1],data[i+2]];
  354. }
  355. }
  356. else{
  357. hashMap.set(rgb, 1)
  358. }
  359. }
  360. }
  361.  
  362. return maxRGB;
  363. }
  364.  
  365. function getBitcoinDoge(){
  366.  
  367. try{
  368. var j =0;
  369. var leastDifference = 10000;
  370. if(document.querySelector("div.modal-body img") && document.querySelectorAll("button[class='btn btn-lg']").length > 3){
  371.  
  372. let image = document.querySelector("div.modal-body img");
  373. let c = document.createElement("canvas");
  374. c.width = image.width;
  375. c.height = image.height;
  376. var ctx = c.getContext("2d");
  377. ctx.drawImage(image, 0, 0);
  378. var imageData = ctx.getImageData(0, 0, c.width, c.height);
  379. var data = imageData.data;
  380. var questionRGB = getRGBFromData(data);
  381.  
  382. //compare with the answers
  383. for(let i=0;i< document.querySelectorAll("button[class='btn btn-lg']").length;i++){
  384. let canva = document.createElement("canvas");
  385. canva.width = image.width;
  386. canva.height = image.height;
  387. let canvatx = canva.getContext("2d");
  388. canvatx.fillStyle = document.querySelectorAll("button[class='btn btn-lg']")[i].style.backgroundColor;
  389. canvatx.fillRect(0, 0,canva.width,canva.height);
  390. let imageData = canvatx.getImageData(0, 0,canva.width,canva.height);
  391. let rgb = getRGBFromData(imageData.data);
  392.  
  393. if(Math.abs(questionRGB[0]-rgb[0]) + Math.abs(questionRGB[1]-rgb[1]) + Math.abs(questionRGB[2]-rgb[2]) < leastDifference){
  394. leastDifference = Math.abs(questionRGB[0]-rgb[0]) + Math.abs(questionRGB[1]-rgb[1]) + Math.abs(questionRGB[2]-rgb[2]);
  395. j = i;
  396. }
  397.  
  398. if(Math.abs(questionRGB[0]-rgb[0])<= 30 && Math.abs(questionRGB[1]-rgb[1]) <= 30 && Math.abs(questionRGB[2]-rgb[2]) <= 30){
  399. break;
  400. }
  401. }
  402.  
  403. console.log("Closest Matching Colour");
  404. console.log(document.querySelectorAll("button[class='btn btn-lg']")[j].style.backgroundColor);
  405. document.querySelectorAll("button[class='btn btn-lg']")[j].click();
  406.  
  407. setTimeout(function(){
  408. if(document.querySelector("#NXReportButton")){
  409. document.querySelector("#NXReportButton").click();
  410. }
  411. setTimeout(function(){
  412. for(var hc=0; hc < document.querySelectorAll("iframe").length; hc++){
  413. if(document.querySelectorAll("iframe")[hc] &&
  414. document.querySelectorAll("iframe")[hc].hasAttribute("data-hcaptcha-response")){
  415. return;
  416. }
  417. }
  418. if(document.querySelector(".btn-rounded.btn-sm.w-30.mb-0")){
  419. document.querySelector(".btn-rounded.btn-sm.w-30.mb-0").click();
  420. }
  421. setTimeout(function(){
  422. if(messageSelectorsPresent()){
  423. goToNextUrl();
  424. }
  425. },5000);
  426. },5000);
  427. },5000);
  428. }
  429.  
  430.  
  431. }catch(e){
  432. //console.log(e);
  433. }
  434. }
  435.  
  436.  
  437. function cryptowin(){
  438. if(document.querySelector("#dropdownList")){
  439. document.querySelector("#dropdownList").click();
  440. }
  441. if(document.querySelector("#claim div.modal-body > div.ad_box center li > a") &&
  442. document.querySelector("#claim div.modal-body > div.ad_box center li > a").innerText == "hCAPTCHA"){
  443. document.querySelector("#claim div.modal-body > div.ad_box center li > a").click()
  444. }
  445. }
  446.  
  447.  
  448. setTimeout(function(){
  449.  
  450. if( websiteDataValues.additionalFunctions){
  451. websiteDataValues.additionalFunctions();
  452. }
  453.  
  454.  
  455. if(websiteDataValues.withdrawEnabled){
  456. if(websiteDataValues.balanceSelector && document.querySelector(websiteDataValues.balanceSelector)){
  457. var currentBalance = document.querySelector(websiteDataValues.balanceSelector).innerText;
  458. if(currentBalance > websiteDataValues.withdrawMinAmount && !window.location.href.includes(websiteDataValues.withdrawPageUrl)) {
  459. goToWithdrawPage();
  460. }
  461.  
  462. }else{
  463. if(successMessageSelectorsPresent()){
  464. goToWithdrawPage();
  465. }
  466. }
  467. }
  468.  
  469. //Look for all the default messages or errors before proceeding to next url
  470. //For other languages difference in the length of the strings can be compared or visibility of the style element
  471. if(!movingToNextUrl && messageSelectorsPresent()){
  472. goToNextUrl();
  473. }
  474. //Check for all the default button selectors and click
  475. //This will only click the first selector found, so mention the selectors with parent element wherever required
  476. if(!movingToNextUrl && websiteDataValues.defaultButtonSelectors){
  477. for(var i=0;i<websiteDataValues.defaultButtonSelectors.length ;i++){
  478. if(document.querySelector(websiteDataValues.defaultButtonSelectors[i])){
  479. triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mousedown');
  480. triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mouseup');
  481. document.querySelector(websiteDataValues.defaultButtonSelectors[i]).click();
  482. break;
  483. }
  484. }
  485. }
  486.  
  487. if(!movingToNextUrl && websiteDataValues.toggleCaptchaSelector && Number.isInteger(websiteDataValues.toggleCaptchaSelectorIndex)){
  488. toggleCaptcha(websiteDataValues.toggleCaptchaSelector,websiteDataValues.toggleCaptchaSelectorIndex);
  489. }
  490.  
  491.  
  492. //Input the address and click the login button
  493. if(!movingToNextUrl && document.querySelector(websiteDataValues.inputTextSelector)){
  494. document.querySelector(websiteDataValues.inputTextSelector).value = websiteDataValues.address;
  495. setTimeout(function(){
  496. if(websiteDataValues.inputTextSelectorButton && document.querySelector(websiteDataValues.inputTextSelectorButton)){
  497. document.querySelector(websiteDataValues.inputTextSelectorButton).click();
  498. }
  499.  
  500. },5000);
  501. }
  502.  
  503. //Click the form button after solving captcha
  504. //Works for both recaptcha and hcaptcha
  505. var captchaInterval = setInterval(function(){
  506. try{
  507. if(!clicked && unsafeWindow.grecaptcha && unsafeWindow.grecaptcha.getResponse().length > 0){
  508. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).click();
  509. clicked = true;
  510.  
  511. clearInterval(captchaInterval);
  512. setTimeout(function(){
  513. if(messageSelectorsPresent()){
  514. goToNextUrl();
  515. }
  516. },5000);
  517. }
  518. }catch(e){
  519.  
  520. }
  521.  
  522. for(var hc=0; hc < document.querySelectorAll("iframe").length; hc++){
  523. if(! clicked && document.querySelectorAll("iframe")[hc] &&
  524. document.querySelectorAll("iframe")[hc].hasAttribute("data-hcaptcha-response") &&
  525. document.querySelectorAll("iframe")[hc].getAttribute("data-hcaptcha-response").length > 0) {
  526. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).click();
  527. clicked = true;
  528. clearInterval(captchaInterval);
  529. setTimeout(function(){
  530. if(messageSelectorsPresent()){
  531. goToNextUrl();
  532. }
  533. },5000);
  534. }
  535. }
  536.  
  537. },5000);
  538.  
  539.  
  540. },7000);
  541.  
  542.  
  543.  
  544. })();