Read the statement by Michael Teeuw here.
module that displays a certain text from a website, the text on the website is updated daily
-
@Amoniak gotta go read the library usage
-
It gonna be harder than u think as your text is changing daily. Just follow the the pattern.
Every day this is changed( https://wol.jw.org/hr/wol/h/r19/lp-c).
new day new text.
Text is in :
div id=“dailyText”
but if you ignore reference in text as (Mat. 16:24, 25; Ivan 15:20) located in a class it’s gonna be more easier.
And with cheerio u can complete this. -
so, this is what my NodeHelper.js looks like. like i thought, the screen is black.
const axios = require("axios"); const DetectLanguage = require("detectlanguage"); module.exports = NodeHelper.create({ socketNotificationReceived: async function(noti, payload) { if (noti === "START") { if (payload.updateInterval < 120000) { payload.updateInterval = 120000; } const self = this; (async function displayWatchtower () { const poem = await getWatchtower(payload); self.sendSocketNotification("UPDATE", poem); setTimeout(displayPoem, payload.updateInterval); })(); } } }); const cheerio = require("cheerio"); const axios = require("axios").default; const fethHtml = async url => { try { const { data } = await axios.get(url); return data; } catch { console.error(`ERROR: An error occurred while trying to fetch the URL: ${url}`); } }; const extracWatchtower = selector => { const theme = selector .find(".tabContent active") .find("[class='themeScrp'] > [class='b']) .text() .trim(); const text = selector .find(".bodyTxt") .find("[class='section']") .text() .trim(); return { theme, text }; }; const scrapWatchtower = async () => { const watchtowerUrl = "https://wol.jw.org/hr/wol/h/r19/lp-c"; const html = await fethHtml(watchtowerUrl); const selector = cheerio.load(html); const searchResults = selector("body") .find("#dailyText" ); const deals = searchResults.map((idx, el) => { const elementSelector = selector(el); return extractDeal(elementSelector) }) .get(); return Watchtower; };
-
@Amoniak there are lots of missing pieces… add console.log with some message in each function and see how the flow works.
-
Try to do something with this code. It will retrieve data from current day. Modifying that node_helper is not great idea.
const url= 'https://wol.jw.org/hr/wol/h/r19/lp-c'; request({ url: url, method: 'GET' }, (error, response, body) => { if (error) { return console.error(error) }; var $ = cheerio.load(body); //console.log($.html()); const data = $('div[class="tabContent"]').first(); let header = $(data).find('h2').text(); let title = $(data).find('p').first().text(); let text = $(data).find('div.pGroup>p').text(); //console.log(header,title,text); var recivedData={ header, title, text }; //console.log(recivedData); });
-
I bet you could use the same technique to see if any playstation 5 are in stock on websites?
-
@lolo thank you for the code.
I used the “MagicMirror-Module-Template” to create a new file and the associated folder.
this is my js:‘’’
Module.register(“dnevni_citat”, {
defaults: {
updateInterval: 60000,
retryDelay: 5000
},requiresVersion: "2.1.0", // Required version of MagicMirror start: function() { var self = this; var dataRequest = null; var dataNotification = null; //Flag for check if module is loaded this.loaded = false; // Schedule update timer. this.getData(); setInterval(function() { self.updateDom(); }, this.config.updateInterval); }, const url= 'https://wol.jw.org/hr/wol/h/r19/lp-c'; request({ url: url, method: 'GET' }, (error, response, body) => { if (error) { return console.error(error) }; var $ = cheerio.load(body); //console.log($.html()); const data = $('div[class="tabContent"]').first(); let header = $(data).find('h2').text(); let title = $(data).find('p').first().text(); let text = $(data).find('div.pGroup>p').text(); //console.log(header,title,text); var recivedData={ header, title, text }; //console.log(recivedData); } },
‘’’
what am I doing wrong? -
This should be your node_helper.
const NodeHelper = require("node_helper"); const cheerio = require("cheerio"); const request = require('request'); module.exports = NodeHelper.create({ start: function () { self = this; console.log("Starting node_helper for: " + this.name); }, getData: function () { const url = 'https://wol.jw.org/hr/wol/h/r19/lp-c'; request({ url: url, method: 'GET' }, (error, response, body) => { if (error) { return console.error(error) }; var $ = cheerio.load(body); //console.log($.html()); const data = $('div[class="tabContent"]').first(); let header = $(data).find('h2').text(); let title = $(data).find('p').first().text(); let text = $(data).find('div.pGroup>p').text(); //console.log(header,title,text); var recivedData = { header, title, text } console.log(recivedData); self.sendSocketNotification('TEXT_RESULT', recivedData); }); }, socketNotificationReceived: function (notification, payload) { if (notification === 'GET_TEXT_DATA') { self.getData(); } }, });
-
Now create MMM-Dnevni_citat.js
Inside you need first to registar moduleModule.register("MMM-Dnevni_citat", { defaults: { updateInterval: 10 x 60 x 1000, // minute ,seconds ,milliseconds //retryDelay: 5000 // not needed for now },
Then first function will be start function
start: function () { Log.info("Starting module: " + this.name); requiresVersion: "2.1.0"; this.loaded = false; this.scheduleUpdate(); },
with first function we are calling second ( scheduleUpdate) , how often will fetch data.
scheduleUpdate: function () { setInterval(() => { this.getData(); }, this.config.updateInterval); this.getData(); },
Then we are calling getData function. Sending socketNotification to node_helper.
getData: function () { this.sendSocketNotification(''GET_TEXT_DATA'', this.config); },
Whe node_helper send back, next function will check if data is received and update DOM
socketNotificationReceived: function (notification, payload) { if (notification === "TEXT_RESULT") { this.textDataRecived = payload; this.loaded = true; },this.updateDom();
Now only is left to create DOM
getDom: function () { var wrapper = document.createElement("div"); if (!this.loaded) { wrapper.innerHTML = "LOADING"; return wrapper; } if (this.loaded) { // here to add elements and styling return wrapper; } },
-
@lolo
i did that. it is still not displayed
i added this configuration in the config.js file:{
module: “MMM-Dnevni_citat”,
position: “middle_center”