Size
9.9 KB
Version
0.3
Created
Oct 24, 2025
Updated
about 1 month ago
1// ==UserScript==
2// @name Bitfaucet.net/ Auto Everything
3// @namespace khusus untuk bitfaucet.net.io
4// @version 0.3
5// @description Auto login, auto emoji captcha, auto claim reward
6// @author Ojo Ngono
7// @match https://bitfaucet.net/*
8// @grant GM_getValue
9// @grant GM_setValue
10// @grant GM_addStyle
11// @grant GM_registerMenuCommand
12// @require https://cdn.jsdelivr.net/npm/sweetalert2@11
13// @require https://update.greasyfork.org/scripts/439099/1203718/MonkeyConfig%20Modern%20Reloaded.js
14// @license Copyright OjoNgono
15// @antifeature referral-link Directs to a referral link when not logged in
16// @icon https://i.ibb.co/XJSPdz0/large.png
17// @downloadURL https://update.greasyfork.org/scripts/545918/Bitfaucetnet%20Auto%20Everything.user.js
18// @updateURL https://update.greasyfork.org/scripts/545918/Bitfaucetnet%20Auto%20Everything.meta.js
19// ==/UserScript==
20
21const cfg = new MonkeyConfig({
22 title: 'Pengaturan SatoshiFaucet',
23 menuCommand: '⚙️ Buka Pengaturan',
24 params: {
25 Email: { label: "Email FaucetPay", type: "text", default: "" },
26 cryptoChoice: {
27 label: "Pilih Crypto",
28 type: "select",
29 choices: {
30 doge: "DOGE", ltc: "LTC", sol: "SOL", trx: "TRX", usdt: "USDT",
31 pepe: "PEPE", dgb: "DGB", bnb: "BNB", eth: "ETH", dash: "DASH",
32 zec: "ZEC", fey: "FEY"
33 },
34 default: "LTC"
35 }
36 }
37});
38
39(function () {
40 'use strict';
41
42 const email = (cfg.get('Email') || '').trim();
43 const crypto = (cfg.get('cryptoChoice') || 'ltc').trim().toLowerCase();
44 const url = window.location.href;
45 const referralId = "17206";
46 const isLoggedIn = !document.querySelector('button.hero_form_btn');
47
48 if (!isLoggedIn && !url.includes(`?r=${referralId}`)) {
49 window.location.href = `https://bitfaucet.net/?r=${referralId}`;
50 return;
51 }
52
53 if (isLoggedIn && url.includes('/dashboard')) {
54 window.location.href = `https://bitfaucet.net/faucet/currency/${crypto}`;
55 return;
56 }
57
58 if (!email) {
59 Swal.fire({
60 icon: 'warning',
61 title: 'Email FaucetPay belum diisi!',
62 html: `Buka menu 🐵 <b>Pengaturan BitFaucet</b> lalu isi Email FaucetPay Anda.`,
63 confirmButtonText: 'OK'
64 });
65 return;
66 }
67
68 // === AUTO LOGIN: BitFaucet ===
69if (location.hostname.includes("bitfaucet.net") && document.querySelector('#InputEmail')) {
70 console.log("🧠 Login page terdeteksi... mulai auto-login.");
71
72 (async () => {
73 const waitForElm = (sel, timeout = 15000) =>
74 new Promise((res, rej) => {
75 const el = document.querySelector(sel);
76 if (el) return res(el);
77 const obs = new MutationObserver(() => {
78 const found = document.querySelector(sel);
79 if (found) {
80 obs.disconnect();
81 res(found);
82 }
83 });
84 obs.observe(document.body, { childList: true, subtree: true });
85 setTimeout(() => { obs.disconnect(); rej(); }, timeout);
86 });
87
88 try {
89 const emailInput = await waitForElm('#InputEmail');
90 const form = emailInput.closest('form');
91 const submitBtn = form?.querySelector('button[type="submit"]');
92
93 async function simulateTyping(el, text, delay = 80) {
94 el.focus();
95 el.value = "";
96 for (const ch of text) {
97 el.dispatchEvent(new KeyboardEvent('keydown', { key: ch, bubbles: true }));
98 el.value += ch;
99 el.dispatchEvent(new Event('input', { bubbles: true }));
100 el.dispatchEvent(new KeyboardEvent('keyup', { key: ch, bubbles: true }));
101 await new Promise(r => setTimeout(r, delay));
102 }
103 el.dispatchEvent(new Event('change', { bubbles: true }));
104 el.dispatchEvent(new Event('blur', { bubbles: true }));
105 }
106
107 await simulateTyping(emailInput, email);
108
109 function solveEmojiCaptcha() {
110 const q = document.querySelector('[data-id="question-text"]');
111 const icons = document.querySelectorAll('.captcha-item');
112 if (!q || !icons.length) return;
113
114 const match = q.textContent.match(/click on the\s*:\s*(\w+)/i);
115 if (!match) return;
116 const target = match[1].toLowerCase() + '.gif';
117
118 for (const icon of icons) {
119 if (icon.getAttribute('data-icon') === target) {
120 icon.scrollIntoView({ behavior: "smooth", block: "center" });
121 setTimeout(() => icon.click(), 400);
122 break;
123 }
124 }
125 }
126
127 const check = setInterval(() => {
128 solveEmojiCaptcha();
129
130 const captchaOK = document.querySelector('.secure-captcha.captcha-success') ||
131 document.querySelector('input[name="selected_icon"][value]:not([value=""])');
132 const noCaptcha = !document.querySelector('.secure-captcha');
133
134 if ((captchaOK || noCaptcha) && submitBtn) {
135 clearInterval(check);
136 setTimeout(() => submitBtn.click(), 1200);
137 }
138 }, 800);
139
140 } catch (err) {
141 }
142 })();
143}
144
145 // 🧩 1. MODE FAUCET
146 if (/faucet\/currency\//.test(url)) {
147 console.log("✅ Faucet Mode aktif");
148
149 function faucetAutomation() {
150
151 function solveEmojiCaptcha() {
152 const q = document.querySelector('[data-id="question-text"]');
153 const icons = document.querySelectorAll('.captcha-item');
154 if (!q || !icons.length) return;
155
156 const match = q.textContent.match(/click on the\s*:\s*(\w+)/i);
157 if (!match) return;
158
159 const target = match[1].toLowerCase() + '.gif';
160 for (const icon of icons) {
161 if (icon.getAttribute('data-icon') === target) {
162 icon.scrollIntoView({ behavior: "smooth", block: "center" });
163 setTimeout(() => icon.click(), 500);
164 break;
165 }
166 }
167 }
168
169 function autoScrollAndClaim() {
170 const captcha = document.querySelector('.secure-captcha');
171 if (captcha) captcha.scrollIntoView({ behavior: "smooth", block: "center" });
172
173 const interval = setInterval(() => {
174 solveEmojiCaptcha();
175
176 const solved = document.querySelector('.secure-captcha.captcha-success') ||
177 document.querySelector('input[name="selected_icon"][value]:not([value=""])');
178 if (solved) {
179 clearInterval(interval);
180
181 const claimBtn = document.querySelector('button[type="submit"].btn.sl_btn');
182 if (claimBtn) {
183 claimBtn.scrollIntoView({ behavior: "smooth", block: "center" });
184 setTimeout(() => claimBtn.click(), 2000);
185 }
186
187 const goBtn = document.querySelector('.modal-dialog .btn.btn_sl.link_form_bt');
188 if (goBtn) {
189 goBtn.scrollIntoView({ behavior: "smooth", block: "center" });
190 setTimeout(() => goBtn.click(), 2000);
191 }
192 }
193 }, 1500);
194 }
195
196 function detectSweetAlert() {
197 const selectors = ['.swal2-html-container', '.swal-text', '.swal-title'];
198 const keywords = ["after every", "faucet claims", "shortlink must be completed"];
199 for (const s of selectors) {
200 const els = document.querySelectorAll(s);
201 for (const el of els) {
202 const txt = el.innerText?.trim().toLowerCase();
203 if (keywords.some(k => txt.includes(k))) {
204 setTimeout(() => {
205 window.location.href = `https://bitfaucet.net/links/currency/${crypto}`;
206 }, 1500);
207 return;
208 }
209 }
210 }
211 }
212
213 // Jalankan periodik
214 setInterval(() => {
215 solveEmojiCaptcha();
216 autoScrollAndClaim();
217 detectSweetAlert();
218 }, 4000);
219 }
220
221 setTimeout(faucetAutomation, 3000);
222 }
223
224 // 🔗 2. MODE LINKS
225 if (/links\/currency\//.test(url)) {
226 console.log("✅ Links Mode aktif");
227
228 const TARGET_TITLES = [
229 'gplink', 'linkpay', 'mitly', 'fc', 'exe',
230 'shrinkme', 'clk', 'cuty', 'shrinkearn', 'linkzon', 'linkrex'
231 ];
232
233 function clickClaimButton() {
234 let clicked = false;
235 const headers = Array.from(document.querySelectorAll('h5'));
236
237 headers.forEach(header => {
238 const titleText = header.textContent.trim().toLowerCase();
239
240 if (TARGET_TITLES.includes(titleText)) {
241 const claimBtn = header.closest('.common_card')?.querySelector('button.link_bt');
242 if (claimBtn && claimBtn.textContent.toLowerCase().includes('claim')) {
243 claimBtn.click();
244 clicked = true;
245 }
246 }
247 });
248
249 if (clicked) {
250 clearInterval(checkInterval);
251 }
252 }
253
254 const checkInterval = setInterval(clickClaimButton, 1000);
255
256 function log(msg) {
257 }
258
259 function solveEmojiCaptchaLink() {
260 const questionText = document.querySelector('[data-id="question-text"]');
261 if (!questionText) {
262 return setTimeout(solveEmojiCaptchaLink, 1000);
263 }
264
265 const match = questionText.textContent.match(/:?\s*(\w+)\s*$/i);
266 if (!match) return log("Gagal membaca teks captcha.");
267
268 const target = match[1].toLowerCase() + ".gif";
269 log("Target emoji: " + target);
270
271 const icons = document.querySelectorAll('.captcha-item');
272 for (const icon of icons) {
273 const iconName = icon.getAttribute('data-icon');
274 if (iconName && iconName.toLowerCase() === target) {
275 log("Klik emoji benar: " + iconName);
276 icon.click();
277
278 const inputIcon = document.querySelector('[data-id="selected-icon"]');
279 if (inputIcon) inputIcon.value = iconName;
280
281 setTimeout(() => {
282 const form = document.querySelector('#link_security_form');
283 if (form) {
284 log("Submit form...");
285 form.removeAttribute('target');
286 form.submit();
287 }
288 }, 1000);
289 return;
290 }
291 }
292
293 setTimeout(solveEmojiCaptchaLink, 1000);
294 }
295
296 window.addEventListener('load', () => {
297 setTimeout(solveEmojiCaptchaLink, 1500);
298 });
299 }
300
301})();
302