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
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
})();
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);
})();