在使用python一步一步搭建微信公众平台(二)中最后咱们留下了一个问题,就是单引号的content在render到xml中时,返回给用户的信息会被转码,如‘<>&’会被转为<>&用户在收到有<>&等内容的时候都会转,很是难看,我查找了一些网页,几乎都是问若是将特殊符号转为转义,而没有说怎么转回来,最后看到说这个转码是由于在<![CDATA[]]> 在CDATA中的内容就是为了不发生这种因为特殊符号引发的问题,那么咱们能够把render的内容不要放在这个CDATA中,那么以前的reply_text.xml就改成php
$def with (toUser,fromUser,createTime,content) <xml> <ToUserName><![CDATA[$toUser]]></ToUserName> <FromUserName><![CDATA[$fromUser]]></FromUserName> <CreateTime>$createTime</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content>$content</Content> </xml>
这样之后特殊字符就是原样的输出了python
好了,接着此次的内容,此次我想添加一个当用户关注后自动回复一个欢迎信息与用户回复一个'm’后随机的选一首歌给用户听。mysql
1. 关于“事件推送”的概念,事件推送是用户的一些操做,若是关注你,取消关注你,点击自定义等操做,如今微信支持subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件)事件推送的post数据XML为sql
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[EVENT]]></Event> <EventKey><![CDATA[EVENTKEY]]></EventKey> </xml>
其MsgType为event,Event为subscribe(订阅)、unsubscribe(取消订阅)、CLICK,那么咱们就能够经过先判断MsgType,而后再取得Event内容微信
if mstype == "event": mscontent = xml.find("Event").text if mscontent == "subscribe": replayText = u'''欢迎关注本微信,这个微信是本人业余爱好所创建,也是想一边学习Python一边玩的东西,如今尚未什么功能,只是弄了个翻译与豆瓣图书查询的小工具,大家有什么好的文章也欢迎反馈给我,我会不按期的分享给你们,输入help查看操做指令''' return self.render.reply_text(fromUser,toUser,int(time.time()),replayText) if mscontent == "unsubscribe": replayText = u'我如今功能还很简单,知道知足不了您的需求,可是我会慢慢改进,欢迎您之后再来' return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
将上面的代码放在weixinInterface.py的def POST(self)中,注意缩进微信公众平台
这样,当一个新的用户关注你后,这个微信公众帐号将会自动回复你代码里写的replayTextdom
2.既然咱们在自动回复中提到了输入help来查看帮助内容,那么咱们就接着写当用户输入help后返回的内容,这里就扯到另一个概念,“关键字”回复,若是不是在开发者模式,公共帐号能够自已定义的关键词有限,关键词就是用户输入了某些特别的词,至关于操做指令,微信会根据这些关键词返回的相应的内容。可是在开发者模式下,开发者几乎能够定义无限个,看你代码里怎么写了。同时,当用户发送help指令时,其MsgType为’text’,工具
if mstype == 'text': content=xml.find("Content").text if content == 'help': replayText = u'''1.输入中文或者英文返回对应的英中翻译\n2.输入 book 要查询的书名 返回豆瓣图书中结果\n3.输入cls清除查询记录\n4.输入m随机来首音乐听,建议在wifi下听\n5.输入python 进入python经常使用模块用法查询(未完成)''' return self.render.reply_text(fromUser,toUser,int(time.time()),replayText)
能过上面的两个例子已经基本上理解微信的回复走的两步,先判断消息类型(MsgType),以后再取消息内容,而后再根据内容来设定特定的回复内容,这样咱们就能够创建无限多“关键词”,仍是比较简单的。post
3.个人help指令中有提到输入m 来随机听一首音乐,那么咱们接下来搞一搞。学习
微信的回复消息有如下几种,回复文本消息 ;回复音乐消息 ;回复图文消息 其实只要按照官方的文档写xml,也挺简单的,音乐消息的xml为,咱们根据官方文档,新建一个reply_music.xml,写入
$def with (toUser,fromUser,createTime,musicTitle,musicDes,musicURL)<xml> <ToUserName><![CDATA[$toUser]]></ToUserName> <FromUserName><![CDATA[$fromUser]]></FromUserName> <CreateTime>$createTime</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[$musicTitle]]></Title> <Description><![CDATA[$musicDes]]></Description> <MusicUrl><![CDATA[$musicURL]]></MusicUrl> <HQMusicUrl><![CDATA[$musicURL]]></HQMusicUrl> </Music> <FuncFlag>0</FuncFlag></xml>
基中只要肯定MusicUrl最重要,因此接下来,你须要四处搜索音乐文件,但这里建议你用自已的云存储,由于网上的音乐连接要么防盗链,要么过段时间就失效了,很影响用户体验,这里推荐使用百度的云存储BCS,具体的不在这写了,读者能够自已到上面查一查,咱们只是将喜欢的音乐放到上面去,而后获得音乐的url便可,bcs注意不要设置为私有,要么微信也读不出来,这里我上传了12首,我是创建了一个以音乐url,歌名,描述为列表的列表musicList = [[url,name,des],[url,name,des],[url,name,des]]
而后引用random模块,使用random.choice() 随机取列表里的一个项返回给用户
这样当用户输入m 后将随机挑选一首歌返回给用户
4. 回复中还有一个是图文回复,后面的教程我想经过搭建一个豆瓣图书的查询工具来利用这个图文回复xml
回顾以前的文章
使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具