Auto Faucet Claimer - Futuriste

Automatise le processus de claim sur les faucets crypto avec interface futuriste

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Auto Faucet Claimer - Futuriste
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Automatise le processus de claim sur les faucets crypto avec interface futuriste
// @author       VotreNom
// @match        *://*/*
// @grant        GM_openInTab
// @grant        GM_notification
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/js/all.min.js
// ==/UserScript==

(function() {
    'use strict';

    // Configuration des faucets
    const faucets = [
        {
            name: "Trump",
            url: "https://freetrump.in?ref=ppJFnf3MN7",
            claimSelector: "button#claim-button, input[type='submit'][value*='Claim'], .claim-button",
            timer: 10000
        },
        {
            name: "Bitcoin",
            url: "https://freebitco.in/?r=895981",
            claimSelector: "button#free_play_form_button, .claim-button, .btn-claim",
            timer: 10000
        },
        {
            name: "XRP",
            url: "https://freexrp.in?ref=UkpS7X35hO",
            claimSelector: "button.claim-btn, .claim-button, .btn-claim",
            timer: 10000
        },
        {
            name: "Shiba Inu",
            url: "https://freeshib.in?ref=OpxzVbgF1x",
            claimSelector: "#claim, .claim-button, button[onclick*='claim']",
            timer: 10000
        },
        {
            name: "Sui",
            url: "https://freesui.in?ref=h61ChGeVEj",
            claimSelector: ".faucet-claim-btn, .claim-button, .btn-primary",
            timer: 10000
        },
        {
            name: "USD Stablecoin",
            url: "https://usdpick.io?ref=S6L5FjWLfZ",
            claimSelector: "#claim_btn, .claim-button, .btn-success",
            timer: 10000
        },
        {
            name: "Arbitrum",
            url: "https://freearb.in?ref=HJ9z1FwNXK",
            claimSelector: ".claim-rewards, .claim-button, .btn-claim",
            timer: 10000
        },
        {
            name: "Tron",
            url: "https://freetron.in?ref=vkkIZZNK47",
            claimSelector: "#claimButton, .claim-button, .btn-claim",
            timer: 10000
        },
        {
            name: "Binance Coin",
            url: "https://freebnb.in?ref=es0DFLc16v",
            claimSelector: ".faucet-button, .claim-button, .btn-claim",
            timer: 10000
        },
        {
            name: "Toncoin",
            url: "https://freetoncoin.in?ref=YMUTSnsOIW",
            claimSelector: "#claim_btn, .claim-button, .btn-claim",
            timer: 10000
        }
    ];

    // Variables globales
    let isRunning = false;
    let currentFaucetIndex = 0;
    let countdownInterval;
    let nextClaimTime = GM_getValue("nextClaimTime", 0);
    let currentTab = null;
    let autoClickEnabled = GM_getValue("autoClickEnabled", true);
    let autoCloseEnabled = GM_getValue("autoCloseEnabled", true);

    // Créer l'interface utilisateur
    function createUI() {
        // Style de l'interface
        const style = `
            <style>
                #autoFaucetContainer {
                    position: fixed;
                    top: 20px;
                    right: 20px;
                    width: 350px;
                    background: linear-gradient(135deg, #0a0a1a, #050510);
                    border: 1px solid rgba(0, 255, 136, 0.3);
                    border-radius: 15px;
                    padding: 15px;
                    box-shadow: 0 0 20px rgba(0, 255, 136, 0.2);
                    z-index: 10000;
                    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
                    color: #f0f0ff;
                    backdrop-filter: blur(10px);
                    transition: all 0.3s ease;
                }
                #autoFaucetHeader {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    margin-bottom: 15px;
                    padding-bottom: 10px;
                    border-bottom: 1px solid rgba(0, 255, 136, 0.3);
                }
                #autoFaucetTitle {
                    font-size: 16px;
                    font-weight: bold;
                    background: linear-gradient(45deg, #00ff88, #0099ff);
                    -webkit-background-clip: text;
                    background-clip: text;
                    color: transparent;
                }
                #autoFaucetToggle {
                    background: linear-gradient(45deg, #00ff88, #0099ff);
                    border: none;
                    border-radius: 20px;
                    padding: 5px 15px;
                    color: #0a0a1a;
                    font-weight: bold;
                    cursor: pointer;
                    transition: all 0.3s ease;
                }
                #autoFaucetToggle:hover {
                    transform: scale(1.05);
                    box-shadow: 0 0 10px rgba(0, 255, 136, 0.5);
                }
                #autoFaucetStatus {
                    margin-bottom: 10px;
                    font-size: 14px;
                }
                #autoFaucetCountdown {
                    font-size: 18px;
                    font-weight: bold;
                    text-align: center;
                    margin: 10px 0;
                    font-family: 'Courier New', monospace;
                    background: rgba(0, 0, 0, 0.3);
                    padding: 10px;
                    border-radius: 10px;
                    border: 1px solid rgba(255, 255, 255, 0.1);
                }
                #autoFaucetProgress {
                    height: 10px;
                    background: rgba(255, 255, 255, 0.1);
                    border-radius: 5px;
                    margin: 10px 0;
                    overflow: hidden;
                }
                #autoFaucetProgressBar {
                    height: 100%;
                    background: linear-gradient(45deg, #00ff88, #0099ff);
                    border-radius: 5px;
                    width: 0%;
                    transition: width 0.5s ease;
                }
                #autoFaucetCurrent {
                    font-size: 14px;
                    margin-bottom: 5px;
                }
                #autoFaucetNext {
                    font-size: 12px;
                    opacity: 0.8;
                }
                .faucet-list {
                    max-height: 200px;
                    overflow-y: auto;
                    margin-top: 10px;
                }
                .faucet-item {
                    display: flex;
                    justify-content: space-between;
                    padding: 8px;
                    margin: 5px 0;
                    background: rgba(255, 255, 255, 0.05);
                    border-radius: 8px;
                    border-left: 3px solid #00ff88;
                }
                .faucet-name {
                    font-size: 14px;
                }
                .faucet-status {
                    font-size: 12px;
                }
                .status-completed {
                    color: #00ff88;
                }
                .status-active {
                    color: #0099ff;
                    font-weight: bold;
                }
                .status-pending {
                    color: rgba(255, 255, 255, 0.5);
                }
                .settings-row {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    margin: 10px 0;
                }
                .settings-label {
                    font-size: 14px;
                }
                .switch {
                    position: relative;
                    display: inline-block;
                    width: 50px;
                    height: 24px;
                }
                .switch input {
                    opacity: 0;
                    width: 0;
                    height: 0;
                }
                .slider {
                    position: absolute;
                    cursor: pointer;
                    top: 0;
                    left: 0;
                    right: 0;
                    bottom: 0;
                    background-color: rgba(255, 255, 255, 0.1);
                    transition: .4s;
                    border-radius: 24px;
                }
                .slider:before {
                    position: absolute;
                    content: "";
                    height: 16px;
                    width: 16px;
                    left: 4px;
                    bottom: 4px;
                    background-color: white;
                    transition: .4s;
                    border-radius: 50%;
                }
                input:checked + .slider {
                    background: linear-gradient(45deg, #00ff88, #0099ff);
                }
                input:checked + .slider:before {
                    transform: translateX(26px);
                }
                #autoFaucetMinimize {
                    position: absolute;
                    top: 10px;
                    right: 40px;
                    background: none;
                    border: none;
                    color: #f0f0ff;
                    cursor: pointer;
                    font-size: 16px;
                }
                .minimized {
                    transform: translateX(330px);
                }
                .minimized #autoFaucetHeader,
                .minimized #autoFaucetStatus,
                .minimized #autoFaucetCountdown,
                .minimized #autoFaucetProgress,
                .minimized #autoFaucetCurrent,
                .minimized #autoFaucetNext,
                .minimized .faucet-list,
                .minimized .settings-row {
                    display: none;
                }
                .minimized #autoFaucetMinimize {
                    right: 10px;
                }
            </style>
        `;

        // HTML de l'interface
        const html = `
            <div id="autoFaucetContainer">
                <button id="autoFaucetMinimize"><i class="fas fa-chevron-right"></i></button>
                <div id="autoFaucetHeader">
                    <div id="autoFaucetTitle">Auto Faucet Claimer</div>
                    <button id="autoFaucetToggle">Démarrer</button>
                </div>
                <div id="autoFaucetStatus">Prêt à commencer</div>
                <div id="autoFaucetCountdown">60:00</div>
                <div id="autoFaucetProgress">
                    <div id="autoFaucetProgressBar"></div>
                </div>
                <div id="autoFaucetCurrent">Prochain faucet: -</div>
                <div id="autoFaucetNext">Prochain claim: -</div>

                <div class="settings-row">
                    <span class="settings-label">Clic automatique</span>
                    <label class="switch">
                        <input type="checkbox" id="autoClickToggle" checked>
                        <span class="slider"></span>
                    </label>
                </div>

                <div class="settings-row">
                    <span class="settings-label">Fermeture auto</span>
                    <label class="switch">
                        <input type="checkbox" id="autoCloseToggle" checked>
                        <span class="slider"></span>
                    </label>
                </div>

                <div class="faucet-list" id="faucetList"></div>
            </div>
        `;

        // Ajouter le style et le HTML à la page
        $('body').append(style + html);

        // Initialiser la liste des faucets
        updateFaucetList();

        // Gérer le clic sur le bouton de démarrage/arrêt
        $('#autoFaucetToggle').click(toggleAutoClaim);

        // Gérer la minimisation
        $('#autoFaucetMinimize').click(function() {
            $('#autoFaucetContainer').toggleClass('minimized');
            const icon = $(this).find('i');
            icon.toggleClass('fa-chevron-right fa-chevron-left');
        });

        // Gérer les paramètres
        $('#autoClickToggle').prop('checked', autoClickEnabled).change(function() {
            autoClickEnabled = $(this).is(':checked');
            GM_setValue("autoClickEnabled", autoClickEnabled);
        });

        $('#autoCloseToggle').prop('checked', autoCloseEnabled).change(function() {
            autoCloseEnabled = $(this).is(':checked');
            GM_setValue("autoCloseEnabled", autoCloseEnabled);
        });

        // Mettre à jour le compte à rebours
        updateCountdown();
    }

    // Mettre à jour la liste des faucets dans l'UI
    function updateFaucetList() {
        const faucetList = $('#faucetList');
        faucetList.empty();

        faucets.forEach((faucet, index) => {
            let status, statusClass;
            if (index < currentFaucetIndex) {
                status = 'Terminé';
                statusClass = 'status-completed';
            } else if (index === currentFaucetIndex && isRunning) {
                status = 'En cours...';
                statusClass = 'status-active';
            } else {
                status = 'En attente';
                statusClass = 'status-pending';
            }

            faucetList.append(`
                <div class="faucet-item">
                    <span class="faucet-name">${faucet.name}</span>
                    <span class="faucet-status ${statusClass}">${status}</span>
                </div>
            `);
        });
    }

    // Basculer entre démarrage et arrêt
    function toggleAutoClaim() {
        if (isRunning) {
            stopAutoClaim();
        } else {
            startAutoClaim();
        }
    }

    // Démarrer le processus automatique
    function startAutoClaim() {
        if (isRunning) return;

        isRunning = true;
        $('#autoFaucetToggle').text('Arrêter');
        $('#autoFaucetStatus').text('Démarrage en cours...');

        // Réinitialiser l'index si on a déjà terminé tous les faucets
        if (currentFaucetIndex >= faucets.length) {
            currentFaucetIndex = 0;
            updateFaucetList();
        }

        // Commencer le processus
        processNextFaucet();
    }

    // Arrêter le processus automatique
    function stopAutoClaim() {
        isRunning = false;
        $('#autoFaucetToggle').text('Démarrer');
        $('#autoFaucetStatus').text('Processus arrêté');
        clearTimeout(countdownInterval);

        // Fermer l'onglet actuel s'il existe
        if (currentTab && !currentTab.closed) {
            try {
                currentTab.close();
            } catch (e) {
                console.log("Impossible de fermer l'onglet:", e);
            }
        }
    }

    // Traiter le prochain faucet
    function processNextFaucet() {
        if (!isRunning || currentFaucetIndex >= faucets.length) {
            // Tous les faucets ont été traités
            finishCycle();
            return;
        }

        const faucet = faucets[currentFaucetIndex];
        $('#autoFaucetStatus').html(`Traitement de <strong>${faucet.name}</strong>...`);
        $('#autoFaucetCurrent').text(`Faucet actuel: ${faucet.name}`);

        // Mettre à jour la liste des faucets
        updateFaucetList();

        // Ouvrir le faucet dans un nouvel onglet
        currentTab = window.open(faucet.url, '_blank');

        if (!currentTab) {
            $('#autoFaucetStatus').html('Popup bloqué! Veuillez autoriser les popups pour ce site.');
            setTimeout(() => {
                currentFaucetIndex++;
                processNextFaucet();
            }, 3000);
            return;
        }

        // Attendre que la page se charge puis essayer de cliquer automatiquement
        setTimeout(() => {
            if (autoClickEnabled) {
                try {
                    // Injecter un script pour trouver et cliquer sur le bouton de claim
                    const clickScript = `
                        (function() {
                            // Trouver le bouton de claim
                            const claimSelectors = ${JSON.stringify(faucet.claimSelector.split(', '))};
                            let claimButton = null;

                            for (const selector of claimSelectors) {
                                claimButton = document.querySelector(selector);
                                if (claimButton) break;
                            }

                            // Cliquer sur le bouton s'il existe
                            if (claimButton) {
                                claimButton.click();
                                return true;
                            }
                            return false;
                        })();
                    `;

                    // Exécuter le script dans l'onglet
                    const success = currentTab.eval(clickScript);

                    if (success) {
                        $('#autoFaucetStatus').html(`Clic automatique sur <strong>${faucet.name}</strong> réussi!`);
                    } else {
                        $('#autoFaucetStatus').html(`Bouton de claim non trouvé sur <strong>${faucet.name}</strong>. Veuillez cliquer manuellement.`);
                    }
                } catch (e) {
                    $('#autoFaucetStatus').html(`Impossible d'automatiser le clic sur <strong>${faucet.name}</strong>. Veuillez cliquer manuellement.`);
                }
            } else {
                $('#autoFaucetStatus').html(`Veuillez cliquer manuellement sur le bouton de claim sur <strong>${faucet.name}</strong>.`);
            }

            // Attendre que l'utilisateur termine puis passer au suivant
            setTimeout(() => {
                if (autoCloseEnabled && currentTab && !currentTab.closed) {
                    try {
                        currentTab.close();
                    } catch (e) {
                        console.log("Impossible de fermer l'onglet:", e);
                    }
                }

                currentFaucetIndex++;
                processNextFaucet();
            }, faucet.timer);
        }, 3000);
    }

    // Terminer un cycle complet
    function finishCycle() {
        isRunning = false;
        $('#autoFaucetToggle').text('Démarrer');
        $('#autoFaucetStatus').html('Cycle terminé! Prochain cycle dans 60 minutes.');

        // Définir l'heure du prochain claim
        const nextTime = Date.now() + 60 * 60 * 1000; // 60 minutes
        GM_setValue("nextClaimTime", nextTime);
        nextClaimTime = nextTime;

        // Réinitialiser l'index pour le prochain cycle
        currentFaucetIndex = 0;
        updateFaucetList();

        // Mettre à jour le compte à rebours
        updateCountdown();

        // Notification
        if (Notification.permission === 'granted') {
            new Notification('Cycle de claims terminé', {
                body: 'Le prochain cycle commencera dans 60 minutes',
                icon: 'https://cryptologos.cc/logos/bitcoin-btc-logo.png'
            });
        } else if (Notification.permission !== 'denied') {
            Notification.requestPermission().then(permission => {
                if (permission === 'granted') {
                    new Notification('Cycle de claims terminé', {
                        body: 'Le prochain cycle commencera dans 60 minutes',
                        icon: 'https://cryptologos.cc/logos/bitcoin-btc-logo.png'
                    });
                }
            });
        }
    }

    // Mettre à jour le compte à rebours
    function updateCountdown() {
        clearInterval(countdownInterval);

        function update() {
            const now = Date.now();
            let timeLeft;

            if (nextClaimTime > now) {
                timeLeft = nextClaimTime - now;
            } else {
                timeLeft = 0;
            }

            const minutes = Math.floor(timeLeft / 60000);
            const seconds = Math.floor((timeLeft % 60000) / 1000);

            $('#autoFaucetCountdown').text(`${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`);

            // Mettre à jour la barre de progression
            const progress = 100 - (timeLeft / (60 * 60 * 1000) * 100);
            $('#autoFaucetProgressBar').css('width', `${progress}%`);

            // Mettre à jour le texte du prochain claim
            if (timeLeft > 0) {
                const nextDate = new Date(nextClaimTime);
                $('#autoFaucetNext').text(`Prochain claim: ${nextDate.toLocaleTimeString()}`);
            } else {
                $('#autoFaucetNext').text('Prêt pour un nouveau cycle');
            }
        }

        update();
        countdownInterval = setInterval(update, 1000);
    }

    // Initialiser l'interface
    $(document).ready(function() {
        // Vérifier si l'interface n'existe pas déjà
        if ($('#autoFaucetContainer').length === 0) {
            createUI();
        }

        // Vérifier s'il y a un cycle en cours
        const savedNextClaim = GM_getValue("nextClaimTime", 0);
        if (savedNextClaim > Date.now()) {
            nextClaimTime = savedNextClaim;
            $('#autoFaucetStatus').text('En attente du prochain cycle...');
        }

        // Demander la permission pour les notifications
        if ('Notification' in window && Notification.permission === 'default') {
            Notification.requestPermission();
        }
    });

})();