amazon_cn.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # -*- coding: utf-8 -*-
  2. import BeautifulSoup
  3. import datetime
  4. import dateutil.parser
  5. import dingguo
  6. import email.message
  7. import ioex
  8. import pytz
  9. import re
  10. def parse_order_confirmation_mail(mail):
  11. assert isinstance(mail, email.message.Message)
  12. html = mail.get_payload()[1].get_payload(decode = True).decode('utf-8')
  13. if not u'订单详情' in html:
  14. raise Exception()
  15. doc = BeautifulSoup.BeautifulSoup(html)
  16. for br in doc.findAll('br'):
  17. br.replaceWith('\n')
  18. def get_text(tag):
  19. return u''.join([c if type(c) is BeautifulSoup.NavigableString else get_text(c) for c in tag.contents])
  20. order = dingguo.Order(
  21. platform = u'amazon.cn',
  22. order_id = doc.find(text = re.compile(u'订单号')).findNext().text,
  23. order_date = dateutil.parser.parse(mail['date']),
  24. )
  25. article_table = doc.find(text = re.compile(u'订购日期')).findNext('table')
  26. for a in article_table.find('tbody').findChildren(recursive = False):
  27. image_col_tag, details_tag, price_tag = a.findAll('td', recursive = False)
  28. name_tag = details_tag.find('a')
  29. order.items.append(dingguo.Article(
  30. name = name_tag.text.strip(),
  31. price_brutto = dingguo.Sum.parse_text(price_tag.text),
  32. quantity = 1,
  33. reseller = name_tag.findNext(text = re.compile(u'由')).findNext().text,
  34. ))
  35. with ioex.setlocale('zh_CN.utf-8'):
  36. estimated_arrival_date_start = pytz.timezone('Asia/Shanghai').localize(
  37. datetime.datetime.strptime(
  38. doc.find(text = re.compile(u'预计送达日期:')).findNext('b').text.encode('utf-8'),
  39. '%A, %m/%d',
  40. ).replace(year = order.order_date.year)
  41. )
  42. assert estimated_arrival_date_start >= order.order_date
  43. order.items.append(dingguo.Shipping(
  44. name = doc.find(text = re.compile(u'送货方式:')).findNext('b').text,
  45. price_brutto = dingguo.Sum.parse_text(
  46. doc.find(text = re.compile(u'配送费:')).findNext().text
  47. ),
  48. estimated_arrival_time = ioex.datetimeex.Period(
  49. start = estimated_arrival_date_start,
  50. end = (estimated_arrival_date_start + datetime.timedelta(days = 1)),
  51. ),
  52. destination_point = '\n'.join([l.strip() for l in
  53. get_text(
  54. doc.find(text = re.compile(u'您的订单发送至:')).findNext('b')
  55. ).split('\n')
  56. ]),
  57. ))
  58. return [order]