amazon-order-confirmation-mail-parser 2.8 KB

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