如何使用 Python 转换 iChat 消息备份(.ichat,Apple 二进制属性列表)
首先,下载此工具:
bplist_tools.sh
wget https://raw.githubusercontent.com/cclgroupltd/ccl-bplist/master/ccl_bplist.py现在创建 bplist2json.py,它基于 Benno Kruit 的这个旧 gist
bplist2json.py
#!/usr/bin/env python3
"""
Convert an Apple Binary Property List (bplist) to 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):
"""Convert a bplist file object to python dict"""
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='default: 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
# Function to format datetime string
def format_datetime(dt_str):
dt = datetime.fromisoformat(dt_str)
return dt.strftime("%Y-%m-%d %H:%M:%S")
def main(input_file):
# Read JSON data from input file
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Extract the messages list
messages = data[2]
# Extract chat log in a human-readable format
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}")
# Print chat log to stdout
for log in chat_log:
print(log)
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python script.py <input_file>")
sys.exit(1)
input_file = sys.argv[1]
main(input_file)现在可以运行了。通常,在 .ichat 上运行 bplist2json.py 获取 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 ; doneCheck out similar posts by category:
Python
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow