#!/usr/bin/env python3 import os import sys import argparse import logging from datetime import datetime from wechat.parser import WeChatDBParser from wechat.res import Resource from wechat.render import HTMLRender logger = logging.getLogger("wechat") def get_args(): parser = argparse.ArgumentParser() parser.add_argument('name', help='name of contact') parser.add_argument('--output', help='output html file, e.g. output.html', default='output.html') parser.add_argument('--db', default='EnMicroMsg.db.decoded', help='path to the decoded database, e.g. EnMicroMsg.db.decoded') parser.add_argument('--res', default='resource', help='the resource directory') parser.add_argument('--wxgf-server', help='address of the wxgf image decoder server') parser.add_argument('--avt', default='avatar.index', help='path to avatar.index file that only exists in old version of wechat. Ignore for new version of wechat.') parser.add_argument('--start', help='start time in format of YYYY-MM-DD HH:MM:SS', type=datetime.fromisoformat) args = parser.parse_args() return args if __name__ == '__main__': args = get_args() output_file = args.output parser = WeChatDBParser(args.db) try: chatid = parser.get_chat_id(args.name) except KeyError: sys.stderr.write(u"Valid Contacts: {}\n".format( u'\n'.join(parser.all_chat_nicknames))) sys.stderr.write(u"Couldn't find the chat {}.".format(args.name)); sys.exit(1) res = Resource(parser, args.res, wxgf_server=args.wxgf_server, avt_db=args.avt) msgs = parser.msgs_by_chat[chatid] logger.info(f"Number of Messages for chatid {chatid}: {len(msgs)}") assert len(msgs) > 0 if args.start is not None: msgs = [msg for msg in msgs if msg.createTime > args.start] logger.info(f"Number of Messages after {args.start}: {len(msgs)}") render = HTMLRender(parser, res) htmls = render.render_msgs(msgs) os.makedirs(os.path.dirname(os.path.abspath(output_file)), exist_ok=True) if len(htmls) == 1: with open(output_file, 'w') as f: f.write(htmls[0]) else: assert output_file.endswith(".html") basename = output_file[:-5] for idx, html in enumerate(htmls): with open(basename + f'{idx:02d}.html', 'w') as f: f.write(html) res.emoji_reader.flush_cache()