Source code for woob.tools.js

# Copyright(C) 2015      Romain Bignon
#
# This file is part of woob.
#
# woob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# woob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with woob. If not, see <http://www.gnu.org/licenses/>.


__all__ = ['Javascript']


from woob.tools.log import getLogger


[docs]class Javascript: HEADER = """ function btoa(str) { var buffer; if (str instanceof Buffer) { buffer = str; } else { buffer = new Buffer(str.toString(), 'binary'); } return buffer.toString('base64'); } function atob(str) { return new Buffer(str, 'base64').toString('binary'); } document = { createAttribute: null, styleSheets: null, characterSet: "UTF-8", documentElement: {} }; history = {}; screen = { width: 1280, height: 800 }; var XMLHttpRequest = function() {}; XMLHttpRequest.prototype.onreadystatechange = function(){}; XMLHttpRequest.prototype.open = function(){}; XMLHttpRequest.prototype.setRequestHeader = function(){}; XMLHttpRequest.prototype.send = function(){}; /* JS code checks that some PhantomJS globals aren't defined on the * global window object; put an empty window object, so that all these * tests fail. * It then tests the user agent against some known scrappers; just put * the default Tor user agent in there. */ window = { document: document, history: history, screen: screen, XMLHttpRequest: XMLHttpRequest, innerWidth: 1280, innerHeight: 800, close: function(){} }; navigator = { userAgent: "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0", appName: "Netscape" }; """ def __init__(self, script, logger=None, domain=""): try: import execjs except ImportError: raise ImportError('Please install PyExecJS') self.runner = execjs.get() self.logger = getLogger('js', logger) window_emulator = self.HEADER if domain: window_emulator += "document.domain = '" + domain + "';" window_emulator += """ if (typeof(location) === "undefined") { var location = window.location = { host: document.domain }; } """ self.ctx = self.runner.compile(window_emulator + script)
[docs] def call(self, *args, **kwargs): retval = self.ctx.call(*args, **kwargs) self.logger.debug('Calling %s%s = %s', args[0], args[1:], retval) return retval