Better parse metadata message in iOS

This commit is contained in:
KnugiHK
2026-02-22 18:35:04 +08:00
parent 09a26dbe04
commit b1886fd737

View File

@@ -1,5 +1,6 @@
#!/usr/bin/python3
import json
import os
import logging
import shutil
@@ -280,7 +281,7 @@ def process_message_data(message, content, is_group_message, data, message_map,
# Handle metadata messages
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
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
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)."""
if is_group_message:
# Group
if content["ZTEXT"] is not None:
# Changed name
try:
int(content["ZTEXT"])
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
message.data = _parse_group_action(content["ZTEXT"], data)
message.meta = True
return False
else:
message.data = None
return False