接收用户消息

微信公众账号能够接收用户发送的六种格式的消息:文本,图片,语音,视频(短视频),地理位置,链接。

    def responseMsg(self):
        encrypt_type = self.request.GET.get('encrypt_type', None)
        pc, postStr = self._encrypt_data(encrypt_type)
        postObj = self._parseMsg(postStr)
        print(postObj)
        msg_type = postObj['MsgType']
        result = ''
        if msg_type == 'text':
            result = self._receiveText(postObj)
        elif msg_type == 'image':
            result = self._receiveImage(postObj)
        elif msg_type == 'voice':
            result = self._receiveVoice(postObj)
        elif msg_type == 'video' or msg_type == 'shortvideo':
            print('视频')
            print(msg_type)
            result = self._receiveVideo(postObj)
        elif msg_type == 'location':
            result = self._receiveLocation(postObj)
        elif msg_type == 'link':
            result = self._receiveLink(postObj)
        elif msg_type == 'event':
            result = self._receiveEvent(postObj)
        else:
            result = '不能识别的 msg type: ' + msg_type
    def _transmitText(self,obj,content):
        xmlTpl ='''
        <xml>
  <ToUserName><![CDATA[{0}]]></ToUserName>
  <FromUserName><![CDATA[{1}]]></FromUserName>
  <CreateTime>{2}</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[{3}]]></Content>
</xml>
        '''
        result = xmlTpl.format(obj['FromUserName'],obj['ToUserName'],int(time.time()),content)
        return result

 

接收消息类:

'''微信公众号接收到的用户消息类型
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
'''

import xml.etree.ElementTree as ET

def parse_xml(web_data):
    if len(web_data) == 0:
        return None
    xmlData = ET.fromstring(web_data)
    msg_type = xmlData.find('MsgType').text
    if msg_type == 'text':
        return ReceiveTextMsg(xmlData)
    elif msg_type == 'image':
        return ReceiveImageMsg(xmlData)
    elif msg_type == 'voice':
        return ReceiveVoiceMsg(xmlData)
    elif msg_type in ('video','shortvideo'):
        return ReceiveVideoMsg(xmlData)
    elif msg_type == 'location':
        return ReceiveLocationMsg(xmlData)
    elif msg_type == 'link':
        return ReceiveLinkMsg(xmlData)
    else:
        print('不能识别的消息类型:'+ msg_type)
        return None

class ReceiveMsg(object):
    '''基类'''
    def __init__(self,xmlData):
        self.ToUserName = xmlData.find('ToUserName').text
        self.FromUserName = xmlData.find('FromUserName').text
        self.CreateTime = xmlData.find('CreateTime').text
        self.MsgType = xmlData.find('MsgType').text
        self.MsgId = xmlData.find('MsgId').text

class ReceiveTextMsg(ReceiveMsg):
    '''文本消息'''
    def __init__(self,xmlData):
        super(ReceiveTextMsg,self).__init__(xmlData)
        self.Content = xmlData.find('Content').text

class ReceiveImageMsg(ReceiveMsg):
    '''图片消息'''
    def __init__(self,xmlData):
        super(ReceiveImageMsg,self).__init__(xmlData)
        self.PicUrl = xmlData.find('PicUrl').text
        self.MediaId = xmlData.find('MediaId').text

class ReceiveVoiceMsg(ReceiveMsg):
    '''语音消息'''
    def __init__(self,xmlData):
        super(ReceiveVoiceMsg,self).__init__(xmlData)
        self.Format = xmlData.find('Format').text
        self.MediaId = xmlData.find('MediaId').text
        self.Recognition = ''
        if xmlData.find('Recognition') is not None:
            self.Recognition = xmlData.find('Recognition').text

class ReceiveVideoMsg(ReceiveMsg):
    '''视频消息和小视频消息'''
    def __init__(self,xmlData):
        super(ReceiveVideoMsg,self).__init__(xmlData)
        self.ThumbMediaId = xmlData.find('ThumbMediaId').text
        self.MediaId = xmlData.find('MediaId').text

class ReceiveLocationMsg(ReceiveMsg):
    '''地理位置消息'''
    def __init__(self,xmlData):
        super(ReceiveLocationMsg,self).__init__(xmlData)
        self.Location_X = xmlData.find('Location_X').text
        self.Location_Y = xmlData.find('Location_Y').text
        self.Scale = xmlData.find('Scale').text
        self.Label = xmlData.find('Label').text

class ReceiveLinkMsg(ReceiveMsg):
    '''链接消息'''
    def __init__(self,xmlData):
        super(ReceiveLinkMsg,self).__init__(xmlData)
        self.Title = xmlData.find('Title').text
        self.Description = xmlData.find('Description').text
        self.Url = xmlData.find('Url').text

class ReceiveEventMsg(ReceiveMsg):
    '''普通事件'''
    def __init__(self, xmlData):
        super(ReceiveEventMsg,self).__init__(xmlData)
        self.Event = xmlData.find('Event').text
        self.EventKey = (False,'')
        if xmlData.find('EventKey') is not None:
            self.EventKey =(True, xmlData.find('EventKey').text)

        self.Ticket = (False,'')
        if xmlData.find('Ticket') is not None:
            self.EventKey =(True, xmlData.find('Ticket').text)

class ReveiveLocationEventMsg(ReceiveEventMsg):
    '''上报地理位置事件'''
    def __init__(self,xmlData):
        super(ReveiveLocationEventMsg,self).__init__(xmlData)
        self.Latitude = xmlData.find('Latitude').text
        self.Longitude = xmlData.find('Longitude').text
        self.Precision = xmlData.find('Precision').text

 

posted @ 2019-12-14 08:58  AhMay  阅读(247)  评论(0编辑  收藏  举报