![]() | ![]() | ![]() |
/** * * 1.0 * * : * phantomjs --web-security=no getMtsBalance.js "< >" " (XXX) XXX-XX-XX" "<>" * : * phantomjs --web-security=no getMtsBalance.js "/tmp/getMtsBalance" "(916) 123-45-67" "P@ssw0rd" * * (c) Jet/ 2016 */ // PhantomJs stuff var fs = require('fs'); var system = require('system'); var webpage = require('webpage'); var args = system.args; var TRAFFIC_REGEX = /.{1,100}?([0-9.]+).{0,50}?(|).{0,50}? (\d+) /i; var DATE_REGEX = / - ([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{2}) ([0-2][0-9]):([0-5][0-9])/; var SCRIPT_TIMEOUT = 40000; var config = { lkUrl : 'https://lk.ssl.mts.ru/', lkLogin: null, lkPass : null, outDir : null, debugDir: null, formattedStartTime: null }; var timer = { lastActionStartTime: null, lastActionTimeMs : null, currentTimeMillis: function() { return Date.now(); }, startAction: function() { this.lastActionStartTime = this.currentTimeMillis(); this.lastActionTimeMs = null; }, stopAction: function() { lastActionTimeMs = this.currentTimeMillis() - this.lastActionStartTime; }, getLastActionTimeMs: function() { return lastActionTimeMs; }, getLastActionTimeSec: function() { return lastActionTimeMs === null ? null : lastActionTimeMs/1000; } } var metrics = { trafLeftMb: null, daysLeft : null, balance : null, pages: { login: { availability : null, responseTimeSec: null }, lk: { availability : null, responseTimeSec: null } } }; ////////// HELPER FUNCTIONS ////////// var func = { log: function(s) { console.log(this.formatDateTimeForLog(new Date()) + " " + s); }, roundToTwo: function(num) { return +(Math.round(num + "e+2") + "e-2"); }, zero: function(i) { return i < 10 ? '0' + i : i; }, formatDateTimeForLog: function(date) { var dd = date.getDate(); var mm = date.getMonth() + 1; var yy = date.getFullYear(); var hh = date.getHours(); var min = date.getMinutes(); var ss = date.getSeconds(); var ms = date.getMilliseconds(); ms = ('00' + ms).slice(-3); return yy + '-' + this.zero(mm) + '-' + this.zero(dd) + ' ' + this.zero(hh) + ':' + this.zero(min) + ':' + this.zero(ss) + '.' + ms; }, formatDateTimeForFileName: function(date) { return date.getFullYear() + this.zero(date.getMonth() + 1) + this.zero(date.getDate()) + '-' + this.zero(date.getHours()) + this.zero(date.getMinutes()) ; }, writeMetricToFileAndLog: function(filePrefix, metricName, metricValue) { if ( metricValue == null ) { metricValue = 0; } fs.write(config.outDir + filePrefix + config.formattedStartTime + '.log', this.roundToTwo(metricValue), 'w'); this.log(' ' + metricName + ' = ' + metricValue); } } // config.outDir = args[1] + '/'; config.lkLogin = args[2]; config.lkPass = args[3]; config.debugDir = config.outDir + 'debug/'; fs.makeDirectory(config.debugDir); func.log(" : " + config.outDir); // - setTimeout(function() { func.log(" " + SCRIPT_TIMEOUT + " "); if ( metrics.pages.login.availability == null ) { metrics.pages.login.availability = 0; metrics.pages.login.responseTimeSec = 0; } if ( metrics.pages.lk.availability == null ) { metrics.pages.lk.availability = 0; metrics.pages.lk.responseTimeSec = 0; } outMetricsAndExit(); }, SCRIPT_TIMEOUT); // "" var page = webpage.create(); page.settings.userAgent = 'Mozilla/4.0'; // config.formattedStartTime = func.formatDateTimeForFileName(new Date()); // func.log(" " + config.lkUrl); timer.startAction(); page.open(config.lkUrl, function (status) { timer.stopAction(); metrics.pages.login.responseTimeSec = timer.getLastActionTimeSec(); if (status !== "success" ) { func.log(" " + config.lkUrl + " "); metrics.pages.login.availability = 0; outMetricsAndExit(); } else { func.log(" " + config.lkUrl + " "); metrics.pages.login.availability = 1; page.render(config.debugDir + 'login.png'); // iframe', var contentN = 0; page.onLoadFinished = function(status) { // , // (iframe'), // , .. , // -. - // "", // . . // timer.stopAction(); contentN++; func.log(' N' + contentN + ':' + status); page.render(config.debugDir + contentN + '.png'); fs.write(config.debugDir + contentN + '.html', page.content, 'w'); if ( status === 'success') { getMtsMetrics(page, contentN); } }; func.log(" , : " + config.lkLogin); timer.startAction(); page.evaluate(function(config) { var form = document.forms[0]; form.phone.value = config.lkLogin; form.password.value = config.lkPass; form.elements[2].click(); }, config); } }); function getMtsMetrics(page, contentN) { if ( page.content.match(' ') ) { func.log(" : . "); metrics.pages.lk.availability = 0; metrics.pages.lk.responseTimeSec = 0; outMetricsAndExit(); } // iFrame' findBalanceInPage(page, contentN); // - findTrafficInfoInPage(page); // , if ( checkGotMetricsAlready() ) { outMetricsAndExit(); } } /** * */ function findBalanceInPage(page, contentN) { // iframe' if ( page.framesCount == 0 ) { return; } func.log(" iframe'"); var balanceResult = page.evaluate(function() { var result = { iframes: [], balance: null }; $("iframe").each(function(i, iframe) { var iframeBody = $(iframe).contents().find('body'); if ( iframeBody.size() > 0 ) { result.iframes.push( iframeBody.html() ); // 1 - DOM if ( result.balance === null ) { iframeBody.find(".b-header_balance").each(function() { var m = $(this).text().match(/([0-9.]+) /i); if ( m ) { result.balance = m[1]; } }); } // 2 - regex if ( result.balance === null ) { var m = iframeBody.text().match(/\s*:\s*-?([0-9.]+)\s*/i); if ( m ) { result.balance = m[1]; } } } }); return result; }); var iframesAnalyzed = balanceResult.iframes.length; func.log(" iframe':" + iframesAnalyzed); if ( iframesAnalyzed > 0 ) { // iFrame' for (var i = 0; i < iframesAnalyzed; i++) { var iframeContent = balanceResult.iframes[i]; func.log(" iframe " + config.debugDir + contentN + '_iframe' + i + '.html'); fs.write(config.debugDir + contentN + '_iframe' + i + '.html', iframeContent, 'w'); } // , if ( balanceResult.balance !== null ) { if ( metrics.pages.lk.availability === null ) { // , metrics.pages.lk.availability = 1; metrics.pages.lk.responseTimeSec = timer.getLastActionTimeSec(); } func.log(" : " + balanceResult.balance); metrics.balance = balanceResult.balance; } } } /** * - */ function findTrafficInfoInPage(page) { var traf = page.content.match(TRAFFIC_REGEX); if ( traf ) { func.log(" - : " + traf); metrics.trafLeftMb = traf[1]; var trafUnits = traf[2]; if ( trafUnits.toLowerCase() == '' ) { metrics.trafLeftMb *= 1024; } metrics.daysLeft = traf[3]; } else if (page.content.match(" ") ) { func.log(" : "); metrics.trafLeftMb = 0; if ( page.injectJs("jquery.min.js") ) { metrics.daysLeft = page.evaluate(function() { var p = $("p:contains('- ')"); var pText = p.find("b").text(); console.log( " : " + pText); return pText.replace(/\D/g, ''); }); } } } /** * , */ function checkGotMetricsAlready() { if ( metrics.pages.login.availability == 0 || metrics.pages.lk.availability == 0 ) { // ( ) // , return true; } if ( metrics.balance != null && metrics.daysLeft != null && metrics.trafLeftMb != null ) { // , return true; } return false; } /** * , * */ function outMetricsAndExit() { func.log(":"); func.writeMetricToFileAndLog('traffic', 'metrics.trafLeftMb', metrics.trafLeftMb); func.writeMetricToFileAndLog('money', 'metrics.balance', metrics.balance); func.writeMetricToFileAndLog('daysLeft', 'metrics.daysLeft', metrics.daysLeft); func.writeMetricToFileAndLog('status-initialpageload', 'metrics.pages.login.availability', metrics.pages.login.availability); func.writeMetricToFileAndLog('time-initialpageload', 'metrics.pages.login.responseTimeSec', metrics.pages.login.responseTimeSec); func.writeMetricToFileAndLog('status-lkpageload', 'metrics.pages.lk.availability', metrics.pages.lk.availability); func.writeMetricToFileAndLog('time-lkpageload', 'metrics.pages.lk.responseTimeSec', metrics.pages.lk.responseTimeSec); phantom.exit(); }
Source: https://habr.com/ru/post/311640/