mirror of
https://github.com/KnugiHK/WhatsApp-Chat-Exporter.git
synced 2026-05-18 14:56:45 +00:00
Better parse metadata message in iOS
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
@@ -280,7 +281,7 @@ def process_message_data(message, content, is_group_message, data, message_map,
|
|||||||
|
|
||||||
# Handle metadata messages
|
# Handle metadata messages
|
||||||
if content["ZMESSAGETYPE"] == 6:
|
if content["ZMESSAGETYPE"] == 6:
|
||||||
return process_metadata_message(message, content, is_group_message)
|
return process_metadata_message(message, content, is_group_message, data)
|
||||||
|
|
||||||
# Handle quoted replies
|
# Handle quoted replies
|
||||||
if content["ZMETADATA"] is not None and content["ZMETADATA"].startswith(b"\x2a\x14") and not no_reply:
|
if content["ZMETADATA"] is not None and content["ZMETADATA"].startswith(b"\x2a\x14") and not no_reply:
|
||||||
@@ -307,21 +308,51 @@ def process_message_data(message, content, is_group_message, data, message_map,
|
|||||||
return False # Message is valid
|
return False # Message is valid
|
||||||
|
|
||||||
|
|
||||||
def process_metadata_message(message, content, is_group_message):
|
def _parse_group_action(ztext, data):
|
||||||
|
if ztext.endswith("@lid") or ztext.endswith("@s.whatsapp.net"):
|
||||||
|
# This is likely a group member change action
|
||||||
|
# Not really sure actually
|
||||||
|
name = None
|
||||||
|
if ztext in data:
|
||||||
|
name = data.get_chat(ztext).name
|
||||||
|
if "@" in ztext:
|
||||||
|
fallback = ztext.split('@')[0]
|
||||||
|
else:
|
||||||
|
fallback = None
|
||||||
|
entity = name or fallback
|
||||||
|
|
||||||
|
return f"{entity} join the group"
|
||||||
|
|
||||||
|
elif ztext.startswith("{") and ztext.endswith("}"):
|
||||||
|
try:
|
||||||
|
metadata = json.loads(ztext)
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
return ztext # Not a JSON string, return as-is
|
||||||
|
entity = metadata.get('author', 'Someone')
|
||||||
|
if entity is not "Someone":
|
||||||
|
name = None
|
||||||
|
if entity in data:
|
||||||
|
name = data.get_chat(entity).name
|
||||||
|
if "@" in entity:
|
||||||
|
fallback = entity.split('@')[0]
|
||||||
|
else:
|
||||||
|
fallback = None
|
||||||
|
entity = name or fallback
|
||||||
|
return f"{entity} changed the group name to {metadata.get('subject', 'Unknown')}."
|
||||||
|
elif ztext == "admin_add":
|
||||||
|
return f"The administrator has restricted participant additions to admins only."
|
||||||
|
else:
|
||||||
|
return "Unsupported WhatsApp internal message."
|
||||||
|
|
||||||
|
|
||||||
|
def process_metadata_message(message, content, is_group_message, data):
|
||||||
"""Process metadata messages (action_type 6)."""
|
"""Process metadata messages (action_type 6)."""
|
||||||
if is_group_message:
|
if is_group_message:
|
||||||
# Group
|
# Group
|
||||||
if content["ZTEXT"] is not None:
|
if content["ZTEXT"] is not None:
|
||||||
# Changed name
|
message.data = _parse_group_action(content["ZTEXT"], data)
|
||||||
try:
|
message.meta = True
|
||||||
int(content["ZTEXT"])
|
return False
|
||||||
except ValueError:
|
|
||||||
msg = f"The group name changed to {content['ZTEXT']}"
|
|
||||||
message.data = msg
|
|
||||||
message.meta = True
|
|
||||||
return False # Valid message
|
|
||||||
else:
|
|
||||||
return True # Invalid message
|
|
||||||
else:
|
else:
|
||||||
message.data = None
|
message.data = None
|
||||||
return False
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user