Greasy Fork is available in English.

Faucet Rotator - Lobster Coins

Earn free crypto using this script instantly

  1. // ==UserScript==
  2. // @name Faucet Rotator - Lobster Coins
  3. // @namespace Faucet Rotator - Lobster Coins
  4. // @version 1.7
  5. // @description Earn free crypto using this script instantly
  6. // @author BleemV
  7. // @match https://lobstercoins.com/*
  8. // @connect lobstercoins.com
  9. // @icon https://www.google.com/s2/favicons?sz=64&domain=lobstercoins.com
  10. // @noframes
  11. // @grant GM_setValue
  12. // @grant GM_getValue
  13. // @grant GM_xmlhttpRequest
  14. // @antifeature referral-link
  15. // ==/UserScript==
  16.  
  17. //Block All Pop ups
  18. unsafeWindow.open = function() { };
  19.  
  20. (function() {
  21. 'use strict';
  22.  
  23. //===============================================================================================
  24. //User configuration
  25.  
  26. var faucetpayEmail = "ENTER_YOUR_FAUCETPAY_EMAIL_ADDRESS";
  27. var btc = "ENTER_YOUR_FAUCETPAY_BITCOIN_ADDRESS";
  28. var doge = "ENTER_YOUR_FAUCETPAY_DOGE_ADDRESS";
  29. var ltc = "ENTER_YOUR_FAUCETPAY_LITECOIN_ADDRESS";
  30. var trx = "ENTER_YOUR_FAUCETPAY_TRON_ADDRESS";
  31. var bnb = "ENTER_YOUR_FAUCETPAY_BINANCE_ADDRESS";
  32. var sol = "ENTER_YOUR_FAUCETPAY_SOLANA_ADDRESS";
  33. var usdt = "ENTER_YOUR_FAUCETPAY_TETHER_ADDRESS";
  34. var matic = "ENTER_YOUR_FAUCETPAY_POLYGON_ADDRESS";
  35. var eth = "ENTER_YOUR_FAUCETPAY_ETHEREUM_ADDRESS";
  36. var bch = "ENTER_YOUR_FAUCETPAY_BITCOINCASH_ADDRESS";
  37. var dash = "ENTER_YOUR_FAUCETPAY_DASH_ADDRESS";
  38. var zec = "ENTER_YOUR_FAUCETPAY_ZCASH_ADDRESS";
  39. var dgb = "ENTER_YOUR_FAUCETPAY_DIGIBYTE_ADDRESS";
  40.  
  41. //You can now save the file and start using
  42. //===============================================================================================
  43.  
  44. //List of the faucet websites along with address
  45. //coin parameter is used as regex from the url
  46. //If url has */bitcoin/* then use "bitcoin" as coin, if it is */ETH/*, use "ETH" as coin
  47. //If there is no regex for coin, use only address
  48. // Comment the faucets which you do not wish to use or which don't have sufficient funds
  49. // Always add bitcoin before bitcoincash if you using same domains
  50.  
  51. var websiteData = [
  52. { url: "https://lobstercoins.com/bitcoin-faucet/?r=bleem.rapid@gmail.com", coin: "bitcoin-faucet", address: faucetpayEmail },
  53. { url: "https://lobstercoins.com/dogecoin-faucet/?r=bleem.rapid@gmail.com", coin: "dogecoin-faucet", address: faucetpayEmail },
  54. { url: "https://lobstercoins.com/litecoin-faucet/?r=bleem.rapid@gmail.com", coin: "litecoin-faucet", address: faucetpayEmail },
  55. { url: "https://lobstercoins.com/tron-faucet/?r=bleem.rapid@gmail.com", coin: "tron-faucet", address: faucetpayEmail },
  56. { url: "https://lobstercoins.com/bnb-faucet/?r=bleem.rapid@gmail.com", coin: "bnb-faucet", address: faucetpayEmail },
  57. { url: "https://lobstercoins.com/solana-faucet/?r=bleem.rapid@gmail.com", coin: "solana-faucet", address: faucetpayEmail },
  58. { url: "https://lobstercoins.com/tether-faucet/?r=bleem.rapid@gmail.com", coin: "tether-faucet", address: faucetpayEmail },
  59. { url: "https://lobstercoins.com/polygon-faucet/?r=bleem.rapid@gmail.com", coin: "polygon-faucet", address: faucetpayEmail },
  60. { url: "https://lobstercoins.com/ethereum-faucet/?r=bleem.rapid@gmail.com", coin: "ethereum-faucet", address: faucetpayEmail },
  61. { url: "https://lobstercoins.com/bch-faucet/?r=bleem.rapid@gmail.com", coin: "bch-faucet", address: faucetpayEmail },
  62. { url: "https://lobstercoins.com/dash-faucet/?r=bleem.rapid@gmail.com", coin: "dash-faucet", address: faucetpayEmail },
  63. { url: "https://lobstercoins.com/zcash-faucet/?r=bleem.rapid@gmail.com", coin: "zcash-faucet", address: faucetpayEmail },
  64. { url: "https://lobstercoins.com/digibyte-faucet/?r=bleem.rapid@gmail.com", coin: "digibyte-faucet", address: faucetpayEmail },
  65. ];
  66.  
  67. //Add data for any new website with single pages
  68. //Message selectors are for success or failure to move on to the next website
  69. //AutoWithdraw is disabled by default(for bagi and keran)
  70. //Add only domain name in website as mentioned below. Follow the same pattern.
  71. //Use arrays wherever it is required
  72. //ToDo:Instead of reading messages, either visibility or length of the messages can be checked
  73.  
  74. var websiteMap = [{
  75. website: ["lobstercoins.com"],
  76. inputTextSelector: ["#address"],
  77. inputTextSelectorButton: "body > div.container.flex-grow.my-4 > div.row.my-2 > div.col-12.col-md-8.col-lg-8.order-md-2.mb-4.text-center > form > div:nth-child(4) > button",
  78. defaultButtonSelectors: ["a.btn"],
  79. captchaButtonSubmitSelector: ["input[type='submit']"],
  80. allMessageSelectors: [".alert.alert-warning", ".alert.alert-success", ".alert.alert-danger", "#cf-error-details"],
  81. successMessageSelectors: [".alert.alert-success"],
  82. messagesToCheckBeforeMovingToNextUrl: ["invalid", "sufficient", "you have reached", "tomorrow", "wrong order", "locked", "was sent to your", "You have to wait", "Login not valid", "You have already claimed", "claimed successfully", "Claim not Valid", "rate limited"],
  83. ablinks: true,
  84.  
  85. },
  86.  
  87. ];
  88.  
  89. var ablinksSolved = false;
  90.  
  91. //HtmlEvents dispatcher
  92. function triggerEvent(el, type) {
  93. try {
  94. var e = document.createEvent('HTMLEvents');
  95. e.initEvent(type, false, true);
  96. el.dispatchEvent(e);
  97. } catch (exception) {
  98. console.log(exception);
  99. }
  100. }
  101.  
  102. //Check if a string is present in Array
  103. String.prototype.includesOneOf = function(arrayOfStrings) {
  104.  
  105. //If this is not an Array, compare it as a String
  106. if (!Array.isArray(arrayOfStrings)) {
  107. return this.toLowerCase().includes(arrayOfStrings.toLowerCase());
  108. }
  109.  
  110. for (var i = 0; i < arrayOfStrings.length; i++) {
  111. if (this.toLowerCase().includes(arrayOfStrings[i].toLowerCase())) {
  112. return true;
  113. }
  114. }
  115. return false;
  116. }
  117.  
  118. var websiteDataValues = {};
  119.  
  120. //Get selector details from the websiteMap
  121. for (let value of Object.values(websiteMap)) {
  122. if (window.location.href.includesOneOf(value.website)) {
  123. websiteDataValues.inputTextSelector = value.inputTextSelector;
  124. websiteDataValues.inputTextSelectorButton = value.inputTextSelectorButton;
  125. websiteDataValues.defaultButtonSelectors = value.defaultButtonSelectors;
  126. websiteDataValues.claimButtonSelectors = value.claimButtonSelectors;
  127. websiteDataValues.captchaButtonSubmitSelector = value.captchaButtonSubmitSelector;
  128. websiteDataValues.allMessageSelectors = value.allMessageSelectors;
  129. websiteDataValues.messagesToCheckBeforeMovingToNextUrl = value.messagesToCheckBeforeMovingToNextUrl;
  130. websiteDataValues.withdrawPageUrl = value.withdrawPageUrl;
  131. websiteDataValues.withdrawEnabled = value.withdrawEnabled;
  132. websiteDataValues.balanceSelector = value.balanceSelector;
  133. websiteDataValues.withdrawMinAmount = value.withdrawMinAmount;
  134. websiteDataValues.successMessageSelectors = value.successMessageSelectors;
  135. websiteDataValues.additionalFunctions = value.additionalFunctions;
  136. websiteDataValues.timeoutbeforeMovingToNextUrl = value.timeoutbeforeMovingToNextUrl;
  137. websiteDataValues.formSubmit = value.formSubmit;
  138. websiteDataValues.ablinks = value.ablinks;
  139. break;
  140. }
  141. }
  142.  
  143. //Identify which coin to input, based on the url input
  144. //If the URL does not contain the coin, then use the default from the domain name
  145. var count = 0;
  146. var addressAssigned = false;
  147. for (let value of Object.values(websiteData)) {
  148. count = count + 1;
  149. if (value.url.includes(window.location.hostname) && (window.location.href.includes("/" + value.coin + "/") ||
  150. window.location.href.includes("/" + value.coin + "-") ||
  151. window.location.href.endsWith("/" + value.coin))) {
  152. websiteDataValues.address = value.address;
  153. addressAssigned = true;
  154. break;
  155. }
  156. }
  157.  
  158. //If URL does not have coin, check the default from the domain name
  159. if (!addressAssigned) {
  160. count = 0;
  161. for (let value of Object.values(websiteData)) {
  162. count = count + 1;
  163.  
  164. if (value.url.includes(window.location.hostname)) {
  165. if (value.regex) {
  166. if (GM_getValue("UrlRegex")) {
  167. if (GM_getValue("UrlRegex") == value.regex) {
  168. websiteDataValues.address = value.address;
  169. break;
  170. }
  171. } else {
  172. GM_setValue("UrlRegex", value.regex);
  173. websiteDataValues.address = value.address;
  174. break;
  175. }
  176.  
  177. } else {
  178. websiteDataValues.address = value.address;
  179. break;
  180. }
  181. }
  182. }
  183. }
  184.  
  185.  
  186.  
  187. //Get the next Url from the website data map
  188. async function getNextUrl() {
  189.  
  190. //Go to the beginning if the end of the array is reached
  191. if (count >= websiteData.length) {
  192. count = 0;
  193. }
  194.  
  195. websiteDataValues.nextUrl = websiteData[count].url;
  196. websiteDataValues.regex = websiteData[count].regex;
  197.  
  198. //Ping Test to check if a website is up before proceeding to next url
  199. pingTest(websiteDataValues.nextUrl);
  200. }
  201.  
  202. var isNextUrlReachable = false;
  203. //Get the next Url from the website
  204. function pingTest(websiteUrl) {
  205. console.log(websiteUrl);
  206. GM_xmlhttpRequest({
  207. method: "GET",
  208. url: websiteUrl,
  209. headers: {
  210. "Content-Type": "application/x-www-form-urlencoded"
  211. },
  212. timeout: 2000,
  213. onload: function(response) {
  214. //Website is reachable
  215. if (response && response.status == 200) {
  216. isNextUrlReachable = true;
  217. } else {
  218. count = count + 1;
  219. getNextUrl();
  220. }
  221. },
  222. onerror: function(e) {
  223. count = count + 1;
  224. getNextUrl();
  225. },
  226. ontimeout: function() {
  227. count = count + 1;
  228. getNextUrl();
  229. },
  230. });
  231.  
  232. }
  233.  
  234.  
  235. async function delay(ms) {
  236. return new Promise(resolve => setTimeout(resolve, ms))
  237. }
  238.  
  239.  
  240. var movingToNextUrl = false;
  241. async function goToNextUrl() {
  242. if (!movingToNextUrl) {
  243. movingToNextUrl = true;
  244. getNextUrl();
  245. while (!isNextUrlReachable) {
  246. await delay(2000);
  247. }
  248.  
  249. if (websiteDataValues.regex) {
  250. GM_setValue("UrlRegex", websiteDataValues.regex);
  251. }
  252. window.location.href = websiteDataValues.nextUrl;
  253. movingToNextUrl = true;
  254. }
  255. }
  256.  
  257. async function goToWithdrawPage() {
  258. if (!movingToNextUrl) {
  259. movingToNextUrl = true;
  260. window.location.href = websiteDataValues.withdrawPageUrl;
  261. }
  262.  
  263. }
  264.  
  265.  
  266. //Default Setting: After 180 seconds go to next Url
  267. var delayBeforeMovingToNextUrl = 100000;
  268. if (websiteDataValues.timeoutbeforeMovingToNextUrl) {
  269. delayBeforeMovingToNextUrl = websiteDataValues.timeoutbeforeMovingToNextUrl;
  270. }
  271.  
  272. setTimeout(function() {
  273. movingToNextUrl = false;
  274. goToNextUrl();
  275. }, delayBeforeMovingToNextUrl);
  276.  
  277.  
  278. //Move to next URL if address is not mentioned above
  279. if (window.location.href.includes("to=FaucetPay") || (websiteDataValues.address) && (websiteDataValues.address.length < 5 || websiteDataValues.address.includes("YOUR_"))) {
  280. goToNextUrl();
  281. }
  282.  
  283. //Returns true if message selectors are present
  284. function messageSelectorsPresent() {
  285. if (websiteDataValues.allMessageSelectors) {
  286. for (var j = 0; j < websiteDataValues.allMessageSelectors.length; j++) {
  287. for (var k = 0; k < document.querySelectorAll(websiteDataValues.allMessageSelectors[j]).length; k++) {
  288. if (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k] &&
  289. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl) ||
  290. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value &&
  291. document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)))) {
  292. return true;
  293. }
  294. }
  295. }
  296. }
  297. return false;
  298. }
  299.  
  300. //Returns true if any message is present in message selector
  301. function checkMessageSelectorsLength() {
  302. if (websiteDataValues.allMessageSelectors) {
  303. for (var j = 0; j < websiteDataValues.allMessageSelectors.length; j++) {
  304. for (var k = 0; k < document.querySelectorAll(websiteDataValues.allMessageSelectors[j]).length; k++) {
  305. if (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k] &&
  306. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].innerText.length > 0) ||
  307. (document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value &&
  308. document.querySelectorAll(websiteDataValues.allMessageSelectors[j])[k].value.length > 0)) {
  309. return true;
  310. }
  311. }
  312. }
  313. }
  314. return false;
  315. }
  316.  
  317. //Returns true if message selectors are present
  318. function successMessageSelectorsPresent() {
  319. if (websiteDataValues.successMessageSelectors) {
  320. for (var j = 0; j < websiteDataValues.successMessageSelectors.length; j++) {
  321. for (var k = 0; k < document.querySelectorAll(websiteDataValues.successMessageSelectors[j]).length; k++) {
  322. if (document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k] && document.querySelectorAll(websiteDataValues.successMessageSelectors[j])[k].innerText.includesOneOf(websiteDataValues.messagesToCheckBeforeMovingToNextUrl)) {
  323. return true;
  324. }
  325. }
  326. }
  327. }
  328. return false;
  329. }
  330.  
  331.  
  332. function ablinksCaptcha() {
  333.  
  334. setInterval(function() {
  335.  
  336. if (document.querySelector("#switch") && document.querySelector("#switch").innerText.toLowerCase().includes("hcaptcha")) {
  337. document.querySelector("#switch").click();
  338. } else if (document.querySelector("#switch") && document.querySelector("#switch").innerText.toLowerCase().includes("recaptcha")) {
  339. document.querySelector("#switch").click();
  340. }
  341. var count = 0;
  342.  
  343. var abModels = [".modal-content [href='/']", ".modal-body [href='/']", ".antibotlinks [href='/']"];
  344. var abModelsImg = [".modal-content [href='/'] img", ".modal-body [href='/'] img", ".antibotlinks [href='/'] img"];
  345. for (let j = 0; j < abModelsImg.length; j++) {
  346. if (document.querySelector(abModelsImg[j]) &&
  347. document.querySelector(abModelsImg[j]).value == "####") {
  348. goToNextUrl();
  349. break;
  350. }
  351. }
  352.  
  353. for (let i = 0; i < 4; i++) {
  354. for (let j = 0; j < abModels.length; j++) {
  355. if (document.querySelectorAll(abModelsImg[j]).length == 4 &&
  356. document.querySelectorAll(abModels[j])[i] &&
  357. document.querySelectorAll(abModels[j])[i].style &&
  358. document.querySelectorAll(abModels[j])[i].style.display == 'none') {
  359. count++;
  360. break;
  361. }
  362. }
  363. }
  364. if (count == 4) {
  365. ablinksSolved = true;
  366. }
  367. }, 2000);
  368.  
  369. }
  370.  
  371.  
  372. setTimeout(function() {
  373.  
  374. ablinksCaptcha();
  375.  
  376.  
  377. if (window.name == "nextWindowUrl") {
  378. window.name = "";
  379. goToNextUrl();
  380. return;
  381. } else {
  382. window.name = window.location.href;
  383. }
  384.  
  385.  
  386. if (websiteDataValues.additionalFunctions) {
  387. websiteDataValues.additionalFunctions();
  388. }
  389.  
  390. if (websiteDataValues.withdrawEnabled) {
  391. if (websiteDataValues.balanceSelector && document.querySelector(websiteDataValues.balanceSelector)) {
  392. var currentBalance = document.querySelector(websiteDataValues.balanceSelector).innerText;
  393. if (currentBalance > websiteDataValues.withdrawMinAmount && !window.location.href.includes(websiteDataValues.withdrawPageUrl)) {
  394. goToWithdrawPage();
  395. }
  396.  
  397. } else {
  398. if (successMessageSelectorsPresent()) {
  399. goToWithdrawPage();
  400. }
  401. }
  402. }
  403.  
  404.  
  405. if (!movingToNextUrl && messageSelectorsPresent()) {
  406. goToNextUrl();
  407. }
  408.  
  409.  
  410.  
  411. if (!movingToNextUrl && document.querySelector(websiteDataValues.inputTextSelector)) {
  412. document.querySelector(websiteDataValues.inputTextSelector).value = websiteDataValues.address;
  413. triggerEvent(document.querySelector(websiteDataValues.inputTextSelector), 'keypress');
  414. triggerEvent(document.querySelector(websiteDataValues.inputTextSelector), 'change');
  415. setTimeout(function() {
  416. if (websiteDataValues.inputTextSelectorButton && document.querySelector(websiteDataValues.inputTextSelectorButton)) {
  417. document.querySelector(websiteDataValues.inputTextSelectorButton).click();
  418. }
  419.  
  420. }, 2000);
  421. }
  422.  
  423.  
  424. if (!movingToNextUrl && websiteDataValues.defaultButtonSelectors) {
  425. for (let i = 0; i < websiteDataValues.defaultButtonSelectors.length; i++) {
  426. if (document.querySelector(websiteDataValues.defaultButtonSelectors[i])) {
  427. triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mousedown');
  428. triggerEvent(document.querySelector(websiteDataValues.defaultButtonSelectors[i]), 'mouseup');
  429. document.querySelector(websiteDataValues.defaultButtonSelectors[i]).click();
  430. break;
  431. }
  432. }
  433. }
  434.  
  435. setTimeout(function() {
  436. if (!movingToNextUrl && websiteDataValues.claimButtonSelectors) {
  437. for (let i = 0; i < websiteDataValues.claimButtonSelectors.length; i++) {
  438. if (document.querySelector(websiteDataValues.claimButtonSelectors[i])) {
  439. triggerEvent(document.querySelector(websiteDataValues.claimButtonSelectors[i]), 'mousedown');
  440. triggerEvent(document.querySelector(websiteDataValues.claimButtonSelectors[i]), 'mouseup');
  441. document.querySelector(websiteDataValues.claimButtonSelectors[i]).click();
  442. break;
  443. }
  444. }
  445. }
  446. }, 2000);
  447.  
  448.  
  449.  
  450.  
  451. var clicked = false;
  452. var captchaInterval = setInterval(function() {
  453.  
  454. if (websiteDataValues.ablinks && !ablinksSolved) {
  455. return;
  456. }
  457.  
  458. try {
  459. if (!clicked && unsafeWindow.grecaptcha && unsafeWindow.grecaptcha.getResponse().length > 0 &&
  460. websiteDataValues.captchaButtonSubmitSelector && document.querySelector(websiteDataValues.captchaButtonSubmitSelector) &&
  461. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).style.display != 'none' &&
  462. !document.querySelector(websiteDataValues.captchaButtonSubmitSelector).disabled) {
  463. if (websiteDataValues.formSubmit) {
  464. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).submit();
  465. } else {
  466. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).click();
  467. }
  468. clicked = true;
  469.  
  470. clearInterval(captchaInterval);
  471. setTimeout(function() {
  472. if (messageSelectorsPresent()) {
  473. goToNextUrl();
  474. }
  475. }, 20000);
  476. }
  477. } catch (e) {
  478.  
  479. }
  480.  
  481. for (var hc = 0; hc < document.querySelectorAll("iframe").length; hc++) {
  482. if (!clicked && document.querySelectorAll("iframe")[hc] &&
  483. document.querySelectorAll("iframe")[hc].hasAttribute("data-hcaptcha-response") &&
  484. document.querySelectorAll("iframe")[hc].getAttribute("data-hcaptcha-response").length > 0 &&
  485. websiteDataValues.captchaButtonSubmitSelector && document.querySelector(websiteDataValues.captchaButtonSubmitSelector) &&
  486. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).style.display != 'none' &&
  487. !document.querySelector(websiteDataValues.captchaButtonSubmitSelector).disabled) {
  488. if (websiteDataValues.formSubmit) {
  489. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).submit();
  490. } else {
  491. document.querySelector(websiteDataValues.captchaButtonSubmitSelector).click();
  492. }
  493. clicked = true;
  494. clearInterval(captchaInterval);
  495. setTimeout(function() {
  496. if (messageSelectorsPresent()) {
  497. goToNextUrl();
  498. }
  499. }, 2000);
  500. }
  501. }
  502. }, 2000);
  503. }, 2000);
  504.  
  505. })();