Dans l'univers numérique actuel, la capacité à obtenir des informations pertinentes et à automatiser des tâches est devenue primordiale, en particulier au sein des plateformes de communication communautaires comme Discord. Les bots Discord, qu'ils soient conçus pour la modération, l'animation ou la collecte de données, représentent des outils puissants pour enrichir et optimiser l'expérience utilisateur. Cependant, l'accès à certaines données n'est pas toujours direct, nécessitant parfois des approches techniques spécifiques, notamment lorsque les interfaces de programmation (API) conventionnelles sont absentes. Cet article explore les mécanismes d'acquisition d'informations et de déploiement de bots sur Discord, en passant par les défis et les solutions techniques, ainsi que les principes fondamentaux de leur fonctionnement et de leur gestion.
Comprendre l'Accès aux Données : API et Web Scraping
Le monde numérique repose sur l'échange de données, souvent facilité par des interfaces dédiées. Cependant, il arrive que ces facilités fassent défaut, poussant à l'exploration de méthodes alternatives pour la collecte d'informations cruciales.
L'API : Une Passerelle Numérique Standardisée
L'approche la plus simple et la plus courante pour qu'une application obtienne des données d'une autre est l'utilisation d'une API. API signifie Application Programming Interface, et c'est un logiciel qui permet à deux applications de communiquer entre elles. Cette méthode est souvent privilégiée pour sa fiabilité et sa structuration. Imaginons, par exemple, le désir de construire un petit programme qui fournit les prix de différentes cryptomonnaies en temps réel. Eh bien, il existe un moyen facile de le faire, et cela se fait en utilisant une API. C'est assez facile, n'est-ce pas ? La vie est facile quand il y a une API. Une API offre un cadre défini pour les requêtes et les réponses, garantissant ainsi une intégration fluide et efficace entre les systèmes.
Le Scraping Web : Une Solution Face au Manque d'APIs
Mais, comme il a été dit au début, le problème est que parfois il est impossible de trouver l'API exacte souhaitée. Cela semble aussi facile que l'exemple évoqué précédemment, n'est-ce pas ? Pas vraiment. Le problème est que la plupart des marchés dans Solana n'ont pas d'API appropriée pour demander les prix. Alors, que faire dans ce cas ? Nous devons « scraper ». Le scraping web est le processus de collecte de données web structurées de manière automatisée. C'est aussi simple que cela. Cette technique consiste à programmer un logiciel pour naviguer sur des sites web, extraire les informations pertinentes et les organiser dans un format utilisable. Le scraping web devient indispensable lorsque les données nécessaires ne sont pas exposées par une API publique ou lorsqu'une API existe mais ne fournit pas le niveau de détail ou la spécificité requise.
Pour illustrer concrètement cette méthode, cet article s'appuiera sur un exemple spécifique : la construction d'un bot scraper pour Magic Eden afin d'obtenir le prix de n'importe quelle collection de NFT. Cette approche est particulièrement utile dans les écosystèmes émergents où les infrastructures API ne sont pas encore pleinement développées ou standardisées.
Lire aussi: Aperçu de Skipper Transit à La Voulte
Maîtriser l'Extraction de Données avec Puppeteer
Pour procéder au scraping de données, nous utiliserons la bibliothèque la plus connue à cet effet : Puppeteer. Cet outil, développé par Google, offre une API de haut niveau pour contrôler Chrome ou Chromium via le protocole DevTools. Il permet non seulement de prendre des captures d'écran et de générer des PDF, mais aussi d'automatiser l'interaction avec les pages web de manière scriptée, imitant le comportement d'un utilisateur réel.
Prérequis et Mise en Place Initiale de Puppeteer
Avant de plonger dans le code, quelques prérequis techniques sont nécessaires. Il est supposé que vous avez quelques bases en Javascript, mais les explications resteront suffisamment claires pour les novices. Si l'intérêt principal est le code, il est possible de le trouver à la fin de cet article, mais la lecture complète est fortement conseillée pour saisir toutes les nuances.
Les exigences logicielles sont les suivantes :
- Un éditeur de code (Visual Studio Code est un excellent choix).
- Node.js et NPM (Node Package Manager).
Pour commencer avec le scraping de données, la première étape est de créer un nouveau projet. Ouvrez le terminal et tapez npm install puppeteer. Après l'installation de Puppeteer, l'environnement de travail sera prêt.
Un test simple permet de vérifier que tout fonctionne correctement. L'exemple de la documentation Puppeteer est une bonne base :
Lire aussi: Exploits pionniers des marins chinois
(async () => { const puppeteer = require('puppeteer'); const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({ path: 'example.png' }); await browser.close();})();Ce code, une fois enregistré et exécuté avec node index.js, lancera un navigateur, naviguera vers https://example.com, prendra une capture d'écran nommée 'example.png', puis fermera le navigateur. À l'intérieur de l'IIFE (Immediately Invoked Function Expression), on retrouve la structure habituelle d'une promesse : l'appel à Puppeteer pour lancer le navigateur, la création d'une nouvelle page, la navigation vers l'URL souhaitée, la prise de la capture d'écran, et enfin la fermeture du navigateur. C'est assez explicite. Essentiellement, pour le scraping, il suffira de changer l'URL vers ce que nous voulons et de lire les données au lieu de prendre une capture d'écran. En d'autres termes, cela se fera avec page.evaluate().
Extraire des Données Spécifiques avec page.evaluate()
La fonction evaluate() permet d'exécuter du code JavaScript dans le navigateur, ce qui signifie que l'on peut utiliser des fonctions comme le classique document.getElementById() pour accéder à des éléments. Il y aura quelques problèmes, mais ne nous laissons pas submerger. Essayons d'obtenir l'élément h1 en utilisant la fonction evaluate().
(async () => { const puppeteer = require('puppeteer'); const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); const texts = await page.evaluate(() => { const data = Array.from(document.querySelectorAll('h1')).map(h1 => h1.textContent); return data; }); console.log(texts); await browser.close();})();En ajoutant une nouvelle variable nommée texts, nous y sauvegarderons le tableau nommé data avec tous les éléments ayant la balise h1. Enfin, nous ajouterons un console.log(texts) pour voir ce que nous obtenons. Exécutez le code avec node index.js, et vous devriez obtenir : [ 'Example Domain' ]. Hourra ! Cette méthode ouvre la voie à l'extraction de n'importe quel contenu textuel ou attribut d'éléments HTML présent sur une page web.
Contourner les Détections de Bots : L'Utilisation de Stealth
Lorsqu'il s'agit de scraper des sites web plus sophistiqués, une difficulté majeure réside dans la détection des bots. De nombreux sites mettent en œuvre des mesures pour identifier et bloquer les scripts automatisés afin de protéger leurs données ou de maintenir la qualité de leur service. Lors d'une tentative de scraping de Magic Eden, il est possible de se retrouver face à une page bloquée ou à un système de CAPTCHA, empêchant ainsi l'accès aux informations souhaitées.
Heureusement, il existe une solution, et c'est un plugin pour Puppeteer appelé "Stealth". Ce plugin vise à rendre les scripts Puppeteer indétectables en tant que bots en modifiant diverses propriétés du navigateur qui sont couramment utilisées pour l'identification des bots. Pour l'utiliser, il faut d'abord ajouter quelques modules. Ouvrez le terminal et installez-les : npm install puppeteer-extra puppeteer-extra-plugin-stealth.
Lire aussi: L'excellence en course au large : analyse IMOCA et Route du Rhum
Comme indiqué dans la documentation, il faudra ajouter et modifier quelques lignes de code au début du script :
const puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');puppeteer.use(StealthPlugin());// ... le reste de votre code Puppeteer ...En intégrant ce plugin au code, on peut souvent passer outre les systèmes de détection. Par exemple, il a été possible d'accéder à Magic Eden sans être signalé comme un bot. Cependant, même avec Stealth, il peut y avoir des problèmes de timing où le contenu n'est pas encore chargé lorsque le script tente de l'extraire. Une solution simple à cela est d'ajouter une fonction waitForTimeout() pour attendre quelques secondes avant de continuer avec le code, offrant ainsi au site le temps nécessaire pour charger complètement ses éléments dynamiques.
Extraire des Données Spécifiques : Le Cas des Prix NFT sur Magic Eden
Une fois l'accès à la page web sécurisé, l'étape suivante consiste à identifier et extraire les informations spécifiques désirées. Dans le contexte d'un bot scraper pour Magic Eden, l'objectif principal est souvent le prix plancher (Floor Price) d'une collection de NFT. Il s'agit de la valeur la plus basse à laquelle un NFT d'une collection est actuellement en vente, une donnée cruciale pour les traders et les collectionneurs.
Pour cibler précisément cette information, il est essentiel d'inspecter l'élément HTML qui contient le prix. En cliquant avec le bouton droit de la souris sur l'élément et en choisissant "Inspecter", on peut identifier les balises, classes ou identifiants HTML qui encapsulent le prix. C'est là que la partie difficile arrive : il faut un moyen de reconnaître où se trouve le prix par une balise, une classe ou un identifiant.
Supposons que nous ne nous intéressions qu'au prix plancher. On peut constater que cette information se trouve à la première position d'un tableau ou d'un bloc de texte spécifique. De plus, on observe que le prix est constitué de nombres qui suivent la chaîne de caractères "Floor Price" jusqu'à l'espace suivant. Puisque nous savons comment trouver cette chaîne, nous allons utiliser une expression régulière (Regular Expression) pour le faire.
Nous allons ajouter la constante suivante à notre code : const regEx = /(?<=Floor Price)[0-9.]+/g. Cette expression régulière est conçue pour capturer une séquence de chiffres et de points qui se trouve juste après la chaîne "Floor Price".
Ensuite, en utilisant la fonction exec(), nous obtiendrons un tableau avec le résultat. L'ajout de cela à notre code pourrait ressembler à ceci :
(async () => { const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); const browser = await puppeteer.launch({ headless: true }); // headless: false for visual debugging const page = await browser.newPage(); // Assuming we need to navigate to a specific Magic Eden collection page await page.goto('https://www.magiceden.io/marketplace/your_collection_name', { waitUntil: 'networkidle2' }); await page.waitForTimeout(5000); // Wait for page to fully load, adjust as needed const pageContent = await page.evaluate(() => document.body.innerText); const regEx = /(?<=Floor Price)[0-9.]+/g; const match = regEx.exec(pageContent); if (match && match[0]) { console.log(`Le prix plancher est : ${match[0]}`); } else { console.log("Prix plancher introuvable."); } await browser.close();})();L'exécution de ce code devrait renvoyer un tableau similaire à [ '3.60', index: 11, input: 'Floor Price3.60 ◎Total Volume (ALL Time, ALL Marketplaces)319047.68 ◎Avg Sale Price (Last 24HR)4.39 ◎Total Listed Count724', groups: undefined]. Et voilà, le prix est à la première position de ce tableau. Il est maintenant facile d'y accéder, et cette première partie du tutoriel est terminée. Cet exemple a été réalisé pour trouver le prix d'une collection de NFT, mais cette méthode peut être adaptée pour scraper tout type d'information nécessaire.
Créer des Bots Discord Interactifs et Sécurisés
Au-delà de l'acquisition de données, les bots trouvent une application naturelle dans la gestion et l'animation des serveurs Discord. Apprendre à créer un bot avec discord.js est une étape passionnante pour améliorer l'interactivité et l'automatisation de toute communauté.
Les Fondamentaux du Développement de Bot Discord
La création d'un bot Discord, bien que gratifiante, requiert quelques prérequis. S'il est possible de faire un bot avec très peu de connaissances en JavaScript et en programmation, essayer de le faire sans comprendre le langage d'abord ne fera que vous gêner. Vous pourriez être bloqué par de nombreux problèmes simples, avoir du mal à trouver des solutions à des problèmes incroyablement faciles, et au final, finir frustré. Une solide compréhension des fondamentaux du JavaScript est donc fortement recommandée.
Pour commencer, dans un répertoire où votre code se trouvera, créez un nouveau projet npm avec npm init. Lors de la configuration, il est conseillé de définir le point d'entrée sur bot.js au lieu de index.js pour une meilleure organisation.
Le processus de configuration sur Discord lui-même est crucial. Rendez-vous dans la partie "Bot" des "Paramètres" de l'application et ajoutez un nouveau bot. Ensuite, allez dans la partie "OAuth2" des "Paramètres" de l'application. Faites défiler plus bas pour trouver la section "BOT PERMISSIONS". Sous la section "SCOPES" ci-dessus, vous verrez une URL. Cette URL est celle que vous utiliserez pour inviter votre bot sur votre serveur Discord, en lui accordant les permissions nécessaires pour son fonctionnement.
Gestion des Rôles et Contrôle d'Accès pour la Communauté
L'une des priorités de Discord est d'assurer la confidentialité et la sécurité de nos utilisateurs, y compris lors de l'utilisation de bots. L'accès à certaines données est unique à chaque bot, en fonction de facteurs tels que les paramètres sélectionnés et le statut de vérification. Comme indiqué dans nos Conditions d'utilisation et notre Politique de Confidentialité, les bots sont parfois développés par des tiers, et il est recommandé de consulter les conditions et politiques fournies par le développeur d'un bot afin de comprendre comment vos données sont utilisées et de décider si vous souhaitez utiliser ce bot et participer à un serveur qui l'utilise. Les droits d'accès aux données d'un bot sont susceptibles de changer de temps à autre.
Sur Discord, le contrôle d'accès est effectué via les rôles. Il existe deux approches principales pour gérer l'accès des nouveaux membres via les rôles :
- Ajouter un rôle qui accorde l'accès : Lorsque les membres rejoignent, ils n'ont aucun rôle. Une fois qu'ils se sont présentés, un rôle leur est attribué.
- Retirer un rôle qui interdit l'accès : Lorsque les membres rejoignent, un rôle "Guest" leur est automatiquement attribué, pour lequel les canaux non publics sont configurés pour refuser l'accès. Après leur présentation, le rôle "Guest" leur est retiré.
La seconde approche est souvent préférée car elle signifie que nous n'avons pas à attribuer à tous les membres existants un nouveau rôle, simplifiant ainsi la gestion.
Voici un exemple de code (extrait de bot.js) montrant comment implémenter un système d'introduction basé sur cette logique :
// bot.js...const INTRODUCTIONS_CHANNEL_ID = "<VOUS_DEVREZ_TROUVER_CET_ID_SUR_LE_SERVEUR_DISCORD>";const GUEST_ROLE_ID = "<VOUS_DEVREZ_TROUVER_CET_ID_SUR_LE_SERVEUR_DISCORD>";// Initialisation du bot Discord (code omis pour la concision)// const { Client, Intents } = require('discord.js');// const bot = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] });// bot.login('YOUR_BOT_TOKEN');bot.on('messageCreate', async msg => { // messageCreate est la version la plus récente pour discord.js v13+ if (msg.author.bot) return; // Ignore messages from other bots if (msg.content.startsWith('!intro ')) { if (msg.channel.id.toString() !== INTRODUCTIONS_CHANNEL_ID) { const introductionsChannelName = msg.guild.channels.cache.get(INTRODUCTIONS_CHANNEL_ID).name; // .resolve est déprécié return msg.reply( `Veuillez utiliser la commande !intro dans le canal ${introductionsChannelName} !` ); } const introMsg = msg.content.substring('!intro '.length).trim(); const minMsgLength = 20; if (introMsg.length < minMsgLength) { return msg.reply( `Veuillez écrire une introduction d'au moins ${minMsgLength} caractères !` ); } const member = msg.guild.members.cache.get(msg.author.id); // Utilisation de .cache.get pour un membre try { if (member && member.roles.cache.has(GUEST_ROLE_ID)) { // Vérifie si le membre existe et a le rôle await member.roles.remove(GUEST_ROLE_ID); return msg.reply( 'Heureux de te connaître ! C\'est tout !' // Traduction du message original ); } else if (member && !member.roles.cache.has(GUEST_ROLE_ID)) { return msg.reply('Tu as déjà été introduit ! Bienvenue !'); } else { return msg.reply('Une erreur est survenue lors de l\'attribution des rôles.'); } } catch (error) { console.error('Erreur lors de la gestion des rôles :', error); return msg.reply('Désolé, une erreur est survenue lors de votre introduction.'); } }});Il faut trouver l'ID du canal d'introductions en allant sur votre serveur Discord dans l'application Discord, en faisant un clic droit sur le canal d'introductions et en cliquant sur "Copier l'ID". Faites de même pour le GUEST_ROLE_ID. Si vous vous attribuez un rôle "Guest" sur le serveur Discord et que vous tapez ensuite !intro Salut c'est mon introduction, je suis content d'être ici., le bot retirera le rôle "Guest", vous permettant d'accéder aux autres canaux. C'est tout !
Les Multiples Facettes et Potentiels des Bots Discord
Les bots Discord ne se limitent pas à l'extraction de données ou à la simple gestion des rôles. Ils constituent un écosystème riche en fonctionnalités, capable de transformer l'expérience communautaire. Les explications approfondies et les exemples concernant des sujets populaires (par exemple, travailler avec des bases de données) peuvent enrichir davantage les capacités d'un bot.
Un Écosystème Riche et Diversifié
Les bots peuvent remplir une multitude de rôles, répondant à presque tous les besoins d'un serveur Discord. Leurs applications sont vastes et variées :
- La Modération : Automatisation des tâches de surveillance et d'application des règles.
- Les Niveaux et l'Économie : Systèmes de progression et de monnaie virtuelle pour engager les membres.
- Les Réactions : Interactions simplifiées via les émojis pour déclencher des actions ou des rôles.
- L'Automatisation : Exécution de tâches répétitives, comme l'envoi de messages de bienvenue ou la publication d'annonces.
- Les Statistiques : Collecte et affichage de données sur l'activité du serveur ou des membres.
- Les Conversations : Bots de chat ou d'assistance.
- Les Informations : Fourniture de données externes (météo, actualités, prix du marché, etc.) ou internes au serveur.
- Des Outils : Utilitaire divers (minuteurs, sondages, convertisseurs).
- Le Contrôle : Gestion des permissions et des configurations du serveur.
Exemples Concrets de Fonctionnalités avec DraftBot
Un bot comme DraftBot illustre parfaitement la polyvalence et la puissance que les bots peuvent apporter à un serveur Discord, offrant un éventail de fonctionnalités accessibles et intuitives.
Action Réaction : L'Intuitivité à Portée de Clic
Avec "Action Réaction", tout devient facile, accessible, intuitif. Un clic, un émoji et DraftBot réagit. Il est possible d'utiliser l'ensemble des commandes grâce aux réactions, jusque dans les moindres détails. C'est une manière simple et visuelle pour les membres d'interagir avec le bot et de déclencher des actions sans avoir à taper de longues commandes textuelles.
Level & Économie : Dynamiser l'Engagement des Membres
Les systèmes de niveaux et d'économies personnalisables permettent à vos membres de se démarquer sur votre serveur. Vous pourrez afficher le classement, proposer des récompenses, une boutique et bien plus encore ! Ces systèmes incitent à la participation active, récompensent l'engagement et créent un sentiment de progression au sein de la communauté. Les membres peuvent gagner des points d'expérience en interagissant, monter de niveau et utiliser une monnaie virtuelle pour acheter des objets ou des avantages virtuels.
Modération : Une Main de Fer dans un Gant de Velours
Qui osera vous tenir tête avec DraftBot à vos côtés ? La modération est un pilier essentiel pour maintenir un environnement sain et respectueux sur tout serveur. DraftBot offre des outils de modération robustes : avertissements, sourdine, exclusion ou bannissement. Tous ces outils, individuels ou regroupés dans une seule commande de sanction, seront votre meilleure arme. Ils permettent aux administrateurs et aux modérateurs de gérer efficacement les comportements perturbateurs, garantissant ainsi une expérience agréable pour tous.