Skip to content

Commit

Permalink
v2.4
Browse files Browse the repository at this point in the history
  • Loading branch information
maaaaz committed May 30, 2019
1 parent a81a303 commit 2fe9986
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 26 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ Requirements

Changelog
---------
* version 2.4 - 05/30/2019: few fixes for Windows support
* version 2.3 - 05/19/2019: Python 3 compatibility, Firefox renderer added, no-xserver option added
* version 2.2 - 08/13/2018: Chrome and Chromium renderers support and single URL support
* version 2.1 - 01/14/2018: Multiprotocol option addition and PyPI packaging
Expand Down
61 changes: 35 additions & 26 deletions webscreenshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
izip = zip

# Script version
VERSION = '2.3'
VERSION = '2.4'


# Options definition
Expand Down Expand Up @@ -152,7 +152,7 @@ def shell_exec(url, command, options):
start = datetime.datetime.now()

try :
p = subprocess.Popen(shlex.split(command), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p = subprocess.Popen(shlex.split(command, posix="win" not in sys.platform), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# binaries timeout
while p.poll() is None:
Expand Down Expand Up @@ -186,12 +186,13 @@ def shell_exec(url, command, options):
logger_url.info("Screenshot OK\n")
return SHELL_EXECUTION_OK

except Exception as e:
print(e)
except OSError as e:
if e.errno and e.errno == errno.ENOENT :
logger_url.error('renderer binary could not have been found in your current PATH environment variable, exiting')
else:
logger_gen.error('Unknown error: %s, exiting' % e )

except Exception as err:
logger_gen.error('Unknown error: %s, exiting' % err)

return SHELL_EXECUTION_ERROR

def filter_bad_filename_chars(filename):
Expand Down Expand Up @@ -320,7 +321,7 @@ def craft_bin_path(options):
final_bin.append(XVFB_BIN)

if options.renderer_binary != None:
final_bin.append(options.renderer_binary)
final_bin.append(os.path.join(options.renderer_binary))

else:
if options.renderer == 'phantomjs':
Expand All @@ -337,38 +338,44 @@ def craft_bin_path(options):

return " ".join(final_bin)

def craft_arg(param):
if "win" in sys.platform.lower():
return '%s' % param
else:
return '"%s"' % param

def craft_cmd(url_and_options):
"""
Craft the correct command with url and options
"""
global logger_output, WEBSCREENSHOT_JS, SCREENSHOTS_DIRECTORY, SHELL_EXECUTION_OK, SHELL_EXECUTION_ERROR
global logger_output, WEBSCREENSHOT_JS, SHELL_EXECUTION_OK, SHELL_EXECUTION_ERROR

url, options = url_and_options

logger_url = logging.getLogger("%s" % url)
logger_url.addHandler(logger_output)
logger_url.setLevel(options.log_level)

output_filename = os.path.join(SCREENSHOTS_DIRECTORY, ('%s.png' % filter_bad_filename_chars(url)))
output_filename = os.path.join(options.output_directory, ('%s.png' % filter_bad_filename_chars(url)))

# PhantomJS renderer
if options.renderer == 'phantomjs':
# If you ever want to add some voodoo options to the phantomjs command to be executed, that's here right below
cmd_parameters = [ craft_bin_path(options),
'--ignore-ssl-errors true',
'--ssl-protocol any',
'--ssl-ciphers ALL' ]
'--ignore-ssl-errors=true',
'--ssl-protocol=any',
'--ssl-ciphers=ALL' ]

cmd_parameters.append("--proxy %s" % options.proxy) if options.proxy != None else None
cmd_parameters.append("--proxy-auth %s" % options.proxy_auth) if options.proxy_auth != None else None
cmd_parameters.append("--proxy-type %s" % options.proxy_type) if options.proxy_type != None else None

cmd_parameters.append('"%s" url_capture="%s" output_file="%s"' % (WEBSCREENSHOT_JS, url, output_filename))
cmd_parameters.append('%s url_capture=%s output_file=%s' % (craft_arg(WEBSCREENSHOT_JS), url, craft_arg(output_filename)))

cmd_parameters.append('header="Cookie: %s"' % options.cookie.rstrip(';')) if options.cookie != None else None

cmd_parameters.append('http_username="%s"' % options.http_username) if options.http_username != None else None
cmd_parameters.append('http_password="%s"' % options.http_password) if options.http_password != None else None
cmd_parameters.append('http_username=%s' % options.http_username) if options.http_username != None else None
cmd_parameters.append('http_password=%s' % options.http_password) if options.http_password != None else None

cmd_parameters.append('width=%d' % int(options.window_size.split(',')[0]))
cmd_parameters.append('height=%d' % int(options.window_size.split(',')[1]))
Expand All @@ -389,18 +396,18 @@ def craft_cmd(url_and_options):
'--disable-gpu',
'--hide-scrollbars',
'--incognito',
'-screenshot="%s"' % output_filename,
'--window-size="%s"' % options.window_size,
'"%s"' % url ]
cmd_parameters.append('--proxy-server="%s"' % options.proxy) if options.proxy != None else None
'-screenshot=%s' % craft_arg(output_filename),
'--window-size=%s' % options.window_size,
'%s' % craft_arg(url) ]
cmd_parameters.append('--proxy-server=%s' % options.proxy) if options.proxy != None else None

# Firefox renderer
elif options.renderer == 'firefox':
cmd_parameters = [ craft_bin_path(options),
'--new-instance',
'--screenshot="%s"' % output_filename,
'--window-size="%s"' % options.window_size,
'"%s"' % url ]
'--screenshot=%s' % craft_arg(output_filename),
'--window-size=%s' % options.window_size,
'%s' % craft_arg(url) ]

cmd = " ".join(cmd_parameters)

Expand Down Expand Up @@ -462,12 +469,14 @@ def main():
parser.error('Please specify either an input file or an URL')

if options.output_directory != None:
SCREENSHOTS_DIRECTORY = os.path.abspath(os.path.join(os_getcwd(), options.output_directory))
options.output_directory = os.path.join(os_getcwd(), options.output_directory)
else:
options.output_directory = SCREENSHOTS_DIRECTORY

logger_gen.debug("Options: %s\n" % options)
if not os.path.exists(SCREENSHOTS_DIRECTORY):
logger_gen.info("'%s' does not exist, will then be created" % SCREENSHOTS_DIRECTORY)
os.makedirs(SCREENSHOTS_DIRECTORY)
if not os.path.exists(options.output_directory):
logger_gen.info("'%s' does not exist, will then be created" % options.output_directory)
os.makedirs(options.output_directory)

url_list = parse_targets(options)

Expand Down

0 comments on commit 2fe9986

Please # to comment.