def main(params=None): """Main function to launch searchfy The function is created in this way so as to let other applications make use of the full configuration capabilities of the application. The parameters received are used as parsed by this modules `get_parser()`. Args: params (list): A list with the parameters as grabbed by the terminal. It is None when this is called by an entry_point. If it is called by osrf the data is already parsed. Returns: list. A list of i3visio entities. """ if params is None: parser = get_parser() args = parser.parse_args(params) else: args = params results = [] print(general.title(banner.text)) saying_hello = f""" Searchfy | Copyright (C) Yaiza Rubio & Félix Brezo (i3visio) 2014-2020 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. For additional info, visit <{general.LICENSE_URL}>. """ print(general.info(saying_hello)) if args.license: general.showLicense() else: # Showing the execution time... start_time = dt.datetime.now() print( f"{start_time}\tStarting search in different platform(s)... Relax!\n" ) print(general.emphasis("\tPress <Ctrl + C> to stop...\n")) # Performing the search try: results = perform_search(platformNames=args.platforms, queries=args.queries, exclude_platform_names=args.exclude) except KeyboardInterrupt: print( general.error( "\n[!] Process manually stopped by the user. Workers terminated without providing any result.\n" )) results = [] # Generating summary files for each ... if args.extension: # Verifying if the outputPath exists if not os.path.exists(args.output_folder): os.makedirs(args.output_folder) # Grabbing the results fileHeader = os.path.join(args.output_folder, args.file_header) # Iterating through the given extensions to print its values for ext in args.extension: # Generating output files general.export_usufy(results, ext, fileHeader) # Printing the results if requested now = dt.datetime.now() print(f"\n{now}\tResults obtained:\n") print(general.success(general.osrf_to_text_export(results))) if args.web_browser: general.open_results_in_browser(results) now = dt.datetime.now() print( "\n{date}\tYou can find all the information collected in the following files:" .format(date=str(now))) for ext in args.extension: # Showing the output files print("\t" + general.emphasis(fileHeader + "." + ext)) # Showing the execution time... end_time = dt.datetime.now() print(f"\n{end_time}\tFinishing execution...\n") print("Total time used:\t" + general.emphasis(str(end_time - start_time))) print("Average seconds/query:\t" + general.emphasis( str((end_time - start_time).total_seconds() / len(args.platforms))) + " seconds\n") # Urging users to place an issue on Github... print(banner.footer) if params: return results
def main(params=None): """ain function to launch usufy The function is created in this way so as to let other applications make use of the full configuration capabilities of the application. The parameters received are used as parsed by this modules `get_parser()`. Args: params: A list with the parameters as grabbed by the terminal. It is None when this is called by an entry_point. If it is called by osrf the data is already parsed. Returns: dict: A Json representing the matching results. """ if params is None: parser = get_parser() args = parser.parse_args(params) else: args = params print(general.title(banner.text)) saying_hello = f""" Usufy | Copyright (C) Yaiza Rubio & Félix Brezo (i3visio) 2014-2020 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. For additional info, visit <{general.LICENSE_URL}>. """ print(general.info(saying_hello)) if args.fuzz: res = fuzzUsufy(args.fuzz, args.fuzz_config) else: # Recovering the list of platforms to be launched list_platforms = platform_selection.get_platforms_by_name( platform_names=args.platforms, tags=args.tags, mode="usufy", exclude_platform_names=args.exclude) if args.info: # Information actions... if args.info == 'list_platforms': info_platforms = "Listing the platforms:\n" for p in list_platforms: info_platforms += "\t\t" + (str(p) + ": ").ljust( 16, ' ') + str(p.tags) + "\n" return info_platforms elif args.info == 'list_tags': tags = {} # Going through all the selected platforms to get their tags for p in list_platforms: for t in p.tags: if t not in tags.keys(): tags[t] = 1 else: tags[t] += 1 info_tags = "List of tags:\n" # Displaying the results in a sorted list for t in tags.keys(): info_tags += "\t\t" + (t + ": ").ljust(16, ' ') + str( tags[t]) + " time(s)\n" return info_tags else: pass # performing the test elif args.benchmark: platforms = platform_selection.get_all_platform_names("usufy") res = benchmark.do_benchmark(platforms) str_times = "" for e in sorted(res.keys()): str_times += str(e) + "\t" + str(res[e]) + "\n" return str_times # showing the tags of the usufy platforms elif args.show_tags: tags = platform_selection.get_all_platform_namesByTag("usufy") print( general.info( "This is the list of platforms grouped by tag.\n")) print(json.dumps(tags, indent=2, sort_keys=True)) print( general.info( "[Tip] Remember that you can always launch the platform using the -t option followed by any of the aforementioned.\n" )) return tags # Executing the corresponding process... else: # Showing the execution time... start_time = dt.datetime.now() print( f"{start_time}\tStarting search in {general.emphasis(str(len(list_platforms)))} platform(s)... Relax!\n" ) print(general.emphasis("\tPress <Ctrl + C> to stop...\n")) # Defining the list of users to monitor nicks = [] if args.nicks: for n in args.nicks: nicks.append(n) else: # Reading the nick files try: nicks = args.list.read().splitlines() except: print( general.error( "ERROR: there has been an error when opening the file that stores the nicks.\tPlease, check the existence of this file." )) # Definning the results res = [] if args.output_folder != None: # if Verifying an output folder was selected if not os.path.exists(args.output_folder): os.makedirs(args.output_folder) # Launching the process... res = process_nick_list(nicks, list_platforms, args.output_folder, avoidProcessing=args.avoid_processing, avoidDownload=args.avoid_download, nThreads=args.threads, verbosity=args.verbose, logFolder=args.logfolder) else: try: res = process_nick_list(nicks, list_platforms, nThreads=args.threads, verbosity=args.verbose, logFolder=args.logfolder) except Exception as e: print( general.error( "Exception grabbed when processing the nicks: " + str(e))) print(general.error(traceback.print_stack())) # We are going to iterate over the results... str_results = "\t" # Structure returned """ [ { "attributes": [ { "attributes": [], "type": "com.i3visio.URI", "value": "http://twitter.com/i3visio" }, { "attributes": [], "type": "com.i3visio.Alias", "value": "i3visio" }, { "attributes": [], "type": "com.i3visio.Platform", "value": "Twitter" } ], "type": "com.i3visio.Profile", "value": "Twitter - i3visio" } , ... ] """ for r in res: # The format of the results (attributes) for a given nick is a list as follows: for att in r["attributes"]: # iterating through the attributes platform = "" uri = "" for details in att["attributes"]: if details["type"] == "com.i3visio.Platform": platform = details["value"] if details["type"] == "com.i3visio.URI": uri = details["value"] try: str_results += (str(platform) + ":").ljust( 16, ' ') + " " + str(uri) + "\n\t\t" except: pass # Generating summary files for each ... if args.extension: # Verifying if the outputPath exists if not os.path.exists(args.output_folder): os.makedirs(args.output_folder) # Grabbing the results file_header = os.path.join(args.output_folder, args.file_header) # Iterating through the given extensions to print its values for ext in args.extension: # Generating output files general.export_usufy(res, ext, file_header) now = dt.datetime.now() print( f"\n{now}\tResults obtained ({general.emphasis(len(res))}):\n") print(general.success(general.osrf_to_text_export(res))) if args.web_browser: general.open_results_in_browser(res) now = dt.datetime.now() print("\n" + str(now) + "\tYou can find all the information here:") for ext in args.extension: # Showing the output files print("\t" + general.emphasis(file_header + "." + ext)) # Showing the execution time... end_time = dt.datetime.now() print(f"\n{end_time}\tFinishing execution...\n") print("Total time consumed:\t" + general.emphasis(str(end_time - start_time))) print("Average seconds/query:\t" + general.emphasis( str((end_time - start_time).total_seconds() / len(list_platforms))) + " seconds\n") # Urging users to place an issue on Github... print(banner.footer) if params: return res