#!/usr/bin/env python # -*- coding: utf-8 -*- """ Usage: Normal mode: telegram-messages-dump -c <chat_name> -p <phone_num> [-l <count>] [-o <file>] [-cl] [...] telegram-messages-dump --chat=<chat_name> --phone=<phone_num> [--limit=<count>] [--out <file>] Continuous mode: telegram-messages-dump --continue -p <phone_num> -o <file> [-cl] [...] telegram-messages-dump --continue=<MSG_ID> -p <phone_num> -o <file> -e <exporter> -c <chat_name> Where: -c, --chat Unique name of a channel/chat. E.g. @python. -p, --phone Phone number. E.g. +380503211234. -o, --out Output file name or full path. (Default: telegram_<chatName>.log) -e, --exp Exporter name. text | jsonl | csv (Default: 'text') , --continue Continue previous dump. Supports optional integer param <message_id>. -l, --limit Number of the latest messages to dump, 0 means no limit. (Default: 100) -cl, --clean Clean session sensitive data (e.g. auth token) on exit. (Default: False) -v, --verbose Verbose mode. (Default: False) , --addbom Add BOM to the beginning of the output file. (Default: False) -h, --help Show this help message and exit. """ import os import sys import importlib import logging from telegram_messages_dump.telegram_dumper import TelegramDumper from telegram_messages_dump.chat_dump_settings import ChatDumpSettings from telegram_messages_dump.chat_dump_metadata import DumpMetadata from telegram_messages_dump.chat_dump_metadata import MetadataError from telegram_messages_dump.utils import sprint def main(): """ Entry point. """ settings = ChatDumpSettings(__doc__) # define the console output verbosity default_format = '%(levelname)s:%(message)s' if settings.is_verbose: logging.basicConfig(format=default_format, level=logging.DEBUG) else: logging.basicConfig(format=default_format, level=logging.INFO) metadata = DumpMetadata(settings.out_file) # when user specified --continue try: if settings.is_incremental_mode and settings.last_message_id == -1: metadata.merge_into_settings(settings) except MetadataError as ex: sprint("ERROR: %s" % ex) sys.exit(1) exporter = _load_exporter(settings.exporter) sys.exit(TelegramDumper(os.path.basename(__file__), settings, metadata, exporter).run()) def _load_exporter(exporter_name): """ Loads exporter from file <exporter_name>.py in ./exporters subfolder. :param exporter_name: name of exporter. E.g. 'text' or 'json' :return: Exporter instance """ # By convention exporters are located in .\exporters subfolder # COMMENT: Don't check file existance. It won't play well with pyinstaller bins exporter_file_name = exporter_name + ".py" exporter_rel_name = "telegram_messages_dump.exporters." + exporter_name # Load exporter from file sprint("Try to load exporter '%s'... " % (exporter_file_name), end='') try: exporter_module = importlib.import_module(exporter_rel_name) sprint("OK!") except ModuleNotFoundError: sprint("\nERROR: Failed to load exporter './exporters/%s'." % exporter_file_name) exit(1) try: exporterClass = getattr(exporter_module, exporter_name) except AttributeError: sprint("ERROR: Failed to load class '%s' out of './exporters/%s'." \ % (exporter_name, exporter_file_name)) exit(1) return exporterClass()