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.

    CORS using node_helper.js for Uber and Lyft APIs

    Scheduled Pinned Locked Moved Troubleshooting
    10 Posts 4 Posters 4.1k Views 3 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.
    • kalK Offline
      kal @cowboysdude
      last edited by

      @cowboysdude isn’t that what I am doing? Can you explain how your solution differs from mine?

      1 Reply Last reply Reply Quote 0
      • cowboysdudeC Offline
        cowboysdude Module Developer
        last edited by

        When you request a webpage, your browser sends a number of headers to the server hosting the site that you’re visiting.

        These headers occur during a negotiation process that helps the browser and the hosting server determine the best way to provide the requested information. The user-agent header identifies the application requesting the information from the server, typically a browser. This identification string is called the user-agent string and contains tokens that provide specific details about the program making the request.

        kalK 1 Reply Last reply Reply Quote 0
        • kalK Offline
          kal @cowboysdude
          last edited by

          @cowboysdude I don’t think the user-agent string is required when making an HTTP request. According to the Uber API docs it doesn’t look like I need one.

          1 Reply Last reply Reply Quote 0
          • A Offline
            Anhalter42 @kal
            last edited by

            @kal well then… I know its not helping, but it should work as you described. Not seeing anything in js console is a serious problem when developing. Did you try other browsers? If nothing appears in any browser AND on raspberry itself (with npm start dev), then something is seriously wrong…

            1 Reply Last reply Reply Quote 0
            • kalK Offline
              kal
              last edited by

              I was able to fix this. See below for the module code

              /* global Module */
              
              /* Magic Mirror
               * Module: Uber
               * 
               * Shows the time and surge pricing for UberX
               *
               * By Kyle Kelly
               * based on MagicMirror work by Michael Teeuw http://michaelteeuw.nl
               * and by derickson https://github.com/derickson/MMderickson/tree/master/uber
               * MIT Licensed.
               */
              
              Module.register("MMM-uber",{
              
              	// Default module config.
              	defaults: {
              		lat: null,
              		lng: null,
              		ride_type: "uberX",
              		uberServerToken: null,
              
              		updateInterval: 5 * 60 * 1000, // every 5 minutes
              		animationSpeed: 1000,
              	},
              
              	// Define required scripts.
              	getScripts: function() {
              		return ["moment.js", "https://code.jquery.com/jquery-2.2.3.min.js"];
              	},
              
              	// Define required styles.
              	getStyles: function() {
              		return ["MMM-uber.css"];
              	},
              
              	start: function() {
              		Log.info("Starting module: " + this.name);
              
              		// Set locale.
              		moment.locale(config.language);
              
              		// variables that will be loaded from service
              		this.uberTime = null;
              		this.uberSurge = null;
              
              		this.loaded = false;
              		Log.log("Sending CONFIG to node_helper.js in " + this.name);
              		Log.log("Payload: " + this.config)
              		this.sendSocketNotification('CONFIG', this.config);
              	},
              
              	// unload the results from uber services
              	processUber: function(FLAG, result) {
              		var self = this;
              		Log.log("ProcessUber");
              
              		// go through the time data to find the uberX product
              		if (FLAG === "TIME"){
              			Log.log("Time:");
              			Log.log(result);
              			for (var i = 0, count = result.times.length; i < count ; i++) {
              
              				var rtime = result.times[i];
              				
              				if(rtime.display_name === this.config.ride_type){
              					// convert estimated seconds to minutes
              					this.uberTime = rtime.estimate / 60;
              					break;
              				}
              			}
              		}
              
              		// go through the price data to find the uberX product
              		else if (FLAG === "PRICE"){
              			Log.log("Price:");
              			Log.log(result);
              			for( var i=0, count = result.prices.length; i< count; i++) {
              				var rprice = result.prices[i];
              
              				if(rprice.display_name === this.config.ride_type){
              					// grab the surge pricing
              					this.uberSurge = rprice.surge_multiplier;
              					break;
              				}
              			}
              		}
              	},
              
              	// Override dom generator.
              	getDom: function() {
              		var wrapper = document.createElement("div");
              
              		var uber = document.createElement("div");
              		uber.className = "uberButton";
              		
              		var uberIcon = document.createElement("img");
              		uberIcon.className = "badge";
              		uberIcon.src = "modules/MMM-uber/UBER_API_Badges_1x_22px.png";
              
              		var uberText = document.createElement("span");
              
              		if(this.loaded) {
              			var myText = this.config.ride_type + " in "+ this.uberTime +" min ";
              			Log.log("ubersurge: " + this.uberSurge);
              			// only show the surge pricing if it is above 1.0
              			if(typeof this.uberSurge !== "undefined" && this.uberSurge > 1.0){
              				myText += " - " + this.uberSurge + "X surge pricing";
              			}
              			uberText.innerHTML = myText;
              		} else {
              			// Loading message
              			uberText.innerHTML = "Checking Uber status ...";
              		}
              
              		uber.appendChild(uberIcon);
              		uber.appendChild(uberText);
              		
              		wrapper.appendChild(uber);
              		return wrapper;
              	},
              
              	socketNotificationReceived: function(notification, payload) {
              		Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
              		if (notification === "TIME") {
              			this.processUber("TIME", JSON.parse(payload));
              			this.updateDom(this.config.animationSpeed)
              		}
              		else if (notification === "PRICE") {
              			this.processUber("PRICE", JSON.parse(payload));
              			this.loaded = true;
              			this.updateDom(this.config.animationSpeed);
              		}
              	}
              
              });
              
              

              and the node_helper.js code

              'use strict';
              
              /* Magic Mirror
               * Module: MMM-uber
               *
               * By Kyle Kelly
               * MIT Licensed.
               */
              
              const NodeHelper = require('node_helper');
              var request = require('request');
              var moment = require('moment');
              
              module.exports = NodeHelper.create({
              
              	start: function() {
              		var self = this;
              		console.log("Starting node helper for: " + this.name);
              
              		this.config = null;
              	},
              
              	getData: function() {
              		var self = this;
              
              		this.sendSocketNotification("Test", 2);
              		this.sendSocketNotification("LATITUDE", this.config.lat);
              		this.sendSocketNotification("LONGITUDE", this.config.lng);
              						
              		
              		request({
              			url: "https://api.uber.com/v1/estimates/time?start_latitude=" + this.config.lat + "&start_longitude=" + this.config.lng,
              			method: 'GET',
              			headers: {
              		        'Authorization': 'Token ' + this.config.uberServerToken,
              		        'Accept-Language': 'en_US',
              		        'Content-Type': 'application/json'
              		    },
              		}, function (error, response, body) {
              			
              			if (!error && response.statusCode == 200) {
              				self.sendSocketNotification("TIME", body);
              			}
              			else {
              				self.sendSocketNotification("ERROR", "In TIME request with status code: " + response.statusCode);
              			}
              		});
              
              		request({
              			url: "https://api.uber.com/v1/estimates/price?start_latitude=" + this.config.lat + "&start_longitude=" + this.config.lng + "&end_latitude=" + this.config.lat + "&end_longitude=" + this.config.lng,
              			method: 'GET',
              			headers: {
              				'Authorization': 'Token ' + this.config.uberServerToken,
              		        'Accept-Language': 'en_US',
              		        'Content-Type': 'application/json'
              		    },
              		}, function (error, response, body) {
              			
              			if (!error && response.statusCode == 200) {
              				self.sendSocketNotification("PRICE", body);
              			}
              			else {
              				self.sendSocketNotification("ERROR", "In PRICE request with status code: " + response.statusCode);
              			}
              		});
              
              		setTimeout(function() { self.getData(); }, this.config.updateInterval);
              		
              	},
              
              	socketNotificationReceived: function(notification, payload) {
              		//var self = this;
              		this.sendSocketNotification("Test", 0);
              		if (notification === 'CONFIG') {
              			this.sendSocketNotification("Test", 1);
              			this.config = payload;
              			this.getData();
              		}
              	}
              });
              
              
              1 Reply Last reply Reply Quote 0
              • 1 / 1
              • 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