diff --git a/Whatsapp_Chat_Exporter/__init__.py b/Whatsapp_Chat_Exporter/__init__.py index a9e6ff3..4f20502 100644 --- a/Whatsapp_Chat_Exporter/__init__.py +++ b/Whatsapp_Chat_Exporter/__init__.py @@ -1 +1 @@ -__version__ = "0.6" \ No newline at end of file +__version__ = "0.6" diff --git a/Whatsapp_Chat_Exporter/__main__.py b/Whatsapp_Chat_Exporter/__main__.py index c8cf0ed..47b3b97 100644 --- a/Whatsapp_Chat_Exporter/__main__.py +++ b/Whatsapp_Chat_Exporter/__main__.py @@ -1,5 +1,6 @@ from .__init__ import __version__ -from Whatsapp_Chat_Exporter import extract, extract_iphone, extract_iphone_media +from Whatsapp_Chat_Exporter import extract, extract_iphone +from Whatsapp_Chat_Exporter import extract_iphone_media from optparse import OptionParser import os import sqlite3 @@ -40,7 +41,8 @@ def main(): "--backup", dest="backup", default=None, - help="Path to Android (must be used together with -k)/iPhone WhatsApp backup") + help="Path to Android (must be used together " + "with -k)/iPhone WhatsApp backup") parser.add_option( "-o", "--output", @@ -102,7 +104,8 @@ def main(): db = open(options.backup, "rb").read() is_crypt14 = False if "crypt12" in options.backup else True if not extract.decrypt_backup(db, key, msg_db, is_crypt14): - print("Dependencies of decrypt_backup are not present. For details, see README.md") + print("Dependencies of decrypt_backup are not " + "present. For details, see README.md") return False if options.wa is None: contact_db = "wa.db" @@ -110,14 +113,14 @@ def main(): contact_db = options.wa if options.media is None: options.media = "WhatsApp" - + if len(args) == 1: msg_db = args[0] if os.path.isfile(contact_db): with sqlite3.connect(contact_db) as db: contacts(db, data) - + elif options.iphone: messages = extract_iphone.messages media = extract_iphone.media diff --git a/Whatsapp_Chat_Exporter/extract_iphone.py b/Whatsapp_Chat_Exporter/extract_iphone.py index 2db090e..614abff 100644 --- a/Whatsapp_Chat_Exporter/extract_iphone.py +++ b/Whatsapp_Chat_Exporter/extract_iphone.py @@ -116,7 +116,7 @@ def messages(db, data): f"Gathering messages...({total_row_number}/{total_row_number})", end="\r") -def media(db, data, media_folder): +def media(db, data): c = db.cursor() # Get media c.execute("""SELECT count() FROM ZWAMEDIAITEM""") @@ -217,7 +217,7 @@ def create_html(data, output_folder, template=None): templateEnv = jinja2.Environment(loader=templateLoader) templateEnv.globals.update(determine_day=determine_day) template = templateEnv.get_template(template_file) - + total_row_number = len(data) print(f"\nCreating HTML...(0/{total_row_number})", end="\r") diff --git a/Whatsapp_Chat_Exporter/extract_iphone_media.py b/Whatsapp_Chat_Exporter/extract_iphone_media.py index 2b257ed..83b1576 100644 --- a/Whatsapp_Chat_Exporter/extract_iphone_media.py +++ b/Whatsapp_Chat_Exporter/extract_iphone_media.py @@ -6,21 +6,24 @@ import os import getpass try: from iphone_backup_decrypt import EncryptedBackup, RelativePath -except: +except ModuleNotFoundError: support_encrypted = False else: support_encrypted = True + def extract_encrypted(base_dir, password): backup = EncryptedBackup(backup_directory=base_dir, passphrase=password) print("Decrypting WhatsApp database...") - backup.extract_file(relative_path=RelativePath.WHATSAPP_MESSAGES, output_filename="7c7fba66680ef796b916b067077cc246adacf01d") - backup.extract_file(relative_path=RelativePath.WHATSAPP_CONTACTS, output_filename="ContactsV2.sqlite") + backup.extract_file(relative_path=RelativePath.WHATSAPP_MESSAGES, + output_filename="7c7fba66680ef796b916b067077cc246adacf01d") + backup.extract_file(relative_path=RelativePath.WHATSAPP_CONTACTS, + output_filename="ContactsV2.sqlite") data = backup.execute_sql("""SELECT count() FROM Files WHERE relativePath LIKE 'Message/Media/%'""" - ) + ) total_row_number = data[0][0] print(f"Gathering media...(0/{total_row_number})", end="\r") data = backup.execute_sql("""SELECT fileID, @@ -30,7 +33,7 @@ def extract_encrypted(base_dir, password): FROM Files WHERE relativePath LIKE 'Message/Media/%'""" - ) + ) if not os.path.isdir("Message"): os.mkdir("Message") if not os.path.isdir("Message/Media"): @@ -43,7 +46,7 @@ def extract_encrypted(base_dir, password): flags = row[2] file = row[3] if flags == 2: - try: + try: os.mkdir(destination) except FileExistsError: pass @@ -56,6 +59,7 @@ def extract_encrypted(base_dir, password): print(f"Gathering media...({i}/{total_row_number})", end="\r") print(f"Gathering media...({total_row_number}/{total_row_number})", end="\r") + def is_encrypted(base_dir): with sqlite3.connect(f"{base_dir}/Manifest.db") as f: c = f.cursor() @@ -68,6 +72,7 @@ def is_encrypted(base_dir): else: return False + def extract_media(base_dir): if is_encrypted(base_dir): if not support_encrypted: diff --git a/setup.py b/setup.py index 46a80a9..af396c7 100644 --- a/setup.py +++ b/setup.py @@ -12,12 +12,13 @@ setuptools.setup( version=version, author="KnugiHK", author_email="info@knugi.com", - description="A Whatsapp database parser that will give you the history of your Whatsapp conversations in HTML and JSON.", + description="A Whatsapp database parser that will give you the " + "history of your Whatsapp conversations in HTML and JSON.", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/KnugiHK/Whatsapp-Chat-Exporter", packages=setuptools.find_packages(), - package_data = { + package_data={ '': ['whatsapp.html'] }, classifiers=[ @@ -38,7 +39,7 @@ setuptools.setup( install_requires=[ 'jinja2' ], - extras_require = { + extras_require={ 'android_backup': ["pycryptodome"] }, entry_points={ @@ -46,4 +47,4 @@ setuptools.setup( "wtsexporter = Whatsapp_Chat_Exporter.__main__:main" ] } -) \ No newline at end of file +)