amazon-order-confirmation-mail-parser 2.6 KB

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