mirror of
https://github.com/KnugiHK/WhatsApp-Chat-Exporter.git
synced 2026-02-24 01:23:35 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
507e88d9c3 | ||
|
|
60e1e7d3eb | ||
|
|
774fb6d781 | ||
|
|
3ef3b02230 | ||
|
|
07cc0f3571 | ||
|
|
a1319eb835 | ||
|
|
8cbb0af43a | ||
|
|
28c4a7b99f | ||
|
|
e4c9d42927 | ||
|
|
c274b6b1c0 | ||
|
|
eec739d7cf | ||
|
|
3d7dca0682 |
@@ -7,6 +7,8 @@ A customizable Android and iPhone Whatsapp database parser that will give you th
|
|||||||
**If you plan to uninstall WhatsApp or delete your WhatsApp account, please make a backup of your WhatsApp database. You may want to use this exporter again on the same database in the future as the exporter develops**
|
**If you plan to uninstall WhatsApp or delete your WhatsApp account, please make a backup of your WhatsApp database. You may want to use this exporter again on the same database in the future as the exporter develops**
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
|
**Usage in README may be removed in the future. Check the usage in [Wiki](https://github.com/KnugiHK/Whatsapp-Chat-Exporter/wiki)**
|
||||||
|
|
||||||
**If you want to use the old release (< 0.5) of the exporter, please follow the [old usage guide](https://github.com/KnugiHK/Whatsapp-Chat-Exporter/blob/main/old_README.md#usage)**
|
**If you want to use the old release (< 0.5) of the exporter, please follow the [old usage guide](https://github.com/KnugiHK/Whatsapp-Chat-Exporter/blob/main/old_README.md#usage)**
|
||||||
|
|
||||||
First, install the exporter by:
|
First, install the exporter by:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "0.8.0"
|
__version__ = "0.8.2"
|
||||||
|
|||||||
@@ -78,6 +78,13 @@ def main():
|
|||||||
dest="template",
|
dest="template",
|
||||||
default=None,
|
default=None,
|
||||||
help="Path to custom HTML template")
|
help="Path to custom HTML template")
|
||||||
|
parser.add_option(
|
||||||
|
"-e",
|
||||||
|
"--embedded",
|
||||||
|
dest="embedded",
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help="Embed media into HTML file")
|
||||||
(options, args) = parser.parse_args()
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
if options.android and options.iphone:
|
if options.android and options.iphone:
|
||||||
@@ -167,7 +174,7 @@ def main():
|
|||||||
messages(db, data)
|
messages(db, data)
|
||||||
media(db, data, options.media)
|
media(db, data, options.media)
|
||||||
vcard(db, data)
|
vcard(db, data)
|
||||||
create_html(data, options.output, options.template)
|
create_html(data, options.output, options.template, options.embedded)
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
"The message database does not exist. You may specify the path "
|
"The message database does not exist. You may specify the path "
|
||||||
|
|||||||
@@ -215,7 +215,8 @@ def messages(db, data):
|
|||||||
messages.media_caption
|
messages.media_caption
|
||||||
FROM messages
|
FROM messages
|
||||||
LEFT JOIN messages_quotes
|
LEFT JOIN messages_quotes
|
||||||
ON messages.quoted_row_id = messages_quotes._id;""")
|
ON messages.quoted_row_id = messages_quotes._id
|
||||||
|
WHERE messages.key_remote_jid <> '-1';""")
|
||||||
i = 0
|
i = 0
|
||||||
content = c.fetchone()
|
content = c.fetchone()
|
||||||
while content is not None:
|
while content is not None:
|
||||||
@@ -414,12 +415,13 @@ def vcard(db, data):
|
|||||||
if not os.path.isdir(base):
|
if not os.path.isdir(base):
|
||||||
Path(base).mkdir(parents=True, exist_ok=True)
|
Path(base).mkdir(parents=True, exist_ok=True)
|
||||||
for index, row in enumerate(rows):
|
for index, row in enumerate(rows):
|
||||||
file_name = "".join(x for x in row[3] if x.isalnum())
|
media_name = row[3] if row[3] else ""
|
||||||
|
file_name = "".join(x for x in media_name if x.isalnum())
|
||||||
file_path = f"{base}/{file_name}.vcf"
|
file_path = f"{base}/{file_name}.vcf"
|
||||||
if not os.path.isfile(file_path):
|
if not os.path.isfile(file_path):
|
||||||
with open(file_path, "w", encoding="utf-8") as f:
|
with open(file_path, "w", encoding="utf-8") as f:
|
||||||
f.write(row[2])
|
f.write(row[2])
|
||||||
data[row[1]]["messages"][row[0]]["data"] = row[3] + \
|
data[row[1]]["messages"][row[0]]["data"] = media_name + \
|
||||||
"The vCard file cannot be displayed here, " \
|
"The vCard file cannot be displayed here, " \
|
||||||
f"however it should be located at {file_path}"
|
f"however it should be located at {file_path}"
|
||||||
data[row[1]]["messages"][row[0]]["mime"] = "text/x-vcard"
|
data[row[1]]["messages"][row[0]]["mime"] = "text/x-vcard"
|
||||||
@@ -427,7 +429,7 @@ def vcard(db, data):
|
|||||||
print(f"Gathering vCards...({index + 1}/{total_row_number})", end="\r")
|
print(f"Gathering vCards...({index + 1}/{total_row_number})", end="\r")
|
||||||
|
|
||||||
|
|
||||||
def create_html(data, output_folder, template=None):
|
def create_html(data, output_folder, template=None, embedded=False):
|
||||||
if template is None:
|
if template is None:
|
||||||
template_dir = os.path.dirname(__file__)
|
template_dir = os.path.dirname(__file__)
|
||||||
template_file = "whatsapp.html"
|
template_file = "whatsapp.html"
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ def vcard(db, data):
|
|||||||
print(f"Gathering vCards...({index + 1}/{total_row_number})", end="\r")
|
print(f"Gathering vCards...({index + 1}/{total_row_number})", end="\r")
|
||||||
|
|
||||||
|
|
||||||
def create_html(data, output_folder, template=None):
|
def create_html(data, output_folder, template=None, embedded=False):
|
||||||
if template is None:
|
if template is None:
|
||||||
template_dir = os.path.dirname(__file__)
|
template_dir = os.path.dirname(__file__)
|
||||||
template_file = "whatsapp.html"
|
template_file = "whatsapp.html"
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
theme: jekyll-theme-cayman
|
|
||||||
2
setup.py
2
setup.py
@@ -41,7 +41,7 @@ setuptools.setup(
|
|||||||
'bleach'
|
'bleach'
|
||||||
],
|
],
|
||||||
extras_require={
|
extras_require={
|
||||||
'android_backup': ["pycryptodome"],
|
'android_backup': ["pycryptodome", "javaobj-py3"],
|
||||||
'crypt12': ["pycryptodome"],
|
'crypt12': ["pycryptodome"],
|
||||||
'crypt12': ["pycryptodome"],
|
'crypt12': ["pycryptodome"],
|
||||||
'crypt15': ["pycryptodome", "javaobj-py3"]
|
'crypt15': ["pycryptodome", "javaobj-py3"]
|
||||||
|
|||||||
Reference in New Issue
Block a user