amazon-order-confirmation-mail-parser 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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_brutto_currency>[A-Z]+) (?P<price_brutto>\d+,\d+)\s'
  33. + ur'( *Zustand: (?P<state>.*)\s)?'
  34. + ur' *Verkauft von: (?P<reseller>.*)',
  35. article_text,
  36. re.MULTILINE | re.UNICODE
  37. )
  38. if article_match is None:
  39. sys.stderr.write(repr(article_text))
  40. raise Exception('could not match article')
  41. article = article_match.groupdict()
  42. article['price_brutto'] = float(article['price_brutto'].replace(',', '.'))
  43. order['articles'].append(article)
  44. return order
  45. def compute():
  46. msg = email.message_from_string(sys.stdin.read())
  47. orders = []
  48. if msg.is_multipart():
  49. for part in msg.get_payload():
  50. orders.append(parse(part))
  51. else:
  52. orders.append(parse(msg))
  53. print(yaml.safe_dump(orders, default_flow_style = False))
  54. def _init_argparser():
  55. argparser = argparse.ArgumentParser(description = None)
  56. # argparser.add_argument('a', nargs = '*')
  57. # argparser.add_argument('--b')
  58. # argparser.add_argument('--flag', action='store_true')
  59. # argparser.add_argument('file', type = argparse.FileType('r'))
  60. # exclusive_group = argparser.add_mutually_exclusive_group(required = False)
  61. # exclusive_group.add_argument('--exclusive-1', action='store_true')
  62. # exclusive_group.add_argument('--exclusive-2', action='store_true')
  63. # subparsers = argparser.add_subparsers(help = None, dest = 'command')
  64. return argparser
  65. def main(argv):
  66. argparser = _init_argparser()
  67. argcomplete.autocomplete(argparser)
  68. args = argparser.parse_args(argv)
  69. compute(**vars(args))
  70. return 0
  71. if __name__ == "__main__":
  72. sys.exit(main(sys.argv[1:]))