// https://www.mediawiki.org/wiki/Manual:Random_page /** * Post de page aléatoire du wiki osm avec le compte curator */ import fetch from "node-fetch" import rp from "request-promise"; import $ from "cheerio"; import fs from "fs"; import path from 'path'; import {randomIntFromInterval, sendPostMastodon} from "./utils.js"; const __dirname = path.resolve(); // select one line of table to override description // const selectionOverrideOfSectionTable = 2; // const selectionOverrideOfLineTable = 7; // select randomly a line const selectionOverrideOfSectionTable = ''; const selectionOverrideOfLineTable = ''; // const reallySendToot = false; const reallySendToot = true; function getRandomWikiOSMPage() { // get all FR tags // const url = "https://wiki.openstreetmap.org/w/index.php?title=Special:Categories&offset=FR&limit=500" const url = "https://wiki.openstreetmap.org/wiki/Special:AllPages?from=&to=&namespace=202&limit=500" // get a random page wich is not a discussion // const url = "https://wiki.openstreetmap.org/wiki/Special:Random?namespace=all-discussions%3B1%3B2%3B3%3B5%3B7%3B9%3B11%3B120%3B121%3B122%3B123%3B201%3B203&invert=1&limit=10&days=1&enhanced=1&namespace__202_color=c1&urlversion=2" rp(url) .then(function (html) { //success! const wikiUrls = []; const filteredHtml = $('.mw-spcontent ul li a', html) console.log("filteredHtml.length", filteredHtml.length) // .filter(elem => { // return (elem.attribs.title.indexOf('description for') === -1) // }) for (let i = 0; i < filteredHtml.length; i++) { // const contentCurated = filteredHtml[i] const contentCurated = filteredHtml[i].attribs.href wikiUrls.push(contentCurated); } console.log(wikiUrls); return wikiUrls; }) .catch(function (err) { //handle error console.error(err) }); } export default function getElementCartographique() { const url = "https://wiki.openstreetmap.org/wiki/FR:%C3%89l%C3%A9ments_cartographiques" const titleLink = "#toc a" const listElementSelector = "#toc a" // prendre un lien dans la table des matières de la page, extraire l'id du lien. // prendre une ligne de tableau au hasard correspondant à l'ID de la section const titleSelector = "" return fs.readFile(__dirname + '/assets/documents/elements_carto_osm.html', 'utf8', function (err, html) { if (err) { return console.log(err); } // console.log(data); //success! const wikiUrls = []; // const listOfLinks = $(titleLink, html) // console.log("filteredHtml.length", listOfLinks.length) // const selectedTocLink = getRandomElementOfArray(listOfLinks).attribs.href; // console.log("selectedTocLink", selectedTocLink) const listOfTableRows = $('.wikitable', html); let keys = Object.keys(listOfTableRows); let randNumber = 0; if (selectionOverrideOfSectionTable) { randNumber = selectionOverrideOfSectionTable } else { randNumber = randomIntFromInterval(0, keys.length) } console.log("rand", randNumber) const foundLine = $(listOfTableRows[randNumber]).find('tr'); // console.log("randomTable",foundTable) // on regarde les lignes du tableau keys = Object.keys(foundLine); if (selectionOverrideOfLineTable) { randNumber = selectionOverrideOfLineTable } else { randNumber = randomIntFromInterval(0, keys.length) } console.log("lignes de tableau", keys.length) console.log("ligne sélectionnée", randNumber) let cells = $(foundLine[randNumber]).find('td') keys = Object.keys(cells); // console.log("cellules trouvées", keys.length) console.log("\n") let result = { key: '', value: '', description: '', long_desc: '', } cells.each((i, element) => { // console.log("cell element", i, $(element).text().trim()) if (i === 0) { result.key = $(element).text().trim(); } if (i === 1) { result.value = $(element).text().trim(); } if (i === 3) { result.description = $(element).text().replace(' ', '').replace(' ', '').trim(); } }) if (!result.key) { console.error("ERROR no key found", $(cells).html()) console.error('no key BOOOOOOOOOOH'); getElementCartographique(); } // aller chercher le lien // si la clé est une description avec des espaces, faire un lien vers la Key let pageLink = `FR:Tag:${result.key}=${result.value}` if (result.value.indexOf(' ') !== -1) { pageLink = `FR:Key:${result.key}` } result.link = `https://wiki.openstreetmap.org/wiki/${pageLink}` const url = result.link // get a random page wich is not a discussion // certaines valeurs ont des espaces, donc pas utilisable en url if (result.value.indexOf(' ') === -1) { console.log("url", url) rp(url).then(function (html) { //success! const descriptionStrophe = ''; const filteredHtml = $('.mw-parser-output', html).find('p') console.log("filteredHtml", filteredHtml.length) result.long_desc = $(filteredHtml).text().substring(0,250) console.log("filteredHtml", result.long_desc) // image de description: // let imgSelector = ".description a.image img" console.log("✅ cette page existe bien en Français sur le wiki OSM") sendMessageWikiTagOfTheDay(makePostMessageFromObj(result)) }, (err) => { console.error(err.statusCode) if (err.statusCode == 404) { console.log("\n Cette page n'existe pas encore, c'est le moment de la créer.", `https://wiki.openstreetmap.org/w/index.php?title=FR:${result.key}=${result.value}`) //FR:Tag:boundary%3Dborder_zone&action=edit) console.log("Essayez de voir si la version en Anglais existe.") let englishPage = `https://wiki.openstreetmap.org/wiki/Tag:${result.key}=${result.value}` let englishKey = `https://wiki.openstreetmap.org/wiki/Key:${result.key}` console.log("-> ", englishPage) checkExistenceOfWebPage(englishPage).catch(err=> { checkExistenceOfWebPage( englishKey) }); console.log("bon spa tout ça on essaie une autre ligne") getElementCartographique() } }) } else { console.log("result", result) } return result; }); } /** * check if a page anwsers to a GET request * @param url * @returns {*} */ function checkExistenceOfWebPage(url) { return rp(url).then((html) => { console.log("oui cette page existe!", url) }, (err) => { console.log("hé non. WTF ?") }) } function makePostMessageFromObj(result) { return ` # [Le tag OSM du jour : ${result.key}=${result.value} ](${result.link}) 🗺️🏷️ ${result.description.trim()} > ${result.long_desc.trim()} #osm #openstreetmap #wiki #rtfw ` } function getQuery() { // var url = "https://wiki.openstreetmap.org/w/api.php"; var url = "https://fr.wikipedia.org/w/api.php"; var params = { action: "query", format: "json", list: "random", enhanced: "1", hiderobot: "1", urlversion: "2", invert: "1", rnnamespace: "all-discussions%3B1%3B2%3B3%3B5%3B7%3B9%3B11%3B120%3B121%3B122%3B123%3B201%3B203", // WIKI et FR: lang: "FR", rnlimit: "5" }; url = url + "?&origin=*"; Object.keys(params).forEach(function (key) { url += "&" + key + "=" + params[key]; }); return fetch(url) .then(function (response) { return response.json(); }) .then(function (response) { const randoms = response.query.random; for (let ii = 0; ii < randoms.length; ii++) { // console.log(randoms[ii].title); console.log("randoms[ii]", randoms[ii]) } }) .catch(function (error) { console.log(error); }); } // run const res = getElementCartographique() // console.log("res", res) function sendMessageWikiTagOfTheDay(message) { let configPost = { author: 'curator', image: 'osm_default.jpg', message, // reallySendPost: true, reallySendPost: reallySendToot, } sendPostMastodon(configPost) }