MagicMirror Forum
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • 3rd-Party-Modules
    • Donate
    • Discord
    • Register
    • Login
    A New Chapter for MagicMirror: The Community Takes the Lead
    Read the statement by Michael Teeuw here.

    module that displays a certain text from a website, the text on the website is updated daily

    Scheduled Pinned Locked Moved Requests
    36 Posts 6 Posters 10.0k Views 7 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A Offline
      Amoniak
      last edited by Amoniak

      i installed cheerio, but i don’t know how to use it.
      do I have to put this now in my “MMM-PoemOfTheDay.js” ?
      Bild 20.01.21 um 23.10.jpg

      S 1 Reply Last reply Reply Quote 0
      • S Offline
        sdetweil @Amoniak
        last edited by

        @Amoniak gotta go read the library usage

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        1 Reply Last reply Reply Quote 0
        • L Offline
          lolo
          last edited by

          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.

          1 Reply Last reply Reply Quote 0
          • A Offline
            Amoniak
            last edited by

            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;
            
            };
            
            1 Reply Last reply Reply Quote 0
            • A Offline
              ashishtank Module Developer
              last edited by

              @Amoniak there are lots of missing pieces… add console.log with some message in each function and see how the flow works.

              1 Reply Last reply Reply Quote 0
              • L Offline
                lolo
                last edited by

                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);
                            
                      
                    });   
                
                A 1 Reply Last reply Reply Quote 0
                • F Offline
                  fordi
                  last edited by

                  I bet you could use the same technique to see if any playstation 5 are in stock on websites?

                  1 Reply Last reply Reply Quote 0
                  • A Offline
                    Amoniak @lolo
                    last edited by

                    @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?

                    1 Reply Last reply Reply Quote 0
                    • L Offline
                      lolo
                      last edited by

                      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();
                              }
                          },
                      });
                      
                      
                      1 Reply Last reply Reply Quote 1
                      • L Offline
                        lolo
                        last edited by

                        Now create MMM-Dnevni_citat.js
                        Inside you need first to registar module

                        Module.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;
                               }
                            },
                        
                        A 1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 3
                        • 4
                        • 2 / 4
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Sam, technical setup by Karsten.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy