Files
ghostwire/whatsapp_suite/cli.py
T

53 lines
3.0 KiB
Python
Raw Normal View History

"""Single entry point for regression tests and explicit app probes."""
import argparse
import importlib
import sys
COMMANDS = {
'inventory': ('exports', 'List local Desktop storage files'),
'stats': ('exports', 'Summarize a saved JSON/JSONL export'),
'search': ('exports', 'Search a saved export'),
'desktop-search': ('exports', 'Search the running Desktop app'),
'live': ('live', 'Run fixed Desktop math/capability/data probes'),
'webview-test': ('webview', 'Run an isolated WebView2 host test'),
'analyze': ('analyzer', 'Inspect storage and optionally an existing CDP session'),
'history-export': ('history', 'Export history through an existing Desktop CDP endpoint'),
'export-zip': ('zip_export', 'Export all local messages via JavaScript in WebView; no CDP or UI automation'),
'send-self': ('self_message', 'Send one test text to your own WhatsApp account via JavaScript'),
'webhook': ('webhook', 'Install/manage an autonomous message listener and local webhook receiver'),
'contacts-export': ('contacts_export', 'Export all locally stored contacts via JavaScript without CDP'),
'ram-read': ('ram', 'Recover loaded message objects from process RAM'),
'ram-search': ('ram_search', 'Search verified loaded message objects'),
'native-search': ('injected_search', 'Experimental native SQLite search/index export'),
'qr-memory': ('qr_memory', 'Find Desktop pairing QR candidates in RAM'),
'qr-window': ('qr_window', 'Capture an already displayed Desktop pairing QR'),
'pairing': ('pairing', 'Request a linking QR in an isolated browser'),
}
def main(argv=None):
argv = list(sys.argv[1:] if argv is None else argv)
if not argv:
argv = ['test']
parser = argparse.ArgumentParser(description='WhatsApp tools and test suite. Default: offline regression tests.')
commands = parser.add_subparsers(dest='command', required=True)
commands.add_parser('test', help='Run offline regression tests; optionally add live checks', add_help=False)
for name, (_, description) in COMMANDS.items():
commands.add_parser(name, help=description, add_help=False)
args, remaining = parser.parse_known_args(argv)
try:
if args.command == 'test':
from .runner import main as run_tests
return run_tests(remaining)
module = importlib.import_module('.' + COMMANDS[args.command][0], __package__)
if args.command in ('inventory', 'stats', 'search', 'desktop-search'):
command = 'whatsapp-search' if args.command == 'desktop-search' else args.command
return module.main([command] + remaining)
if args.command == 'webview-test':
help_parser = argparse.ArgumentParser(description=COMMANDS[args.command][1])
help_parser.parse_args(remaining)
return module.run_webview_test()
return module.main(remaining)
except (OSError, ValueError, RuntimeError, ImportError) as error:
print(f'{args.command}: {error}', file=sys.stderr)
return 1