Primero, descarga esta herramienta:
bplist_tools.sh
wget https://raw.githubusercontent.com/cclgroupltd/ccl-bplist/master/ccl_bplist.pyAhora crea bplist2json.py el cual está basado en este viejo gist por Benno Kruit
bplist2json.py
#!/usr/bin/env python3
"""
Convertir un Apple Binary Property List (bplist) a json
"""
import ccl_bplist # https://github.com/cclgroupltd/ccl-bplist
from datetime import datetime
def clean_archive(d):
if type(d) in [dict, ccl_bplist.NsKeyedArchiverDictionary]:
return {k:clean_archive(v) for k,v in d.items() if not k.startswith('$')}
elif type(d) == ccl_bplist.NsKeyedArchiverList:
return [clean_archive(i) for i in d]
else:
return d
def bplist_dict(fobj):
"""Convertir un objeto de archivo bplist a un diccionario de Python"""
plist = ccl_bplist.load(fobj)
ccl_bplist.set_object_converter(ccl_bplist.NSKeyedArchiver_common_objects_convertor)
archive = ccl_bplist.deserialise_NsKeyedArchiver(plist)
return clean_archive(archive)
if __name__ == '__main__':
import argparse, sys, json
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--input', '-i', nargs='?', type=argparse.FileType('rb'),
default=sys.stdin, help='predeterminado: stdin')
args = parser.parse_args()
class ExportEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, bytes):
return o.decode('iso-8859-1')
return json.JSONEncoder.default(self, o)
print(json.dumps(bplist_dict(args.input), cls=ExportEncoder, indent=4))Ahora crea mi script extract-chatlog.py el cual convierte los archivos JSON a registros de chat legibles por humanos
extract-chatlog.py
#!/usr/bin/env python3
import json
import sys
from datetime import datetime
# Función para formatear una cadena de fecha y hora
def format_datetime(dt_str):
dt = datetime.fromisoformat(dt_str)
return dt.strftime("%Y-%m-%d %H:%M:%S")
def main(input_file):
# Leer JSON data del input file
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Extraer la lista de mensajes
messages = data[2]
# Extraer el registro de chat en un formato legible por humanos
chat_log = []
for message in messages:
sender = message['Sender']['ID']
time = format_datetime(message['Time'])
text = message['MessageText']['NSString']
chat_log.append(f"{time} - {sender}: {text}")
# Imprimir el registro de chat a stdout
for log in chat_log:
print(log)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Uso: python script.py <archivo_de_entrada>")
sys.exit(1)
input_file = sys.argv[1]
main(input_file)Ahora es momento de ejecutarlo. Generalmente, ejecuta bplist2json.py en el .ichat para obtener un archivo JSON y luego ejecuta extract-chatlog.py para obtener un registro de conversación en texto con marcas de tiempo etc.
Aquí hay un comando bash de una línea para ejecutarlo en todos los archivos *.ichat en el directorio actual
convert_ichat_files.sh
for i in *.ichat ; do ./bplist2json.py -i ${i} > "${i}.json" ; ./extract-chatlog.py "${i}.json" > ${i}.txt ; done
Echa un vistazo a artículos similares por categoría:
Python
Si este artículo te ha ayudado, considera invitarme a un café o hacer una donación vía PayPal para apoyar la investigación y publicación de nuevos artículos en TechOverflow