none
Gather website data with PowerShell

    Question

  • Hello, 

    I'm trying to read info from a website and feed it to OMS for analysis but the website seems to be all javascript and can't seem to get the info I want. Anyone know how to pull website info if the website is using javascript via Powershell?

    I've tried Invoke-WebRequest which did not work because I can't find the HTML code to pull from. I also tried 

    My PowerShell Code:


    $webclient = new-object System.Net.WebClient
    $webclient.Credentials = new-object System.Net.NetworkCredential("username","password")
    $webpage = $webclient.DownloadString("https://mythermostat.sensicomfort.com/")

    $URI = “https://mythermostat.sensicomfort.com/ “ $HTML = Invoke-WebRequest -Uri $URI $HTML.ParsedHTML.getElementsByTagName('div') | Where-Object {$_.ClassName -eq 'Current-Temp'}



    I listed the HTML code below, any help would be greatly appreciated.

                                                            
    <html class=" js rgba borderradius boxshadow textshadow opacity cssanimations cssgradients csstransitions fontface svg svgclippaths gr__mythermostat_sensicomfort_com"><head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
            <title>Sensi - Simply/Sensible</title>
            <meta name="description" content="">
            <link rel="stylesheet" href="css/bootstrap.css">
            <link rel="stylesheet" href="css/bootstrap-editable.css">
            <link rel="stylesheet" href="css/application.css">
            <link rel="stylesheet" href="css/jquery.mCustomScrollbar.css">
            <script src="scripts/storage.js"></script><script type="text/javascript" src="scripts/config.js"></script>
            <script type="text/javascript" src="scripts/modernizr-2.6.2.min.js"></script>
            <script src="scripts/jquery-1.9.1.js" type="text/javascript"> </script>
            <script type="text/javascript">
                Modernizr.load([
                    {
                        test: $.support.cors,
                        nope: ['scripts/flxhr/flXHR.js', 'scripts/flxhr/jquery.flXHRproxy.js'],
                        complete: function () {
                            if ($.support.cors) return;
                            var options = { flXHR: true, loadPolicyURL: Sensi.Config.Policy };
                            jQuery.flXHRproxy.registerOptions(Sensi.Config.Api, options);
                            jQuery.flXHRproxy.registerOptions(Sensi.Config.Realtime, options);
                            $.support.cors = true;
                            Sensi.flXHR = true;
                        }
                    },
                    { test: Modernizr.localstorage, nope: 'scripts/storage.js' },
                    { test: typeof (window.console) === "undefined", yep: 'scripts/console.js' }
                    ]
                );
            </script>
        </head>
        <body data-gr-c-s-loaded="true" class="">
            <div class="notification" data-bind="template: { foreach: Notifications, name: Sensi.NotificationType, templateUrl: 'partials/notifications' }"></div> <!-- Render notifications as needed -->
            <div id="page" data-bind="template: { name: CurrentPage, afterRender: PageLoad }"><div id="wrap">
        <div id="main">
            <!-- ko with: CurrentThermostat -->
                <!-- ko template: { if: LowPower, name: 'low-power', templateUrl: 'partials/notifications' } --><!-- /ko -->
            <!-- /ko -->
            <div id="ec">
                <!-- ko template: { if: !IsPasswordResetRequired(), data: CurrentThermostat, name: ThermostatState, templateUrl: 'partials/notifications' } --><div id="alert-container">
        <div class="row">
            <div class="col-xs-4 col-md-offset-4">
                <div class="notification-content">
                    <div class="custom-icon custom-loading"></div>
                    <h4><strong>Connecting to thermostat</strong></h4>
                </div>
            </div>
        </div>
    </div><!-- /ko -->
                <div data-bind="with: CurrentThermostat, css: ThermostatRunningMode" class="transition">
                    <div class="container">
                        <div class="canvas transition">
                            <div class="row">
                                <header>
                                    <div class="col-xs-6">
                                        <img src="img/logo-sensi.png" id="logo">
                                    </div>
                                    <div class="col-xs-6" data-bind="if: $parent.IsCurrentThermostatOnline"></div>
                                </header>
                            </div>
    
                            <div id="ec-container">
                                <div class="row">
                                    <div class="col-xs-6">
                                        <h4 class="text-center">
                                            <span data-bind="text: Summary.DeviceName.committedValue">Cabin</span>
                                        </h4>
                                        <div class="status-column tab-content">
                                            <div id="status-closed" class="status tab-pane active">
                                                <a href="#status-opened" data-toggle="tab" class="trigger"></a>
                                                <div class="closed tab-pane active">
                                                    <div class="current-schedule pull-left">
                                                        <span data-bind="text: StatusDisplay"></span>
                                                    </div>
                                                    <div class="pull-right">
                                                        <span href="#" class="on small custom-icon custom-off" data-bind="css: {
                                                                    'custom-off': SystemMode() == 'Off',
                                                                    'custom-heat': SystemMode() == 'Heat',
                                                                    'custom-cool': SystemMode() == 'Cool',
                                                                    'custom-auto': SystemMode() == 'Auto',
                                                                    'custom-aux-heat': SystemMode() == 'Aux'}"></span>
                                                        <span href="#" class="on small custom-icon" data-bind="css: {
                                                                    'custom-fan-auto': FanMode() == 'Auto',
                                                                    'custom-fan-on': FanMode() == 'On'}"></span>
                                                    </div>
    
                                                    <div class="clearfix"></div>
                                                </div>
                                            </div>
                                            <div id="status-opened" class="status tab-pane">
                                                <a href="#status-closed" data-toggle="tab" class="trigger close"></a>
                                                <div class="opened">
                                                    <div class="system-mode">
                                                        <h5>System Mode:</h5>
                                                        <p class="text-center btn-group" data-toggle="buttons" data-bind="foreach: CapableModes"></p>
                                                    </div>
                                                    <div class="fan-mode">
                                                        <h5>Fan Mode:</h5>
                                                        <p class="text-center btn-group" data-toggle="buttons" data-bind="foreach: CapableFanModes">
                                                            <label class="btn custom-icon custom-fan-auto" data-bind="css: {
                                                            on: $parent.FanMode() == $data,
                                                            'custom-fan-on': $data == 'On',
                                                            'custom-fan-auto': $data == 'Auto'}">
                                                                <input type="radio" name="fanMode" data-bind="value: $data, checked: $parent.FanMode, checkedChange: true" value="Auto">
                                                            </label>
    
                                                            <label class="btn custom-icon custom-fan-on" data-bind="css: {
                                                            on: $parent.FanMode() == $data,
                                                            'custom-fan-on': $data == 'On',
                                                            'custom-fan-auto': $data == 'Auto'}">
                                                                <input type="radio" name="fanMode" data-bind="value: $data, checked: $parent.FanMode, checkedChange: true" value="On">
                                                            </label>
                                                        </p>
                                                    </div>
                                                    <div class="scheduler" data-bind="visible: SystemMode() !== 'Off'" style="display: none;">
                                                        <div class="schedule-on-off">
                                                            <div class="pull-left">
                                                                <h5>Schedule:</h5>
                                                            </div>
                                                            <div class="pull-right">
                                                                <div id="scheduler-switch">
                                                                    <div class="make-switch switch-mini has-switch"><div class="switch-animate switch-off"><input name="ScheduleMode" type="checkbox" data-bind="switch: ScheduleMode, switchOptions: { size: 'mini' }"><span class="switch-left switch-mini">ON</span><label class="switch-mini">&nbsp;</label><span class="switch-right switch-mini">OFF</span></div></div>
                                                                </div>
                                                            </div>
                                                            <div class="clearfix"></div>
                                                        </div>
                                                        <select name="scheduleMode" data-bind="visible: $parent.AdvancedScheduling() === 'On' &amp;&amp; ScheduleMode() === 'On', options: Schedules.AvailableSchedules.Running, optionsText: function (item) { return item.Name.committedValue }, optionsValue: 'ObjectId', value: Schedules.ActiveSchedule, optionsCaption: ''" style="display: none;"><option value=""></option>
                                                        </select>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="col-xs-6 ec-controls">
                                        <div id="keypadlockicon" class="keypadlockicon" data-bind="visible: IsKeypadLocked" style="display: none;">
                                            <img src="img/icon-keypadlockout.png">
                                        </div>
                                        <div id="humidity" class="humidity" data-bind="visible: Humidity" style="display: none;"><span data-bind="text: Humidity"></span>%
                                        </div>
                                        <div id="set-current-temp">
                                            <div class="control pull-right" data-bind="template: { data: Setpoints, name: SetpointTemplate, templateUrl: 'partials/setpoint' }"><div id="Off" class="stepper">
       <div class="spinedit"><i class="icon-chevron-up custom-up stepper-up"></i><i class="icon-chevron-down custom-down stepper-down"></i></div>
    </div></div>
                                            <div id="current-temp" class="pull-right">
                                                <span data-bind="text: Temperature"></span><sup data-bind="visible: Temperature" style="display: none;">o</sup>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div data-bind="with: Schedules">
                                    <div id="schedule-timeline-container" data-bind="visible: ActiveSchedules.Running, click: EditActiveSchedule, scroll: { horizontalScroll: true }" class="mCustomScrollbar _mCS_2" style="display: none;"><div class="mCustomScrollBox mCS-light mCSB_horizontal" id="mCSB_2" style="; height:100%; overflow:hidden; max-width:100%;"><div class="mCSB_container mCS_no_scrollbar" style="; left: 0px; width: 0px;">
                                        <ul id="schedule-timeline" data-bind="template: { foreach: ScheduleTimeline, name: Sensi.TimelineType, templateUrl: 'partials/timeline', afterRender: Sensi.Ui.ResizeTimeline }"></ul>
                                    </div><div class="mCSB_scrollTools" style="; display: none;"><div class="mCSB_draggerContainer"><div class="mCSB_dragger" style="; left: 0px;" oncontextmenu="return false;"><div class="mCSB_dragger_bar" style=";"></div></div><div class="mCSB_draggerRail"></div></div></div></div></div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <nav>
                <div class="container">
                    <div class="row">
                        <div class="col-xs-3">
                            <ul>
                                <li>
                                    <div class="dropdown">
                                        <a data-toggle="dropdown" class="viewing-tstat" data-bind="css: { 'dropdown-toggle': HasMultipleStats }">
                                            <span data-bind="with: CurrentThermostat">
                                                <span>Viewing:</span> <span data-bind="text: Summary.DeviceName.committedValue">Cabin</span>
                                            </span>
                                             <i data-bind="visible: HasMultipleStats" class="custom-icon custom-sort-down" style="display: none;"></i>
                                          </a>
                                        <!-- ko if: HasMultipleStats --><!-- /ko -->
                                    </div>
                                </li>
                            </ul>
                        </div>
                        <div class="col-xs-9">
                            <ul id="ec-navigation" class="main-nav pull-right">
                                <li>
                                    <div data-bind="if: IsCurrentThermostatOnline()" class="dropdown"></div>
                                </li>
                                <li><a class="ec-nav-item" data-bind="visible: IsCurrentThermostatOnline, click: ChangeSettingsPage" href="settings/thermostat" style="display: none;">Thermostat Settings</a></li>
                                <li><a class="ec-nav-item" data-bind="click: ChangeSettingsPage" href="settings/account">Account Settings</a></li>
                                <li><a class="ec-nav-item" href="http://www.sensicomfort.com/support/" target="_blank">Help Center</a></li>
                                <li><a class="ec-nav-item" href="#" data-bind="click: Logout">Log Out</a></li>
                            </ul>
                        </div>
                    </div>
                    <div class="clearfix"></div>
                </div>
            </nav>
            <div id="sub-pages" class="container" data-bind="template: { name: SettingsPage, afterRender: Sensi.Ui.LoadSubPage }"></div>
        </div>
    </div>
    <footer>
        <div class="container">
            <div class="row">
                <div class="col-xs-6">
                    <p data-bind="html: getCopyrightInfo()">Copyright © 2016 Emerson Electric Co. All rights reserved.</p>
                </div>
                <div class="col-md-6">
                    <p class="text-right"><a href="http://www.Sensicomfort.com" target="_blank">Sensicomfort.com</a> | <a href="http://www.sensicomfort.com/legal" target="_blank">Legal/Warranty</a> | <a href="http://www.emerson.com" target="_blank">Emerson.com</a></p>
                </div>
            </div>
        </div>
    </footer>
    <script id="blank" type="text/html"><div></div></script>
    <!-- ko if: IsPasswordResetRequired --><!-- /ko -->
    </div> <!--After page name is set, then load it -->
            <script src="scripts/jquery-ui-1.10.3.min.js" type="text/javascript"> </script>
            <script src="scripts/jquery.signalR-1.1.3.js" type="text/javascript"> </script>
            <script src="scripts/jquery.placeholder.js" type="text/javascript"> </script>
            <script src="scripts/jquery.mCustomScrollbar.js"> </script><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.0.6/jquery.mousewheel.min.js"></script>
            <script src="scripts/jquery.validate.js" type="text/javascript"> </script>
            <script src="scripts/bootstrap.js" type="text/javascript"> </script>
            <script src="scripts/backstretch.js" type="text/javascript"></script>
            <script src="scripts/knockout-3.0.0.debug.js" type="text/javascript"> </script>
            <script src="scripts/TrafficCop.min.js" type="text/javascript"> </script>
            <script src="scripts/infuser.min.js" type="text/javascript"> </script>
            <script src="scripts/koExternalTemplateEngine.js" type="text/javascript"> </script>
            <script src="scripts/knockout-extenders.js" type="text/javascript"> </script>
            <script src="scripts/bootstrap-switch.min.js" type="text/javascript"> </script>
            <script src="scripts/bootstrap.stepper.js" type="text/javascript"> </script>
            <script src="scripts/bootstrap-editable.js" type="text/javascript"> </script>
            <script src="scripts/thermostat.js" type="text/javascript"> </script>
            <script src="scripts/sensi-bundle.min.js" type="text/javascript"> </script>
    
    
    <script aria-hidden="true" type="application/x-lastpass" id="hiddenlpsubmitdiv" style="display: none;"></script><script>try{(function() { for(var lastpass_iter=0; lastpass_iter < document.forms.length; lastpass_iter++){ var lastpass_f = document.forms[lastpass_iter]; if(typeof(lastpass_f.lpsubmitorig2)=="undefined"){ lastpass_f.lpsubmitorig2 = lastpass_f.submit; if (typeof(lastpass_f.lpsubmitorig2)=='object'){ continue;}lastpass_f.submit = function(){ var form=this; var customEvent = document.createEvent("Event"); customEvent.initEvent("lpCustomEvent", true, true); var d = document.getElementById("hiddenlpsubmitdiv"); if (d) {for(var i = 0; i < document.forms.length; i++){ if(document.forms[i]==form){ if (typeof(d.innerText) != 'undefined') { d.innerText=i.toString(); } else { d.textContent=i.toString(); } } } d.dispatchEvent(customEvent); }form.lpsubmitorig2(); } } }})()}catch(e){}</script></body></html>

    Friday, October 28, 2016 8:54 PM

Answers

All replies

  • You can only get dynamic data from a website using  browser.

    \_(ツ)_/

    Friday, October 28, 2016 9:07 PM
    Moderator
  • You can only get dynamic data from a website using  browser.

    \_(ツ)_/


    For clarification, a web browser executes javascript, applies CSS, performs AJAX calls, etc., and renders the page.  You could do all this yourself, but you'd basically be writing a browser.

    -Tony

    Saturday, October 29, 2016 5:01 AM