From d51b137110ebd3e7d5927e4d6015ef3f4149d5a7 Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:28:33 +0300 Subject: [PATCH 01/12] Bumped version --- service/cli_init.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/cli_init.py b/service/cli_init.py index 1a3d7f3..ae6f8e2 100644 --- a/service/cli_init.py +++ b/service/cli_init.py @@ -20,7 +20,7 @@ def welcome_menu(self): fig = Figlet(font=wm_font) print('\n') self.console.print(fig.renderText('DPULSE'), style=preview_style) - print(Fore.MAGENTA + Style.BRIGHT + '[DPULSE-CLI] - [v1.3.1 rolling] - [OSINT-TECHNOLOGIES]\n' + Style.RESET_ALL) + print(Fore.MAGENTA + Style.BRIGHT + '[DPULSE-CLI] - [v1.3.2 rolling] - [OSINT-TECHNOLOGIES]\n' + Style.RESET_ALL) print(Fore.MAGENTA + Style.BRIGHT + '[Visit our pages]\nGitHub repository: https://github.com/OSINT-TECHNOLOGIES\nPyPi page: https://pypi.org/project/dpulse/\nDocumentation: https://dpulse.readthedocs.io' + Style.RESET_ALL) def print_main_menu(self): From 035a35e758261e7809626aa97d30e28e63c0a6ab Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:11:04 +0300 Subject: [PATCH 02/12] Bumped version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4546fba..0385d4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "dpulse" -version = "1.3.1" +version = "1.3.2" description = "Convenient,fast and user-friendly collector of domain information from Open-Sources" authors = ["OSINT-TECHNOLOGIES "] readme = "README.md" From b97b7e7ca917e13443072435017f0d8b1d56de07 Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:12:22 +0300 Subject: [PATCH 03/12] Reworked main menu style, concept --- service/cli_init.py | 209 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 168 insertions(+), 41 deletions(-) diff --git a/service/cli_init.py b/service/cli_init.py index ae6f8e2..d5ded04 100644 --- a/service/cli_init.py +++ b/service/cli_init.py @@ -1,5 +1,12 @@ import sys from config_processing import read_config +from rich.panel import Panel +from rich.table import Table +from rich.layout import Layout +from rich.text import Text +from rich.prompt import Prompt +from rich.progress import Progress, SpinnerColumn, TextColumn +from rich import box try: from colorama import Fore, Back, Style @@ -9,6 +16,7 @@ print(Fore.RED + "Import error appeared. Reason: {}".format(e) + Style.RESET_ALL) sys.exit() + class Menu: def __init__(self): self.console = Console() @@ -18,59 +26,178 @@ def welcome_menu(self): preview_style = (config_values['preview_color']).lower() wm_font = (config_values['wm_font']).lower() fig = Figlet(font=wm_font) - print('\n') - self.console.print(fig.renderText('DPULSE'), style=preview_style) - print(Fore.MAGENTA + Style.BRIGHT + '[DPULSE-CLI] - [v1.3.2 rolling] - [OSINT-TECHNOLOGIES]\n' + Style.RESET_ALL) - print(Fore.MAGENTA + Style.BRIGHT + '[Visit our pages]\nGitHub repository: https://github.com/OSINT-TECHNOLOGIES\nPyPi page: https://pypi.org/project/dpulse/\nDocumentation: https://dpulse.readthedocs.io' + Style.RESET_ALL) + + logo_panel = Panel( + Text(fig.renderText('DPULSE'), style=preview_style), + box=box.DOUBLE, + border_style="magenta" + ) + + info_panel = Panel( + Text.assemble( + ("DPULSE-CLI - v1.3.2 rolling - OSINT-TECHNOLOGIES\n\n", "magenta bold"), + ("Visit our pages:\n", "white"), + ("GitHub: ", "white"), ("https://github.com/OSINT-TECHNOLOGIES\n", "blue underline"), + ("PyPi: ", "white"), ("https://pypi.org/project/dpulse/\n", "blue underline"), + ("Docs: ", "white"), ("https://dpulse.readthedocs.io", "blue underline") + ), + title="Current version info", + border_style="magenta" + ) + + self.console.print(logo_panel) + self.console.print(info_panel) def print_main_menu(self): - print('\n') - print(Fore.MAGENTA + Back.WHITE + '[MAIN MENU]' + Style.RESET_ALL) - print(Fore.CYAN + "1. Target selection & scanning") - print(Fore.CYAN + "2. General settings") - print(Fore.CYAN + "3. Dorking module manager") - print(Fore.CYAN + "4. Report storage DB manager") - print(Fore.CYAN + "5. API modules manager") - print(Fore.CYAN + "6. Help (browser will be opened!)") - print(Fore.LIGHTRED_EX + "7. Exit DPULSE" + Style.RESET_ALL + '\n') + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta", + show_edge=False + ) + + table.add_column("Option", style="cyan", justify="right") + table.add_column("Description", style="white") + table.add_row("1.", "Target selection & scanning") + table.add_row("2.", "General settings") + table.add_row("3.", "Dorking module manager") + table.add_row("4.", "Report storage DB manager") + table.add_row("5.", "API modules manager") + table.add_row("6.", "Help (browser will be opened!)") + table.add_row("7.", "[red]Exit DPULSE[/red]") + + menu_panel = Panel( + table, + title="[white on magenta]MAIN MENU[/white on magenta]", + border_style="magenta" + ) + + self.console.print("\n") + self.console.print(menu_panel) def print_settings_menu(self): - print('\n') - print(Fore.MAGENTA + Back.WHITE + '[SETTINGS MENU]' + Style.RESET_ALL) - print(Fore.CYAN + "1. Print current config file") - print(Fore.CYAN + "2. Edit config file") - print(Fore.CYAN + "3. Clear journal content") - print(Fore.LIGHTRED_EX + "4. Return to main menu" + Style.RESET_ALL + '\n') + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta", + show_edge=False + ) + + table.add_column("Option", style="cyan", justify="right") + table.add_column("Description", style="white") + + table.add_row("1.", "Print current config file") + table.add_row("2.", "Edit config file") + table.add_row("3.", "Clear journal content") + table.add_row("4.", "[red]Return to main menu[/red]") + + menu_panel = Panel( + table, + title="[white on magenta]SETTINGS MENU[/white on magenta]", + border_style="magenta" + ) + + self.console.print("\n") + self.console.print(menu_panel) def print_db_menu(self): - print('\n') - print(Fore.MAGENTA + Back.WHITE + '[REPORTS DATABASE MANAGER]' + Style.RESET_ALL) - print(Fore.CYAN + "1. Show database content") - print(Fore.CYAN + "2. Recreate report from database") - print(Fore.LIGHTRED_EX + "3. Return to main menu" + Style.RESET_ALL) + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta", + show_edge=False + ) + + table.add_column("Option", style="cyan", justify="right") + table.add_column("Description", style="white") + + table.add_row("1.", "Show database content") + table.add_row("2.", "Recreate report from database") + table.add_row("3.", "[red]Return to main menu[/red]") + + menu_panel = Panel( + table, + title="[white on magenta]REPORTS DATABASE MANAGER[/white on magenta]", + border_style="magenta" + ) + + self.console.print("\n") + self.console.print(menu_panel) def dorking_db_manager(self): - print('\n') - print(Fore.MAGENTA + Back.WHITE + '[DORKING DB MANAGER]' + Style.RESET_ALL) - print(Fore.CYAN + "1. Generate custom Dorking DB") - print(Fore.LIGHTRED_EX + "2. Return to main menu\n" + Style.RESET_ALL) + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta", + show_edge=False + ) + + table.add_column("Option", style="cyan", justify="right") + table.add_column("Description", style="white") + + table.add_row("1.", "Generate custom Dorking DB") + table.add_row("2.", "[red]Return to main menu[/red]") + + menu_panel = Panel( + table, + title="[white on magenta]DORKING DB MANAGER[/white on magenta]", + border_style="magenta" + ) + + self.console.print("\n") + self.console.print(menu_panel) def api_manager(self): - print('\n') - print(Fore.MAGENTA + Back.WHITE + '[API KEYS DB MANAGER]' + Style.RESET_ALL) - print(Fore.CYAN + "1. Add API key") - print(Fore.CYAN + "2. Restore reference API Keys DB") - print(Fore.LIGHTRED_EX + "3. Return to main menu" + Style.RESET_ALL) + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta", + show_edge=False + ) + + table.add_column("Option", style="cyan", justify="right") + table.add_column("Description", style="white") + + table.add_row("1.", "Add API key") + table.add_row("2.", "Restore reference API Keys DB") + table.add_row("3.", "[red]Return to main menu[/red]") + + menu_panel = Panel( + table, + title="[white on magenta]API KEYS DB MANAGER[/white on magenta]", + border_style="magenta" + ) + + self.console.print("\n") + self.console.print(menu_panel) + def print_prescan_summary(short_domain, report_filetype, pagesearch_ui_mark, dorking_ui_mark, used_api_ui, case_comment, snapshotting_ui_mark): - print(Fore.LIGHTMAGENTA_EX + "\n[PRE-SCAN SUMMARY]\n" + Style.RESET_ALL) - print(Fore.GREEN + "Determined target: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + short_domain + Style.RESET_ALL) - print(Fore.GREEN + "Report type: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + report_filetype.lower() + Style.RESET_ALL) - print(Fore.GREEN + "PageSearch conduction: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + pagesearch_ui_mark + Style.RESET_ALL) - print(Fore.GREEN + "Dorking conduction: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + dorking_ui_mark + Style.RESET_ALL) - print(Fore.GREEN + "APIs scan: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + used_api_ui + Style.RESET_ALL) - print(Fore.GREEN + "Snapshotting conduction: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + snapshotting_ui_mark + Style.RESET_ALL) - print(Fore.GREEN + "Case comment: " + Fore.LIGHTCYAN_EX + Style.BRIGHT + case_comment + Style.RESET_ALL + "\n") + table = Table( + show_header=False, + box=box.ROUNDED, + border_style="magenta" + ) + + table.add_column("Parameter", style="green") + table.add_column("Value", style="cyan bold") + + table.add_row("Determined target:", short_domain) + table.add_row("Report type:", report_filetype.lower()) + table.add_row("PageSearch conduction:", pagesearch_ui_mark) + table.add_row("Dorking conduction:", dorking_ui_mark) + table.add_row("APIs scan:", used_api_ui) + table.add_row("Snapshotting conduction:", snapshotting_ui_mark) + table.add_row("Case comment:", case_comment) + + summary_panel = Panel( + table, + title="[magenta]PRE-SCAN SUMMARY[/magenta]", + border_style="magenta" + ) + + Console().print("\n") + Console().print(summary_panel) def print_api_db_msg(): print(Fore.GREEN + "\nYou've entered custom Dorking DB generator!\n" + Style.RESET_ALL) From ac32f6c4b891bb4e43621fc63707ccba1f66e51c Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:12:59 +0300 Subject: [PATCH 04/12] Reworked progress bar style --- dpulse.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/dpulse.py b/dpulse.py index a6302a1..7cc6ae0 100644 --- a/dpulse.py +++ b/dpulse.py @@ -1,6 +1,7 @@ import sys import os from colorama import Fore, Style, Back +from rich.progress import Progress, SpinnerColumn, TextColumn sys.path.append('datagather_modules') sys.path.append('service') @@ -75,24 +76,29 @@ def process_report(report_filetype, short_domain, url, case_comment, keywords_li spinner_thread.do_run = False spinner_thread.join() -class ProgressBar(threading.Thread): + +class RichProgressBar(threading.Thread): def __init__(self): - super(ProgressBar, self).__init__() + super(RichProgressBar, self).__init__() self.do_run = True def run(self): - for char in itertools.cycle('|/-\\'): - if not self.do_run: - break - print(Fore.LIGHTMAGENTA_EX + Back.WHITE + char + Style.RESET_ALL, end='\r') - sleep(0.1) + with Progress( + SpinnerColumn(), + TextColumn("[magenta]Processing scan...[/magenta]"), + transient=True, + ) as progress: + task = progress.add_task("", total=None) + while self.do_run: + progress.update(task) + sleep(0.1) def run(): while True: try: cli.print_main_menu() domain_patter = r'^(?!\-)(?:[a-zA-Z0-9\-]{1,63}\.)+[a-zA-Z]{2,}$' - choice = input(Fore.YELLOW + "Enter your choice >> ") + choice = input(Fore.YELLOW + "\nEnter your choice >> ") if choice == "1": from misc import domain_precheck print(Fore.GREEN + "\nImported and activated reporting modules" + Style.RESET_ALL) @@ -209,7 +215,7 @@ def run(): snapshotting_ui_mark = "Yes, domain's main page snapshotting using Wayback Machine" cli_init.print_prescan_summary(short_domain, report_filetype.upper(), pagesearch_ui_mark, dorking_ui_mark, used_api_ui, case_comment, snapshotting_ui_mark) print(Fore.LIGHTMAGENTA_EX + "[BASIC SCAN START]\n" + Style.RESET_ALL) - spinner_thread = ProgressBar() + spinner_thread = RichProgressBar() spinner_thread.start() if report_filetype.lower() in ['html', 'xlsx']: process_report(report_filetype, short_domain, url, case_comment, From ac320f7cd5655712cff627dbc4b6fcc348f22d6a Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:42:35 +0300 Subject: [PATCH 05/12] Updated visuals --- service/cli_init.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/cli_init.py b/service/cli_init.py index d5ded04..9dbf8e9 100644 --- a/service/cli_init.py +++ b/service/cli_init.py @@ -29,7 +29,7 @@ def welcome_menu(self): logo_panel = Panel( Text(fig.renderText('DPULSE'), style=preview_style), - box=box.DOUBLE, + box=box.MINIMAL, border_style="magenta" ) From a2844b526df1694143f9f2ab9250adbb904c058b Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:42:52 +0300 Subject: [PATCH 06/12] Updated visuals --- dpulse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dpulse.py b/dpulse.py index 7cc6ae0..1898b27 100644 --- a/dpulse.py +++ b/dpulse.py @@ -214,7 +214,7 @@ def run(): end_date = str(input('Enter end date (YYYYMMDD format): ')) snapshotting_ui_mark = "Yes, domain's main page snapshotting using Wayback Machine" cli_init.print_prescan_summary(short_domain, report_filetype.upper(), pagesearch_ui_mark, dorking_ui_mark, used_api_ui, case_comment, snapshotting_ui_mark) - print(Fore.LIGHTMAGENTA_EX + "[BASIC SCAN START]\n" + Style.RESET_ALL) + #print(Fore.LIGHTMAGENTA_EX + "[BASIC SCAN START]\n" + Style.RESET_ALL) spinner_thread = RichProgressBar() spinner_thread.start() if report_filetype.lower() in ['html', 'xlsx']: From 9b26917a23c7e3f92bc33b42fa28fda871fa7aa8 Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:43:10 +0300 Subject: [PATCH 07/12] Updated visuals --- datagather_modules/data_assembler.py | 37 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/datagather_modules/data_assembler.py b/datagather_modules/data_assembler.py index 74313ca..3464922 100644 --- a/datagather_modules/data_assembler.py +++ b/datagather_modules/data_assembler.py @@ -66,7 +66,7 @@ def report_preprocessing(self, short_domain, report_file_type): def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, keywords, keywords_flag, dorking_flag, used_api_flag, snapshotting_flag, username, from_date, end_date): casename, db_casename, db_creation_date, robots_filepath, sitemap_filepath, sitemap_links_filepath, report_file_type, report_folder, ctime, report_ctime = self.report_preprocessing(short_domain, report_file_type) logging.info(f'### THIS LOG PART FOR {casename} CASE, TIME: {ctime} STARTS HERE') - print(Fore.GREEN + "Started scanning domain" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "\n[STARTED BASIC DOMAIN SCAN]" + Style.RESET_ALL) print(Fore.GREEN + "[1/11] Getting domain IP address" + Style.RESET_ALL) ip = cp.ip_gather(short_domain) print(Fore.GREEN + '[2/11] Gathering WHOIS information' + Style.RESET_ALL) @@ -111,16 +111,15 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k total_ports = len(ports) total_ips = len(subdomain_ip) + 1 total_vulns = len(vulns) - - print(Fore.LIGHTMAGENTA_EX + "\n[BASIC SCAN END]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "[ENDED BASIC DOMAIN SCAN]\n" + Style.RESET_ALL) if report_file_type == 'xlsx': if pagesearch_flag.lower() == 'y': if subdomains[0] != 'No subdomains were found': to_search_array = [subdomains, social_medias, sd_socials] - print(Fore.LIGHTMAGENTA_EX + "\n[EXTENDED SCAN START: PAGESEARCH]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "[STARTED EXTENDED DOMAIN SCAN WITH PAGESEARCH]\n" + Style.RESET_ALL) ps_emails_return, accessible_subdomains, emails_amount, files_counter, cookies_counter, api_keys_counter, website_elements_counter, exposed_passwords_counter, keywords_messages_list = subdomains_parser(to_search_array[0], report_folder, keywords, keywords_flag) total_links_counter = accessed_links_counter = "No results because PageSearch does not gather these categories" - print(Fore.LIGHTMAGENTA_EX + "\n[EXTENDED SCAN END: PAGESEARCH]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "[ENDED EXTENDED DOMAIN SCAN WITH PAGESEARCH]\n" + Style.RESET_ALL) else: print(Fore.RED + "Cant start PageSearch because no subdomains were detected") accessible_subdomains = files_counter = cookies_counter = api_keys_counter = website_elements_counter = exposed_passwords_counter = total_links_counter = accessed_links_counter = emails_amount = 'No results because no subdomains were found' @@ -136,13 +135,13 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k dorking_results = ['Google Dorking mode was not selected for this scan'] else: dorking_db_path, table = establishing_dork_db_connection(dorking_flag.lower()) - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: {dorking_flag.upper()} DORKING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED EXTENDED DOMAIN SCAN WITH {dorking_flag.upper()} DORKING TABLE]\n" + Style.RESET_ALL) dorking_status, dorking_results = dp.transfer_results_to_xlsx(table, get_dorking_query(short_domain, dorking_db_path, table)) - print(Fore.LIGHTMAGENTA_EX + f"[EXTENDED SCAN END: {dorking_flag.upper()} DORKING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED EXTENDED DOMAIN SCAN WITH {dorking_flag.upper()} DORKING TABLE]\n" + Style.RESET_ALL) api_scan_db = [] if used_api_flag != ['Empty']: - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: API SCANNING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED EXTENDED DOMAIN SCAN WITH 3RD PARTY API]\n" + Style.RESET_ALL) if '1' in used_api_flag: virustotal_output = api_virustotal_check(short_domain) api_scan_db.append('VirusTotal') @@ -163,7 +162,7 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k securitytrails_output = 'No results because user did not selected SecurityTrails API scan' if '3' not in used_api_flag: hudsonrock_output = 'No results because user did not selected HudsonRock API scan' - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN END: API SCANNING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED EXTENDED DOMAIN SCAN WITH 3RD PARTY API]\n" + Style.RESET_ALL) else: virustotal_output = 'No results because user did not selected VirusTotal API scan' securitytrails_output = 'No results because user did not selected SecurityTrails API scan' @@ -173,14 +172,14 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k if snapshotting_flag.lower() in ['s', 'p', 'w']: config_values = read_config() installed_browser = config_values['installed_browser'] - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: PAGE SNAPSHOTTING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED DOMAIN SNAPSHOTTING]\n" + Style.RESET_ALL) if snapshotting_flag.lower() == 's': take_screenshot(installed_browser, url, report_folder + '//screensnapshot.png') elif snapshotting_flag.lower() == 'p': save_page_as_html(url, report_folder + '//domain_html_copy.html') elif snapshotting_flag.lower() == 'w': download_snapshot(short_domain, from_date, end_date, report_folder) - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN END: PAGE SNAPSHOTTING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED DOMAIN SNAPSHOTTING]\n" + Style.RESET_ALL) else: pass @@ -199,7 +198,7 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k if pagesearch_flag.lower() == 'y': if subdomains[0] != 'No subdomains were found': to_search_array = [subdomains, social_medias, sd_socials] - print(Fore.LIGHTMAGENTA_EX + "\n[EXTENDED SCAN START: PAGESEARCH]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "[STARTED EXTENDED DOMAIN SCAN WITH PAGESEARCH]" + Style.RESET_ALL) ( ps_emails_return, accessible_subdomains, @@ -214,7 +213,7 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k total_links_counter = accessed_links_counter = "No results because PageSearch does not gather these categories" if len(keywords_messages_list) == 0: keywords_messages_list = ['No keywords were found'] - print(Fore.LIGHTMAGENTA_EX + "\n[EXTENDED SCAN END: PAGESEARCH]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + "[ENDED EXTENDED DOMAIN SCAN WITH PAGESEARCH]\n" + Style.RESET_ALL) else: print(Fore.RED + "Cant start PageSearch because no subdomains were detected") ps_emails_return = "" @@ -233,13 +232,13 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k dorking_file_path = 'Google Dorking mode was not selected for this scan' else: dorking_db_path, table = establishing_dork_db_connection(dorking_flag.lower()) - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: {dorking_flag.upper()} DORKING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED EXTENDED DOMAIN SCAN WITH {dorking_flag.upper()} DORKING TABLE]" + Style.RESET_ALL) dorking_status, dorking_file_path = dp.save_results_to_txt(report_folder, table, get_dorking_query(short_domain, dorking_db_path, table)) - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN END: {dorking_flag.upper()} DORKING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED EXTENDED DOMAIN SCAN WITH {dorking_flag.upper()} DORKING TABLE]\n" + Style.RESET_ALL) api_scan_db = [] if used_api_flag != ['Empty']: - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: API SCANNING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED EXTENDED DOMAIN SCAN WITH 3RD PARTY API]" + Style.RESET_ALL) if '1' in used_api_flag: virustotal_output = api_virustotal_check(short_domain) api_scan_db.append('VirusTotal') @@ -260,7 +259,7 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k securitytrails_output = 'No results because user did not selected SecurityTrails API scan' if '3' not in used_api_flag: hudsonrock_output = 'No results because user did not selected HudsonRock API scan' - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN END: API SCANNING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED EXTENDED DOMAIN SCAN WITH 3RD PARTY API]\n" + Style.RESET_ALL) else: virustotal_output = 'No results because user did not selected VirusTotal API scan' securitytrails_output = 'No results because user did not selected SecurityTrails API scan' @@ -270,14 +269,14 @@ def data_gathering(self, short_domain, url, report_file_type, pagesearch_flag, k if snapshotting_flag.lower() in ['s', 'p', 'w']: config_values = read_config() installed_browser = config_values['installed_browser'] - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN START: PAGE SNAPSHOTTING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[STARTED DOMAIN SNAPSHOTTING]" + Style.RESET_ALL) if snapshotting_flag.lower() == 's': take_screenshot(installed_browser, url, report_folder + '//screensnapshot.png') elif snapshotting_flag.lower() == 'p': save_page_as_html(url, report_folder + '//domain_html_copy.html') elif snapshotting_flag.lower() == 'w': download_snapshot(short_domain, from_date, end_date, report_folder) - print(Fore.LIGHTMAGENTA_EX + f"\n[EXTENDED SCAN END: PAGE SNAPSHOTTING]\n" + Style.RESET_ALL) + print(Fore.LIGHTMAGENTA_EX + f"[ENDED DOMAIN SNAPSHOTTING]\n" + Style.RESET_ALL) else: pass From bead38b0cc5fa3aefff1752ff442133b83a5ca7a Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:43:28 +0300 Subject: [PATCH 08/12] Updated visuals --- pagesearch/pagesearch_parsers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pagesearch/pagesearch_parsers.py b/pagesearch/pagesearch_parsers.py index c6933e8..de20e7d 100644 --- a/pagesearch/pagesearch_parsers.py +++ b/pagesearch/pagesearch_parsers.py @@ -65,7 +65,7 @@ def clean_bad_pdfs(ps_docs_path): def subdomains_parser(subdomains_list, report_folder, keywords, keywords_flag): report_lines: List[str] = [] p = make_recorder(report_lines) - print(Fore.GREEN + "Conducting PageSearch. Please, be patient, it may take a long time\n" + Style.RESET_ALL) + #print(Fore.GREEN + "Conducting PageSearch. Please, be patient, it may take a long time\n" + Style.RESET_ALL) ps_docs_path = os.path.join(report_folder, 'ps_documents') if not os.path.exists(ps_docs_path): os.makedirs(ps_docs_path) @@ -195,6 +195,7 @@ def subdomains_parser(subdomains_list, report_folder, keywords, keywords_flag): keywords_messages_list = ['No keywords were found because of None user input'] else: print(Fore.GREEN + f"[+] Total {pdf_with_keywords} keywords were found in PDF files" + Style.RESET_ALL) + p(Fore.LIGHTGREEN_EX + "-------------------------------------------------" + Style.RESET_ALL) data_tuple = ( ps_emails_return, From 28ed2fa14e1b1cdbb406dc729f4606b167d8b8d8 Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:43:52 +0300 Subject: [PATCH 09/12] Updated visuals --- reporting_modules/html_report_creation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/reporting_modules/html_report_creation.py b/reporting_modules/html_report_creation.py index 1dce4ff..f6bffab 100644 --- a/reporting_modules/html_report_creation.py +++ b/reporting_modules/html_report_creation.py @@ -88,7 +88,6 @@ def report_assembling(short_domain, url, case_comment, data_array, report_info_a virustotal_output = virustotal_html_prep(virustotal_output) securitytrails_output = securitytrails_html_prep(securitytrails_output) - if len(ps_emails_return) > 0: subdomain_mails += ps_emails_return subdomain_mails = list(set(subdomain_mails)) From e362ba74a2ee49164bc7a376013ee8f33368187d Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:49:10 +0300 Subject: [PATCH 10/12] Updated wrong spaces between menus and prompts --- dpulse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dpulse.py b/dpulse.py index 1898b27..831a576 100644 --- a/dpulse.py +++ b/dpulse.py @@ -227,7 +227,7 @@ def run(): elif choice == "2": import configparser cli.print_settings_menu() - choice_settings = input(Fore.YELLOW + "Enter your choice >> ") + choice_settings = input(Fore.YELLOW + "\nEnter your choice >> ") if choice_settings == '1': print_and_return_config() elif choice_settings == '2': @@ -255,7 +255,7 @@ def run(): continue elif choice == '3': cli.dorking_db_manager() - choice_dorking = input(Fore.YELLOW + "Enter your choice >> ") + choice_dorking = input(Fore.YELLOW + "\nEnter your choice >> ") if choice_dorking == '1': from db_creator import manage_dorks cli_init.print_api_db_msg() From 644c6401e72b2483fabf9f5727a000afa0f3082b Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 00:55:34 +0300 Subject: [PATCH 11/12] Updated banner visuals --- service/cli_init.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/service/cli_init.py b/service/cli_init.py index 9dbf8e9..4aad666 100644 --- a/service/cli_init.py +++ b/service/cli_init.py @@ -26,15 +26,11 @@ def welcome_menu(self): preview_style = (config_values['preview_color']).lower() wm_font = (config_values['wm_font']).lower() fig = Figlet(font=wm_font) - - logo_panel = Panel( - Text(fig.renderText('DPULSE'), style=preview_style), - box=box.MINIMAL, - border_style="magenta" - ) - - info_panel = Panel( + print('\n') + combined_panel = Panel( Text.assemble( + (fig.renderText('DPULSE'), preview_style), + ("\n", ""), ("DPULSE-CLI - v1.3.2 rolling - OSINT-TECHNOLOGIES\n\n", "magenta bold"), ("Visit our pages:\n", "white"), ("GitHub: ", "white"), ("https://github.com/OSINT-TECHNOLOGIES\n", "blue underline"), @@ -42,11 +38,11 @@ def welcome_menu(self): ("Docs: ", "white"), ("https://dpulse.readthedocs.io", "blue underline") ), title="Current version info", + box=box.ROUNDED, border_style="magenta" ) - self.console.print(logo_panel) - self.console.print(info_panel) + self.console.print(combined_panel) def print_main_menu(self): table = Table( From f0a49160ceb5d6d0b61ec4a315a9ce346142b7d0 Mon Sep 17 00:00:00 2001 From: OSINT-TECHNOLOGIES <77023667+OSINT-TECHNOLOGIES@users.noreply.github.com> Date: Wed, 25 Jun 2025 01:52:09 +0300 Subject: [PATCH 12/12] Improved modern report visuals --- .../modern_report_template.html | 417 ++++++++++++------ 1 file changed, 290 insertions(+), 127 deletions(-) diff --git a/service/pdf_report_templates/modern_report_template.html b/service/pdf_report_templates/modern_report_template.html index c6b73b2..b422bfc 100644 --- a/service/pdf_report_templates/modern_report_template.html +++ b/service/pdf_report_templates/modern_report_template.html @@ -8,6 +8,7 @@ +