最近忙國賽的一個項目,我得做一個微信公眾號。功能就是調數據并回復給用戶,需要用戶發送給公眾號一個關鍵詞,通過關鍵詞自動回復消息。
這時就是查詢微信公眾平臺文檔了,地址如下: 文檔
按照它的入門指南,我基本上了解了用戶給公眾號發送消息的一個機制,并且一旦給公眾號發送消息,在開發者后臺,會收到公眾平臺發送的一個xml,所以通過編寫Python腳本進行xml的解析與自動發送功能。
如果用戶給公眾號發送一段text消息,比如“hello”,那么后臺就會收到一個xml為:
<xml><ToUserName><![CDATA[公眾號]]></ToUserName><FromUserName><![CDATA[粉絲號]]></FromUserName><CreateTime>1460541339</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[hello]]></Content></xml>
注意這里面有一些標記對于我們開發者來說是非常有用的:ToUserName,FromUserName,MsgType,Content
所以我們只要知道了這些信息,我們就能做到自動回復的功能。
我們發現這個MsgType 為 ‘text'。而微信中的MsgType有“text”(文本)、“image”(圖像)、“voice”(語音)、“video”(視頻)、“shortvideo”(短視頻)、“location”(位置)、“link”(鏈接)、“event”(事件)
首先我們寫一個main.py文件
main.py
# -*- coding: utf-8 -*-# filename: main.pyimport webfrom handle import Handleurls = ( '/wx', 'Handle',)if __name__ == '__main__': app = web.application(urls, globals()) app.run()
然后寫一個receive.py,作為接受用戶發送過來的數據,并解析xml,返回數據的腳本。
receive.py
import xml.etree.ElementTree as ETdef 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': #print('text') return TextMsg(xmlData) elif msg_type == 'image': return ImageMsg(xmlData) elif msg_type == 'location': #print('location') return LocationMsg(xmlData) elif msg_type == 'event': #print('event') return EventMsg(xmlData)class Event(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.Eventkey = xmlData.find('EventKey').textclass Msg(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').textclass TextMsg(Msg): def __init__(self, xmlData): Msg.__init__(self, xmlData) self.Content = xmlData.find('Content').text.encode("utf-8")class ImageMsg(Msg): def __init__(self, xmlData): Msg.__init__(self, xmlData) self.PicUrl = xmlData.find('PicUrl').text self.MediaId = xmlData.find('MediaId').textclass LocationMsg(Msg): def __init__(self, xmlData): Msg.__init__(self, xmlData) self.Location_X = xmlData.find('Location_X').text self.Location_Y = xmlData.find('Location_Y').textclass EventMsg(Msg): def __init__(self, xmlData): Event.__init__(self, xmlData) self.Event = xmlData.find('Event').text
新聞熱點
疑難解答