Спочатку завантажте цей інструмент:
bplist_tools.sh
wget https://raw.githubusercontent.com/cclgroupltd/ccl-bplist/master/ccl_bplist.pyТепер створіть bplist2json.py, який базується на цьому старому gist від Benno Kruit
bplist2json.py
#!/usr/bin/env python3
"""
Конвертує Apple Binary Property List (bplist) у 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):
"""Конвертує файловий об'єкт bplist у словник 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='за замовчуванням: 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))Тепер створіть мій скрипт extract-chatlog.py, який конвертує файли JSON у читабельні журнали чату
extract-chatlog.py
#!/usr/bin/env python3
import json
import sys
from datetime import datetime
# Функція для форматування рядка datetime
def format_datetime(dt_str):
dt = datetime.fromisoformat(dt_str)
return dt.strftime("%Y-%m-%d %H:%M:%S")
def main(input_file):
# Зчитуємо дані JSON з вхідного файлу
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Витягуємо список повідомлень
messages = data[2]
# Витягуємо журнал чату у читабельному форматі
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}")
# Виводимо журнал чату у stdout
for log in chat_log:
print(log)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Використання: python script.py <input_file>")
sys.exit(1)
input_file = sys.argv[1]
main(input_file)Тепер час його запустити. Загалом, запустіть bplist2json.py на .ichat, щоб отримати файл JSON, а потім запустіть extract-chatlog.py, щоб отримати текстовий журнал розмови з позначками часу тощо.
Ось bash-однорядник для запуску на всіх файлах *.ichat у поточному каталозі
convert_ichat_files.sh
for i in *.ichat ; do ./bplist2json.py -i ${i} > "${i}.json" ; ./extract-chatlog.py "${i}.json" > ${i}.txt ; done
Дивіться схожі статті за категоріями:
Python
Якщо ця стаття допомогла вам, будь ласка, подумайте про те, щоб купити мені каву або зробити пожертву через PayPal на підтримку досліджень та публікації нових статей на TechOverflow