const Wikiapi = require('wikiapi'); const wiki = new Wikiapi('fr'); const axios = require('axios'); // == Functions // Fonction de nettoyage personnalisée (pour infobox) function cleanInfoboxText(text) { // Supprimer les balises HTML const cleanedText = text.replace(/<\/?[^>]+(>|$)/g, ""); // Supprimer les caractères '{' et '}' const cleanedTextWithoutBraces = cleanedText.replace(/[{}]/g, ""); // Supprimer le caractère '|' const cleanedTextWithoutPipe = cleanedTextWithoutBraces.replace(/\|/g, ""); // Supprimer les caractères '[' et ']' const finalText = cleanedTextWithoutPipe.replace(/[\[\]]/g, ""); return finalText.trim(); } // Fonction pour récupérer les informations d'un article depuis l'API MediaWiki async function fetchArticleInfoFromAPI(articleTitle) { try { // Définir les paramètres de la requête pour obtenir les suggestions de titre const suggestionParams = new URLSearchParams({ action: 'opensearch', search: articleTitle, format: 'json', }); // Effectuer la requête GET pour obtenir les suggestions de titre const suggestionResponse = await axios.get(`https://fr.wikipedia.org/w/api.php?${suggestionParams.toString()}`); const suggestionData = suggestionResponse.data; // Vérifier s'il y a des suggestions de titre if (Array.isArray(suggestionData[1]) && suggestionData[1].length > 0) { // Utiliser le premier titre suggéré comme titre de l'article articleTitle = suggestionData[1][0]; } // Répéter la requête pour obtenir les informations de l'article avec le titre corrigé ou suggéré const params = new URLSearchParams({ action: 'query', titles: articleTitle, format: 'json', prop: 'extracts|info|revisions|pageimages', // Ajoutez 'pageimages' pour obtenir les informations sur l'image inprop: 'url', explaintext: true, rvprop: 'timestamp|user|size|ids', rvlimit: 1, piprop: 'original', // Spécifiez 'original' pour obtenir l'URL de l'image originale }); // Effectuer la requête GET à l'API MediaWiki const response = await axios.get(`https://fr.wikipedia.org/w/api.php?${params.toString()}`); const data = response.data; // ==== RECHERCHE INFOBOX ==== let infobox = {}; // Vérifiez si articleTitle est défini et non vide if (articleTitle) { const page_data = await wiki.page(articleTitle); const parsed = page_data.parse(); // Filtre des données compliquée à représentée const variablesExclues = ['image', 'blason', 'drapeau', 'logo', 'légende', 'carte', 'légende-carte', '_', 'statut', 1, 2, 3, 4, 5, 6, 7, 8, 9]; // Lire les modèles Infobox, les convertir en JSON. parsed.each('template', (template_token) => { if (template_token.name.startsWith('Infobox')) { const parameters = template_token.parameters; for (const key of Object.keys(parameters)) { const value = parameters[key]; if (value !== '' && !variablesExclues.some(excluded => key.includes(excluded))) { infobox[key] = cleanInfoboxText(value.toString()); // Appliquer la fonction de nettoyage ici } } return parsed.each.exit; } }); // Vérifiez si l'infobox est vide if (Object.keys(infobox).length === 0) { console.log("Warning : Pas d'infobox"); infobox = { Erreur: "Pas d'infobox sur wikipédia" }; } } else { return null; } // ------------------------------------------------------------ // Vérifier si 'query' existe dans les données if (data.query) { // Obtenir la première page (il peut y avoir plusieurs résultats, nous prenons le premier) const page = Object.values(data.query.pages)[0]; if (page.missing !== undefined) { console.log(`Warning : l'article "${articleTitle}" n'a pas été trouvé.`); return null; } else { // Fonction pour limiter le texte à 300 caractères et s'arrêter au dernier point function limitTextTo300Chars(text) { if (text.length <= 300) { // Si le texte est déjà inférieur ou égal à 300 caractères, retournez-le tel quel return text; } else { // Trouvez le dernier point dans les 300 premiers caractères const truncatedText = text.substring(0, 300); const lastPeriodIndex = truncatedText.lastIndexOf('.'); if (lastPeriodIndex !== -1) { // S'il y a un point dans les 300 premiers caractères, coupez le texte jusqu'à ce point return truncatedText.substring(0, lastPeriodIndex + 1); } else { // S'il n'y a pas de point, retournez simplement les 200 premiers caractères return truncatedText; } } } // Extraire les informations const articleInfo = { url: page.fullurl, title: page.title, extract: page.extract ? limitTextTo300Chars(page.extract) : 'Non disponible', lastEdit: page.revisions ? new Date(page.revisions[0].timestamp).toLocaleString() : 'Non disponible', numRevisions: page.revisions ? page.revisions[0].revid : 'Non disponible', pageSize: page.revisions ? page.revisions[0].size : 'Non disponible', firstRevisionUser: page.revisions ? page.revisions[0].user : 'Non disponible', latestRevisionId: page.revisions ? page.revisions[0].revid : 'Non disponible', pageId: page.pageid ? page.pageid : 'Non disponible', latestVersion: page.revisions ? page.revisions[0].parentid : 'Non disponible', wordCount: page.extract ? page.extract.split(/\s+/).length : 'Non disponible', charCount: page.extract ? page.extract.length : 'Non disponible', lastContributor: page.revisions ? page.revisions[0].user : 'Non disponible', image: page.original ? page.original.source : 'Non disponible', infobox, }; return articleInfo; } } else { console.log(`Warning : l'article "${articleTitle}" n'a pas été trouvé.`); return null; } } catch (error) { console.error('Erreur : lors de la récupération des informations depuis l\'API :', error); return null; } } module.exports = { fetchArticleInfoFromAPI };