Un bot permet d’automatiser des tâches, et est généralement plus rapide qu’un humain!
Mais surtout ça te libère du temps pour faire des tâches plus intéressante,
Grâce à l’IA de chatGPT, codage d’un bot de A à Z !

Vidéo Youtube

Résumé de mon aventure en vidéo !

Détection de vente sauvage

// ==UserScript==
// @name         Vente Sauvage Redirector OK
// @namespace    Violentmonkey Scripts
// @version      1.1
// @description  Vérifie l'API et redirige selon le mode
// @author       Battistù
// @match        https://realt.co/
// @grant        GM_xmlhttpRequest
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // Mode Test pour basculer entre les URL d'API
    const MODE_TEST = true; // true = local, false = production
    const INTERVAL_MS = 30000; // Intervalle entre chaque vérification (30 secondes)

    const apiUrl = MODE_TEST
        ? "http://TON_SERVER/wp-json/realt/v1/products/for_sale"     // Server local
        : "https://realt.co/wp-json/realt/v1/products/for_sale";     // API RealT

    const redirectUrl = false //MODE_TEST
        ? "TON_CHEMIN/ventesauvage.html"          // Redirection locale
        : "https://realt.co/marketplace/";                          // Redirection en production

    function checkAvailability() {
        GM_xmlhttpRequest({
            method: "GET",
            url: apiUrl,
            onload: function(response) {
                // Vérifie si la réponse est valide et en JSON
                if (response.status === 200 && response.responseText.startsWith("{")) {
                    const data = JSON.parse(response.responseText);

                    // Trouve un produit avec un statut différent de "Available" ou "New Product"
                    const unexpectedStatusProduct = data.products.find(
                        product => !(product.status === "Available" || product.status === "New Product")
                    );

                    if (unexpectedStatusProduct) {
                        console.log("Produit inattendu détecté ! Redirection obligatoire vers :", redirectUrl);
                        window.location.href = redirectUrl;
                    } else {
                        console.log("RAS... Tous les produits ont un statut attendu (Available/New Product).");
                        setTimeout(checkAvailability, INTERVAL_MS);
                    }
                } else {
                    console.warn("Réponse inattendue ou limite atteinte :", response.responseText);
                    setTimeout(checkAvailability, INTERVAL_MS);
                }
            },
            onerror: function(error) {
                console.error("Erreur lors de l'appel API :", error);
            }
        });
    }

    // Démarre immédiatement la vérification
    checkAvailability();
})();


MARKETPLACE (Synchrone)

// ==UserScript==
// @name         RealT Marketplace Token Selector OK async
// @namespace    Violentmonkey Scripts
// @version      1.2
// @description  Ajoute automatiquement des tokens au panier selon des critères de rendement minimum et redirige vers le paiement
// @author       Battistù
// @match        https://realt.co/marketplace/
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(async function () {
    'use strict';

    const MIN_YIELD = 5; // Rendement minimum en pourcentage
    const MAX_TOKENS = 2; // Nombre maximum de tokens à ajouter au panier
    let tokensAdded = 0; // Compteur de tokens ajoutés

    // Fonction pour transformer un pourcentage texte en nombre
    function parsePercentage(text) {
        const match = text.match(/(\d+(\.\d+)?)/); // Extrait le premier nombre dans le texte
        return match ? parseFloat(match[1]) : 0;
    }

    // Fonction pour ajouter un token au panier
    async function addToCart(productId, quantity, productTitle) {
        const formData = new FormData();
        formData.append('action', 'woocommerce_ajax_add_to_cart');
        formData.append('product_id', productId);
        formData.append('quantity', quantity);

        try {
            const response = await fetch('/?wc-ajax=add_to_cart', {
                method: 'POST',
                body: formData,
                credentials: 'same-origin',
            });
            const data = await response.json();

            if (!data.error) {
                console.log(`Produit ajouté : ${productTitle} (${tokensAdded + 1}/${MAX_TOKENS} tokens ajoutés)`);
                tokensAdded++;
                if (tokensAdded >= MAX_TOKENS) {
                    console.log('Limite de tokens atteinte, redirection vers le paiement...');
                    window.location.href = 'https://realt.co/checkout/';
                }
            } else {
                console.warn(`Erreur lors de l'ajout au panier : ${productTitle}`);
            }
        } catch (error) {
            console.error(`Erreur réseau lors de l'ajout au panier : ${productTitle}`, error);
        }
    }

    // Fonction principale pour sélectionner les items selon le rendement
    async function selectItemsByYield() {
        const items = document.querySelectorAll('li.product'); // Sélectionne les items

        for (let i = 0; i < items.length; i++) {
            if (tokensAdded >= MAX_TOKENS) {
                console.log('Limite de tokens atteinte, arrêt de la sélection.');
                return;
            }

            const item = items[i];
            const yieldElement = item.querySelector('.assetAnnualReturn .data');
            const addToCartButton = item.querySelector('.add_to_cart_button');
            const titleElement = item.querySelector('.woocommerce-loop-product__title');

            if (yieldElement && addToCartButton && titleElement) {
                const yieldValue = parsePercentage(yieldElement.textContent);
                const productId = addToCartButton.getAttribute('data-product_id');
                const productTitle = titleElement.textContent.trim();
                const quantityInput = item.querySelector('input[name="quantity"]');
                const quantity = quantityInput ? quantityInput.value : '1';

                if (yieldValue >= MIN_YIELD && tokensAdded < MAX_TOKENS) {
                    await addToCart(productId, quantity, productTitle);
                }
            }
        }
    }

    // Lancer la sélection des items
    selectItemsByYield();
})();

CHECKOUT

// ==UserScript==
// @name         RealT Auto Checkout
// @namespace    Violentmonkey Scripts
// @version      1.0
// @description  Automatiser le processus de paiement sur la page de checkout de RealT
// @author       Battistù
// @match        https://realt.co/checkout/
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Vérifier que l'on est bien sur la page de checkout
    if (window.location.href !== 'https://realt.co/checkout/') {
        return;
    }

    // Fonction pour procéder au paiement
    function processCheckout() {
        // Vérifier si l'option de paiement "Crypto Invoice" est sélectionnée
        let cryptoPaymentOption = document.querySelector('#payment_method_request_network');
        if (cryptoPaymentOption && !cryptoPaymentOption.checked) {
            cryptoPaymentOption.checked = true; // Sélectionner l'option de paiement
        }

        // Sélectionner la blockchain "Gnosis"
        let paymentChainSelect = document.querySelector('#request_network-chain');
        if (paymentChainSelect) {
            paymentChainSelect.value = 'xdai'; // Choisir Gnosis
            paymentChainSelect.dispatchEvent(new Event('change', { bubbles: true })); // Déclencher l'événement 'change'
        }

        // Sélectionner la devise "xDAI"
        let paymentCurrencySelect = document.querySelector('#request_network-currency');
        if (paymentCurrencySelect) {
            paymentCurrencySelect.value = 'xdai-xdai'; // Choisir la devise xDAI
            paymentCurrencySelect.dispatchEvent(new Event('change', { bubbles: true })); // Déclencher l'événement 'change'
        }

        // Cochez la case "J'ai lu et j'accepte les termes et conditions"
        let termsCheckbox = document.querySelector('#terms');
        if (termsCheckbox && !termsCheckbox.checked) {
            termsCheckbox.checked = true; // Coche la case
        }

        // Afficher une notification indiquant que le processus de paiement va commencer
        //alert('Ça va payer');

        // Cliquer sur le bouton "Place order" pour finaliser la commande
        let placeOrderButton = document.querySelector('#place_order');
        if (placeOrderButton) {
            placeOrderButton.disabled = false; // Activer le bouton s'il est désactivé
            placeOrderButton.click(); // Simuler le clic sur le bouton
        }
    }

    // Exécuter la fonction de traitement du paiement après un délai pour s'assurer que la page est entièrement chargée
    setTimeout(processCheckout, 2000); // 2 secondes de délai pour laisser le temps aux éléments de se charger
})();

Vidéo de fin…

Code des anciens épisodes (Marketplace)

// ==UserScript==
// @name        RealT Auto Achat (avec statut unique configurable et rafraîchissement)
// @namespace   Violentmonkey Scripts
// @match       https://realt.co/marketplace/*
// @grant       none
// @version     2.3
// @description Script avec refresh de la page toutes les 30 secondes jusqu'à apparition d'une balise avec un statut spécifique
// ==/UserScript==

(function() {
    'use strict';

    // constantes pour le script
    const MIN_YIELD = 10; // 10% de rendement minimum
    const MAX_TOKENS = 1; // Limite de tokens à ajouter
    const MODE_DBG = 0; // Désactiver le mode debug
    const TIMETRACKER = 0; // Désactiver le suivi du temps d'exécution
    const CHECK_INTERVAL = 45000; // Intervalle de 30 secondes pour les vérifications
    const TARGET_DATE = new Date('2024-10-16T01:17:00'); // Date et heure cible
    const STATUS_CHECK = "limited"; // Statut spécifique à rechercher (configurable)

    let tokensAdded = 0; // Compteur de tokens ajoutés

    // Fonction pour transformer un pourcentage texte en nombre
    function parsePercentage(text) {
        return parseFloat(text.replace('%', ''));
    }

    // Fonction pour envoyer une requète AJAX pour ajouter un produit au panier
    function addToCart(productId, quantity) {
        let formData = new FormData();
        formData.append('action', 'woocommerce_ajax_add_to_cart');
        formData.append('product_id', productId);
        formData.append('quantity', quantity);

        fetch('/?wc-ajax=add_to_cart', {
            method: 'POST',
            body: formData,
            credentials: 'same-origin'
        })
        .then(response => response.json())
        .then(data => {
            if (!data.error) {
                tokensAdded++; // Incrémenter le nombre de tokens ajoutés
                if (tokensAdded >= MAX_TOKENS) {
                    window.location.href = 'https://realt.co/checkout/';
                    return;
                }
            }
        });
    }

    // Fonction pour vérifier si une balise contient le statut défini dans STATUS_CHECK
    function checkForAvailable() {
        let items = document.querySelectorAll('.property_status-banner .property-status');
        for (let i = 0; i < items.length; i++) {
            //let status = items[i].innerText.trim().toLowerCase();
            let status = items[i].textContent.trim().toLowerCase();
            // Comparer avec le statut défini dans STATUS_CHECK
            if (status.includes(STATUS_CHECK.toLowerCase())) {
                selectItemsByYield(); // Appel à la fonction de sélection des items
                return;
            }
        }

        // Si aucune balise avec le statut spécifié n'est trouvée, rafraîchir la page après 30 secondes
        setTimeout(function() {
            location.reload(); // Rafraîchit la page
        }, CHECK_INTERVAL);
    }

    // Fonction pour sélectionner les éléments en fonction du rendement (yield)
    function selectItemsByYield() {
        let items = document.querySelectorAll('.woocommerce-shop-loop');

        for (let i = 0; i < items.length; i++) {
            let item = items[i];
            if (tokensAdded >= MAX_TOKENS) {
                window.location.href = 'https://realt.co/checkout/';
                return;
            }

            let yieldElement = item.querySelector('.assetAnnualReturn .data');
            if (yieldElement) {
                let yieldValue = parsePercentage(yieldElement.textContent);

                if (yieldValue >= MIN_YIELD) {
                    let addToCartButton = item.querySelector('.add_to_cart_button');
                    if (addToCartButton) {
                        let productId = addToCartButton.getAttribute('data-product_id');
                        let quantityInput = item.querySelector('input[name="quantity"]');
                        let quantity = quantityInput ? quantityInput.value : '1';

                        addToCart(productId, quantity);
                    }
                }
            }
        }
    }

    // Fonction principale pour démarrer les vérifications une fois que la date est dépassée
    function startCheckAfterDate() {
        const now = new Date();
        if (now >= TARGET_DATE) {
            checkForAvailable(); // Commence à vérifier les statuts
        } else {
            // Sinon, attendre et vérifier à nouveau après 30 secondes
            setTimeout(startCheckAfterDate, CHECK_INTERVAL);
        }
    }

    // Lancer la vérification
    startCheckAfterDate();


    setTimeout(function() {
        location.reload(); // Rafraîchit la page
    }, CHECK_INTERVAL);

})();