mirror of
https://github.com/KnugiHK/WhatsApp-Chat-Exporter.git
synced 2026-04-25 23:41:33 +00:00
Fix: use a more reliable way to determine chat #61
This fix also changed how to determine if the message belongs to a group or PM.
This commit is contained in:
@@ -69,7 +69,7 @@ def messages(db, data, media_folder):
|
|||||||
total_row_number = c.fetchone()[0]
|
total_row_number = c.fetchone()[0]
|
||||||
print(f"Processing messages...(0/{total_row_number})", end="\r")
|
print(f"Processing messages...(0/{total_row_number})", end="\r")
|
||||||
|
|
||||||
c.execute("""SELECT COALESCE(ZFROMJID, ZTOJID) as _id,
|
c.execute("""SELECT ZCONTACTJID,
|
||||||
ZWAMESSAGE.Z_PK,
|
ZWAMESSAGE.Z_PK,
|
||||||
ZISFROMME,
|
ZISFROMME,
|
||||||
ZMESSAGEDATE,
|
ZMESSAGEDATE,
|
||||||
@@ -77,29 +77,33 @@ def messages(db, data, media_folder):
|
|||||||
ZMESSAGETYPE,
|
ZMESSAGETYPE,
|
||||||
ZWAGROUPMEMBER.ZMEMBERJID,
|
ZWAGROUPMEMBER.ZMEMBERJID,
|
||||||
ZMETADATA,
|
ZMETADATA,
|
||||||
ZSTANZAID
|
ZSTANZAID,
|
||||||
|
ZGROUPINFO
|
||||||
FROM ZWAMESSAGE
|
FROM ZWAMESSAGE
|
||||||
LEFT JOIN ZWAGROUPMEMBER
|
LEFT JOIN ZWAGROUPMEMBER
|
||||||
ON ZWAMESSAGE.ZGROUPMEMBER = ZWAGROUPMEMBER.Z_PK
|
ON ZWAMESSAGE.ZGROUPMEMBER = ZWAGROUPMEMBER.Z_PK
|
||||||
LEFT JOIN ZWAMEDIAITEM
|
LEFT JOIN ZWAMEDIAITEM
|
||||||
ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE;""")
|
ON ZWAMESSAGE.Z_PK = ZWAMEDIAITEM.ZMESSAGE
|
||||||
|
INNER JOIN ZWACHATSESSION
|
||||||
|
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK;""")
|
||||||
i = 0
|
i = 0
|
||||||
content = c.fetchone()
|
content = c.fetchone()
|
||||||
while content is not None:
|
while content is not None:
|
||||||
_id = content["_id"]
|
ZCONTACTJID = content["ZCONTACTJID"]
|
||||||
Z_PK = content["Z_PK"]
|
Z_PK = content["Z_PK"]
|
||||||
if _id not in data:
|
is_group_message = content["ZGROUPINFO"] is not None
|
||||||
data[_id] = ChatStore(Device.IOS)
|
if ZCONTACTJID not in data:
|
||||||
|
data[ZCONTACTJID] = ChatStore(Device.IOS)
|
||||||
path = f'{media_folder}/Media/Profile/{_id.split("@")[0]}'
|
path = f'{media_folder}/Media/Profile/{_id.split("@")[0]}'
|
||||||
avatars = glob(f"{path}*")
|
avatars = glob(f"{path}*")
|
||||||
if 0 < len(avatars) <= 1:
|
if 0 < len(avatars) <= 1:
|
||||||
data[_id].their_avatar = avatars[0]
|
data[ZCONTACTJID].their_avatar = avatars[0]
|
||||||
else:
|
else:
|
||||||
for avatar in avatars:
|
for avatar in avatars:
|
||||||
if avatar.endswith(".thumb"):
|
if avatar.endswith(".thumb"):
|
||||||
data[_id].their_avatar_thumb = avatar
|
data[ZCONTACTJID].their_avatar_thumb = avatar
|
||||||
elif avatar.endswith(".jpg"):
|
elif avatar.endswith(".jpg"):
|
||||||
data[_id].their_avatar = avatar
|
data[ZCONTACTJID].their_avatar = avatar
|
||||||
ts = APPLE_TIME + content["ZMESSAGEDATE"]
|
ts = APPLE_TIME + content["ZMESSAGEDATE"]
|
||||||
message = Message(
|
message = Message(
|
||||||
from_me=content["ZISFROMME"],
|
from_me=content["ZISFROMME"],
|
||||||
@@ -108,7 +112,7 @@ def messages(db, data, media_folder):
|
|||||||
key_id=content["ZSTANZAID"][:17],
|
key_id=content["ZSTANZAID"][:17],
|
||||||
)
|
)
|
||||||
invalid = False
|
invalid = False
|
||||||
if "-" in _id and content["ZISFROMME"] == 0:
|
if is_group_message and content["ZISFROMME"] == 0:
|
||||||
name = None
|
name = None
|
||||||
if content["ZMEMBERJID"] is not None:
|
if content["ZMEMBERJID"] is not None:
|
||||||
if content["ZMEMBERJID"] in data:
|
if content["ZMEMBERJID"] in data:
|
||||||
@@ -124,7 +128,7 @@ def messages(db, data, media_folder):
|
|||||||
message.sender = None
|
message.sender = None
|
||||||
if content["ZMESSAGETYPE"] == 6:
|
if content["ZMESSAGETYPE"] == 6:
|
||||||
# Metadata
|
# Metadata
|
||||||
if "-" in _id:
|
if is_group_message:
|
||||||
# Group
|
# Group
|
||||||
if content["ZTEXT"] is not None:
|
if content["ZTEXT"] is not None:
|
||||||
# Chnaged name
|
# Chnaged name
|
||||||
@@ -173,7 +177,7 @@ def messages(db, data, media_folder):
|
|||||||
msg = msg.replace("\n", "<br>")
|
msg = msg.replace("\n", "<br>")
|
||||||
message.data = msg
|
message.data = msg
|
||||||
if not invalid:
|
if not invalid:
|
||||||
data[_id].add_message(Z_PK, message)
|
data[ZCONTACTJID].add_message(Z_PK, message)
|
||||||
i += 1
|
i += 1
|
||||||
if i % 1000 == 0:
|
if i % 1000 == 0:
|
||||||
print(f"Processing messages...({i}/{total_row_number})", end="\r")
|
print(f"Processing messages...({i}/{total_row_number})", end="\r")
|
||||||
@@ -189,7 +193,7 @@ def media(db, data, media_folder):
|
|||||||
total_row_number = c.fetchone()[0]
|
total_row_number = c.fetchone()[0]
|
||||||
print(f"\nProcessing media...(0/{total_row_number})", end="\r")
|
print(f"\nProcessing media...(0/{total_row_number})", end="\r")
|
||||||
i = 0
|
i = 0
|
||||||
c.execute("""SELECT COALESCE(ZWAMESSAGE.ZFROMJID, ZWAMESSAGE.ZTOJID) as _id,
|
c.execute("""SELECT ZCONTACTJID,
|
||||||
ZMESSAGE,
|
ZMESSAGE,
|
||||||
ZMEDIALOCALPATH,
|
ZMEDIALOCALPATH,
|
||||||
ZMEDIAURL,
|
ZMEDIAURL,
|
||||||
@@ -199,15 +203,16 @@ def media(db, data, media_folder):
|
|||||||
FROM ZWAMEDIAITEM
|
FROM ZWAMEDIAITEM
|
||||||
INNER JOIN ZWAMESSAGE
|
INNER JOIN ZWAMESSAGE
|
||||||
ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK
|
ON ZWAMEDIAITEM.ZMESSAGE = ZWAMESSAGE.Z_PK
|
||||||
|
INNER JOIN ZWACHATSESSION
|
||||||
|
ON ZWAMESSAGE.ZCHATSESSION = ZWACHATSESSION.Z_PK
|
||||||
WHERE ZMEDIALOCALPATH IS NOT NULL
|
WHERE ZMEDIALOCALPATH IS NOT NULL
|
||||||
ORDER BY _id ASC""")
|
ORDER BY ZCONTACTJID ASC""")
|
||||||
content = c.fetchone()
|
content = c.fetchone()
|
||||||
mime = MimeTypes()
|
mime = MimeTypes()
|
||||||
while content is not None:
|
while content is not None:
|
||||||
file_path = f"{media_folder}/Message/{content['ZMEDIALOCALPATH']}"
|
file_path = f"{media_folder}/Message/{content['ZMEDIALOCALPATH']}"
|
||||||
_id = content["_id"]
|
|
||||||
ZMESSAGE = content["ZMESSAGE"]
|
ZMESSAGE = content["ZMESSAGE"]
|
||||||
message = data[_id].messages[ZMESSAGE]
|
message = data[content["ZCONTACTJID"]].messages[ZMESSAGE]
|
||||||
message.media = True
|
message.media = True
|
||||||
if os.path.isfile(file_path):
|
if os.path.isfile(file_path):
|
||||||
message.data = file_path
|
message.data = file_path
|
||||||
|
|||||||
Reference in New Issue
Block a user