dump-html.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. import argparse
  5. import logging
  6. from wechat.parser import WeChatDBParser
  7. from wechat.res import Resource
  8. from wechat.common.textutil import ensure_unicode
  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. args = parser.parse_args()
  21. return args
  22. if __name__ == '__main__':
  23. args = get_args()
  24. name = ensure_unicode(args.name)
  25. output_file = args.output
  26. parser = WeChatDBParser(args.db)
  27. try:
  28. chatid = parser.get_chat_id(args.name)
  29. except KeyError:
  30. sys.stderr.write(u"Valid Contacts: {}\n".format(
  31. u'\n'.join(parser.all_chat_nicknames)))
  32. sys.stderr.write(u"Couldn't find the chat {}.".format(name));
  33. sys.exit(1)
  34. res = Resource(parser, args.res,
  35. wxgf_server=args.wxgf_server,
  36. avt_db=args.avt)
  37. msgs = parser.msgs_by_chat[chatid]
  38. logger.info(f"Number of Messages for chatid {chatid}: {len(msgs)}")
  39. assert len(msgs) > 0
  40. render = HTMLRender(parser, res)
  41. htmls = render.render_msgs(msgs)
  42. os.makedirs(os.path.dirname(os.path.abspath(output_file)), exist_ok=True)
  43. if len(htmls) == 1:
  44. with open(output_file, 'w') as f:
  45. f.write(htmls[0])
  46. else:
  47. assert output_file.endswith(".html")
  48. basename = output_file[:-5]
  49. for idx, html in enumerate(htmls):
  50. with open(basename + f'{idx:02d}.html', 'w') as f:
  51. f.write(html)
  52. res.emoji_reader.flush_cache()