解析微信服务器推送的 XML 消息 :param xml: XML 消息 :return: 解析成功返回对应的消息或事件,否则返回 ``UnknownMessage``
(xml)
| 16 | |
| 17 | |
| 18 | def parse_message(xml): |
| 19 | """ |
| 20 | 解析微信服务器推送的 XML 消息 |
| 21 | |
| 22 | :param xml: XML 消息 |
| 23 | :return: 解析成功返回对应的消息或事件,否则返回 ``UnknownMessage`` |
| 24 | """ |
| 25 | if not xml: |
| 26 | return |
| 27 | message = xmltodict.parse(to_text(xml))['xml'] |
| 28 | message_type = message['MsgType'].lower() |
| 29 | event_type = None |
| 30 | if message_type == 'event' or message_type.startswith('device_'): |
| 31 | if 'Event' in message: |
| 32 | event_type = message['Event'].lower() |
| 33 | # special event type for device_event |
| 34 | if event_type is None and message_type.startswith('device_'): |
| 35 | event_type = message_type |
| 36 | elif message_type.startswith('device_'): |
| 37 | event_type = 'device_{event}'.format(event=event_type) |
| 38 | |
| 39 | if event_type == 'subscribe' and message.get('EventKey'): |
| 40 | event_key = message['EventKey'] |
| 41 | if event_key.startswith(('scanbarcode|', 'scanimage|')): |
| 42 | event_type = 'subscribe_scan_product' |
| 43 | message['Event'] = event_type |
| 44 | elif event_key.startswith('qrscene_'): |
| 45 | # Scan to subscribe with scene id event |
| 46 | event_type = 'subscribe_scan' |
| 47 | message['Event'] = event_type |
| 48 | message['EventKey'] = event_key[len('qrscene_'):] |
| 49 | message_class = EVENT_TYPES.get(event_type, UnknownMessage) |
| 50 | else: |
| 51 | message_class = MESSAGE_TYPES.get(message_type, UnknownMessage) |
| 52 | return message_class(message) |
searching dependent graphs…