1
0

amazon-order-confirmation-mail-parser 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env python
  2. # PYTHON_ARGCOMPLETE_OK
  3. import re
  4. import os
  5. import sys
  6. import yaml
  7. import email
  8. import pprint
  9. import random
  10. import locale
  11. import argparse
  12. import datetime
  13. import argcomplete
  14. # strptime
  15. locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
  16. def parse(msg):
  17. order = {
  18. 'platform': 'amazon.de',
  19. }
  20. msg_text = msg.get_payload(decode = True)
  21. order['order_id'] = re.search(r'Bestellnummer #(.+)', msg_text).group(1)
  22. order_date = datetime.datetime.strptime(
  23. re.search(r'Aufgegeben am (.+)', msg_text).group(1),
  24. '%d. %B %Y'
  25. )
  26. order['order_date'] = order_date.strftime('%Y-%m-%d')
  27. order['articles'] = []
  28. articles_text = msg_text.split('Bestellte(r) Artikel:')[1].split('_' * 10)[0].strip()
  29. for article_text in articles_text.split('\n\n'):
  30. article_match = re.match(
  31. ur' *(?P<name>.*)\s'
  32. + ur' *(?P<price_currency>[A-Z]+) (?P<price>\d+,\d+)\s'
  33. + ur' *Verkauft von: (?P<reseller>.*)',
  34. article_text,
  35. re.MULTILINE | re.UNICODE
  36. )
  37. article = article_match.groupdict()
  38. article['price'] = float(article['price'].replace(',', '.'))
  39. order['articles'].append(article)
  40. return order
  41. def compute():
  42. msg = email.message_from_string(sys.stdin.read())
  43. orders = []
  44. if msg.is_multipart():
  45. for part in msg.get_payload():
  46. orders.append(parse(part))
  47. else:
  48. orders.append(parse(msg))
  49. print(yaml.safe_dump(orders, default_flow_style = False))
  50. def _init_argparser():
  51. argparser = argparse.ArgumentParser(description = None)
  52. # argparser.add_argument('a', nargs = '*')
  53. # argparser.add_argument('--b')
  54. # argparser.add_argument('--flag', action='store_true')
  55. # argparser.add_argument('file', type = argparse.FileType('r'))
  56. # exclusive_group = argparser.add_mutually_exclusive_group(required = False)
  57. # exclusive_group.add_argument('--exclusive-1', action='store_true')
  58. # exclusive_group.add_argument('--exclusive-2', action='store_true')
  59. # subparsers = argparser.add_subparsers(help = None, dest = 'command')
  60. return argparser
  61. def main(argv):
  62. argparser = _init_argparser()
  63. argcomplete.autocomplete(argparser)
  64. args = argparser.parse_args(argv)
  65. compute(**vars(args))
  66. return 0
  67. if __name__ == "__main__":
  68. sys.exit(main(sys.argv[1:]))