dump-html.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. import argparse
  5. import logging
  6. from datetime import datetime
  7. from wechat.parser import WeChatDBParser
  8. from wechat.res import Resource
  9. from wechat.render import HTMLRender
  10. logger = logging.getLogger("wechat")
  11. def get_args():
  12. parser = argparse.ArgumentParser()
  13. parser.add_argument('name', help='name of contact')
  14. parser.add_argument('--output', help='output html file, e.g. output.html', default='output.html')
  15. parser.add_argument('--db', default='EnMicroMsg.db.decoded',
  16. help='path to the decoded database, e.g. EnMicroMsg.db.decoded')
  17. parser.add_argument('--res', default='resource', help='the resource directory')
  18. parser.add_argument('--wxgf-server', help='address of the wxgf image decoder server')
  19. 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.')
  20. parser.add_argument('--start', help='start time in format of YYYY-MM-DD HH:MM:SS',
  21. type=datetime.fromisoformat)
  22. args = parser.parse_args()
  23. return args
  24. if __name__ == '__main__':
  25. args = get_args()
  26. output_file = args.output
  27. parser = WeChatDBParser(args.db)
  28. try:
  29. chatid = parser.get_chat_id(args.name)
  30. except KeyError:
  31. sys.stderr.write(u"Valid Contacts: {}\n".format(
  32. u'\n'.join(parser.all_chat_nicknames)))
  33. sys.stderr.write(u"Couldn't find the chat {}.".format(args.name));
  34. sys.exit(1)
  35. res = Resource(parser, args.res,
  36. wxgf_server=args.wxgf_server,
  37. avt_db=args.avt)
  38. msgs = parser.msgs_by_chat[chatid]
  39. logger.info(f"Number of Messages for chatid {chatid}: {len(msgs)}")
  40. assert len(msgs) > 0
  41. if args.start is not None:
  42. msgs = [msg for msg in msgs if msg.createTime > args.start]
  43. logger.info(f"Number of Messages after {args.start}: {len(msgs)}")
  44. render = HTMLRender(parser, res)
  45. htmls = render.render_msgs(msgs)
  46. os.makedirs(os.path.dirname(os.path.abspath(output_file)), exist_ok=True)
  47. if len(htmls) == 1:
  48. with open(output_file, 'w') as f:
  49. f.write(htmls[0])
  50. else:
  51. assert output_file.endswith(".html")
  52. basename = output_file[:-5]
  53. for idx, html in enumerate(htmls):
  54. with open(basename + f'{idx:02d}.html', 'w') as f:
  55. f.write(html)
  56. res.emoji_reader.flush_cache()